具有EXECUTE AS OWNER的存储过程是从第三个模式表中选择的视图的有效替换吗?

时间:2013-08-06 13:31:15

标签: sql sql-server stored-procedures permissions ownership

数据库用户 A 应该只能访问特定数据。 此数据目前由视图 B.VIEW1 提供,该视图选自架构 B C 所拥有的表。

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

由于 C.VIEW1 不归 B 所有,Ownership Chains适用。

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

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

存储过程 B.PROC1 EXECUTE AS OWNER Clause是安全性 B.VIEW1 的有效替代品吗?

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

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

1 个答案:

答案 0 :(得分:2)

就安全性而言,这似乎是good way以防止访问基础表。

负面的副作用是您无法通过WHERE,GROUP BY子句或类似方法过滤存储过程生成的结果集。

但是如果在底层视图中定义静态约束,那就不是那么悲惨了 或通过stored proc's input parameters定义“动态”约束。

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