由我见过的各种模式相关的问题的启发......SQL Server:如何权限模式?
Ownership chaining允许我授予对存储过程来执行不明确权限在我使用表,如果两个存储过程和表是在同一个模式。
如果我们使用单独的模式,那么我必须在不同模式表上明确地GRANT XXX。所有权链接示例表明。这意味着存储的proc执行用户可以直接读/写你的表。
这就像直接访问类中的实例变量,绕过getter/setters,破坏封装。
我们还使用行级安全来限制某人看到的内容,并将其应用于存储过程。
那么,我们如何维护模式分离并防止直接表访问呢?
当然,如果您使用ORM或不使用存储的特效,问题将不适用。但我不问如果我应该使用的情况下,任何人都觉得需要赐教一个ORM或存储过程...
编辑,例如
CREATE USER OwnsMultiSchema WITHOUT LOGIN
GO
CREATE SCHEMA MultiSchema1 AUTHORIZATION OwnsMultiSchema
GO
CREATE SCHEMA MultiSchema2 AUTHORIZATION OwnsMultiSchema
GO
CREATE USER OwnsOtherSchema WITHOUT LOGIN
GO
CREATE SCHEMA OtherSchema AUTHORIZATION OwnsOtherSchema
GO
CREATE TABLE MultiSchema1.T1 (foo int)
GO
CREATE TABLE MultiSchema2.T2 (foo int)
GO
CREATE TABLE OtherSchema.TA (foo int)
GO
CREATE PROC MultiSchema1.P1
AS
SELECT * FROM MultiSchema1.T1
SELECT * FROM MultiSchema2.T2
SELECT * FROM OtherSchema.TA
Go
EXEC AS USER = 'OwnsMultiSchema'
GO
--gives error on OtherSchema
EXEC MultiSchema1.P1
GO
REVERT
GO
CREATE PROC OtherSchema.PA
AS
SELECT * FROM MultiSchema1.T1
SELECT * FROM MultiSchema2.T2
SELECT * FROM OtherSchema.TA
Go
GRANT EXEC ON OtherSchema.PA TO OwnsMultiSchema
GO
EXEC AS USER = 'OwnsMultiSchema'
GO
--works
EXEC OtherSchema.PA
GO
REVERT
GO
编辑2:
- 我们不使用“跨数据库所有权链接”
- 行级安全性是一个红色的鲱鱼和无关紧要的:我们不使用它无处不在
为了清晰起见,您可以提供一个单独架构场景的代码示例吗?在你的场景中,两个独立的模式是否有相同的所有者? – 2010-02-06 06:52:48
为什么投票关闭serverfault?这是代码猴子,而不是系统管理员... – gbn 2010-02-06 07:35:26
@John Sansom:是的,我会的。 – gbn 2010-02-06 07:35:56