Sql-Server

在同一數據庫中選擇跨多個模式的權限

  • December 17, 2017

客戶要求我實現一些視圖以用於報告目的,這些視圖將通過 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

表/視圖的所有者如下:

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

當我從視圖中選擇時,出現錯誤:

對象“table3”、數據庫“TEST”、模式“安全”的 SELECT 權限被拒絕

我嘗試在SELECT有和沒有GRANT選項的情況下授予模式和表的權限,但這使得使用者可以使用基礎表。

對此的任何幫助將不勝感激。

如果視圖和表都具有相同的所有者,則授予對視圖的選擇權限就足夠了。這稱為所有權連結

當通過鏈訪問對象時,SQL Server 首先將對象的所有者與呼叫對象的所有者進行比較。這是鏈條中的前一個環節。如果兩個對象具有相同的所有者,則不會評估對所引用對象的權限。

在對象具有不同所有者的情況下,所有權連結不起作用。

因此,最簡單的答案是更改表的所有權以匹配視圖:

ALTER AUTHORIZATION ON Pupil.Table1 TO dbo;
ALTER AUTHORIZATION ON Provider.Table2 TO dbo;
ALTER AUTHORIZATION ON Security.Table3 TO dbo;

授予對視圖的選擇:

GRANT SELECT ON dbo.vTestPermissions TO USER = 'your_user';

…然後將允許通過視圖訪問,通過所有權連結,同時防止直接表訪問。

如果這不適合您的需求,我們將需要考慮更複雜的安排。

引用自:https://dba.stackexchange.com/questions/130993