数据库用户 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
或者是否存在可能导致任何安全问题的负面副作用?
答案 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