8

数据库用户A应该只能访问特定数据。此数据当前由视图B.VIEW1提供,该视图从模式BC拥有的表中进行选择。

CREATE VIEW [B].[VIEW1] AS SELECT * FROM [B].[VIEW2], [C].[VIEW1]

由于C.VIEW1不属于B,因此所有权链适用。

这意味着尽管A被授予B.VIEW1上的SELECT权限,但它无法从中进行选择。

SELECT permission denied on object 'C.VIEW1', database '...', schema '...'.

在安全性方面,带有EXECUTE AS OWNER 子句的存储过程B.PROC1是B.VIEW1的有效替代品吗?

CREATE PROC [B.PROC1] WITH EXECUTE AS OWNER AS BEGIN SELECT * FROM [B.VIEW2], [C].[VIEW1] END

或者是否有任何可能导致任何安全问题的负面副作用?

4

1 回答 1

3

在安全性方面,这似乎是防止访问底层表的好方法。

一个负面影响是您无法通过 WHERE、GROUP BY 子句或类似子句过滤存储过程生成的结果集。

但是,如果在底层视图中定义静态约束或通过存储的 proc 的输入参数定义“动态”约束,这并不是那么悲惨。

1) 底层视图中的静态约束

CREATE VIEW [B].[VIEW3] AS SELECT * FROM [B].[VIEW2], [C].[VIEW1] WHERE [X]='Something' AND [Y] = GETDATE()
CREATE PROC [B].[PROC1] WITH EXECUTE AS OWNER AS BEGIN SELECT * FROM [B].[VIEW3] END

2) 通过输入参数进行动态约束

CREATE PROC [B].[PROC1] (@X varchar(30), @Y DATETIME) WITH EXECUTE AS OWNER AS BEGIN SELECT * FROM [B].[VIEW2], [C].[VIEW1] WHERE [X]=@X AND [Y]=@Y AND
于 2013-08-09T16:14:28.653 回答