使用“EXECUTE AS OWNER”的存储过程是否能有效替代从第三方模式的表中选择的视图?

8

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

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

由于C.VIEW1不归B所有,所以所有权链适用。
这意味着尽管A被授予对B.VIEW1SELECT权限,但它无法从中选择。
SELECT permission denied on object 'C.VIEW1', database '...', schema '...'.

在安全方面,具有EXECUTE AS OWNER Clause的存储过程B.PROC1是否可以有效替代B.VIEW1

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

还是说会有任何负面影响,可能会导致安全问题?


1个回答

3
在安全方面,这似乎是一种防止访问底层表的好方法
一个负面影响是,您无法通过WHERE、GROUP BY或类似的方式过滤存储过程生成的结果集。
但如果在底层视图中定义静态约束或通过存储过程的输入参数定义“动态”约束,这并不是那么可怕。
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接