Eme*_* JS 6 sql-server sql-server-2012
我需要帮助来处理我的数据库中的权限问题。
这是场景:
1 数据库
4 架构:
在schemaD 中,我有一个名为viewABC的视图,它从在schemaA、schemaB e schemaC上分配的表和视图中获取信息。
用户用户X拥有SELECT权限viewABC。
使用以下命令我授予权限:
GRANT SELECT ON schemaD.viewABC TO userX;
Run Code Online (Sandbox Code Playgroud)
当userX尝试SELECT对视图执行 a时,可以这样:
SELECT * FROM schemaD.viewABC;
Run Code Online (Sandbox Code Playgroud)
我们得到错误:
对象“tableA”、数据库“MyDatabase”、架构“schemaA”的 SELECT 权限被拒绝。
我确实理解发生错误是因为tableA位于不同的架构上,具有不同的所有者(dbo 而不是 ownerX),并且 SQLServer 应用 userX权限来授予或拒绝访问权限。一旦userX 没有对 tableA的显式访问权限,查询执行就会返回错误。
如何在不为 userX 授予 tableA SELECT 权限的情况下解决此问题?
根据 Dan Guzman 在您的回答中给我的建议之一,在阅读了这个问题后,我找到了解决我的问题的方法。
显然,在所描述的场景中,没有办法在viewABC SELECT中授予userX权限而不授予 tableA 的 SELECT 权限。
我找到的解决方案如下:
在schemaD我创建了一个表值函数,它返回相同的viewABC记录集- 尽管ownerX不是schemaA的所有者,但他SELECT对tableA有权限
该EXECUTE AS 子句用于保证函数的任何执行都将使用ownerX 权限- 在这种情况下,userX 对 tableA的权限无关紧要
以用户X被授予SELECT 的权限在创建功能-不EXECUTE同意,因为函数返回一个表
的表值函数的示例代码:
CREATE FUNCTION schemaD.udfABC ()
RETURNS @tabABC TABLE (
fieldA INT NOT NULL, fieldB INT NOT NULL, fieldC INT NOT NULL
)
WITH EXECUTE AS OWNER
AS
BEGIN
INSERT INTO @tabABC (fieldA, fieldB, fieldC)
SELECT a.fieldA, b.fieldB, c.fieldC
FROM schemaA.tableA a
INNER JOIN schemaB.tableB b ON a.id = b.idA
INNER JOIN schemaC.tableC c ON b.id = c.idB;
RETURN;
END
Run Code Online (Sandbox Code Playgroud)
授予SELECT权限:
GRANT SELECT ON schemaD.udfABC TO userX;
Run Code Online (Sandbox Code Playgroud)
现在userX可以使用这个命令来获取数据:
SELECT * FROM schemaD.udfABC();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
94595 次 |
| 最近记录: |