跨同一数据库内的多个架构选择权限

Tim*_*Tim 5 sql-server permissions sql-server-2008-r2 view owner

客户要求我实施一些用于报告目的的视图,这些视图将通过 PowerBI、Excel 和 SSRS 访问。指定的用户将只能访问该视图,并且该用户必须不能使用任何基础表。

我遇到的问题是视图中的 SQL 涉及 3 个不同的模式(都在同一个数据库中):

  • 瞳孔
  • 提供者
  • 安全

观点是:

CREATE VIEW dbo.vTestPermissions
AS
SELECT a.Column1,
       b.Column1,
       c.Column1
FROM Pupil.Table1 a
JOIN Provider.Table2 b ON a.Column1 = b.Column1
JOIN Security.Table3 c ON a.Column1 = c.Column1
Run Code Online (Sandbox Code Playgroud)

表/视图的所有者如下:

  • 瞳孔.Table1 - 所有者瞳孔
  • Provider.Table2 - 所有者提供者
  • Security.Table3 - 所有者安全
  • vTestPermissions - 所有者 dbo

当我从视图中选择时,出现错误:

对象“table3”、数据库“TEST”、架构“Security”的 SELECT 权限被拒绝

我曾尝试在SELECT有和没有GRANT模式和表选项的情况下授予权限,但这使用户可以使用基础表。

对此的任何帮助将不胜感激。

Pau*_*ite 4

如果视图和表都具有相同的所有者,则授予视图的选择权限就足够了。这称为所有权链

当通过链访问对象时,SQL Server 首先将该对象的所有者与调用对象的所有者进行比较。这是链条中的前一个环节。如果两个对象具有相同的所有者,则不会评估所引用对象的权限。

当对象有不同的所有者时,所有权链不起作用。

因此,最简单的答案是更改表的所有权以匹配视图:

ALTER AUTHORIZATION ON Pupil.Table1 TO dbo;
ALTER AUTHORIZATION ON Provider.Table2 TO dbo;
ALTER AUTHORIZATION ON Security.Table3 TO dbo;
Run Code Online (Sandbox Code Playgroud)

在视图上授予选择:

GRANT SELECT ON dbo.vTestPermissions TO USER = 'your_user';
Run Code Online (Sandbox Code Playgroud)

...然后将允许通过所有权链接通过视图进行访问,同时防止直接表访问。

如果这不适合您的需求,我们将需要考虑更复杂的安排。