gpt4 book ai didi

sql - EXECUTE AS OWNER 的存储过程是否可以有效替代从第三个模式表中选择的 View ?

转载 作者:行者123 更新时间:2023-12-04 13:06:22 24 4
gpt4 key购买 nike

数据库用户 一个 应该只能访问特定数据。
此数据目前由 View 提供B.VIEW1 从架构拥有的表中选择 C .

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

C.VIEW1 不属于 , Ownership Chains申请。

这意味着虽然 一个 被授予 SELECT 权限 ON B.VIEW1 ,它不能从中选择。
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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com