数据库用户 应该只能访问特定数据。
该数据当前由 View B.VIEW1 提供,该 View 从架构 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
还是有可能导致任何安全问题的负面影响?
最佳答案
在安全性方面,这似乎是good way,以防止访问基础表。
不利的一面是,您不能使用WHERE,GROUP BY子句或类似方法过滤存储过程生成的结果集。
但是,如果在基础 View 中定义静态约束,这并不是那么悲惨。
或通过stored proc's input parameters定义“动态”约束。
1)基础 View 中的静态约束
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
关于sql - 使用EXECUTE AS OWNER的存储过程是否可以有效替代从第三模式表中选择的 View ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18081697/