SQL Server - 如何授予 SELECT 权限以访问来自不同所有者的架构中的数据?

Eme*_* JS 6 sql-server sql-server-2012

我需要帮助来处理我的数据库中的权限问题。

这是场景:

1 数据库

4 架构

  • 架构A ; 所有者dbo
  • 架构B;所有者所有者X
  • 架构C ; 所有者所有者X
  • 架构D ; 所有者所有者X

schemaD 中,我有一个名为viewABC的视图,它从在schemaAschemaB 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 权限的情况下解决此问题

Eme*_* JS 7

根据 Dan Guzman 在您的回答中给我的建议之一,在阅读了这个问题后,我找到了解决我的问题的方法

显然,在所描述的场景中,没有办法在viewABC SELECT中授予userX权限而不授予 tableA 的 SELECT 权限

我找到的解决方案如下:

  • schemaD我创建了一个表值函数,它返回相同的viewABC记录集- 尽管ownerX不是schemaA的所有者,SELECTtableA有权限

  • 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)