2012-10-23 111 views
0
的權限

是否可以授予用戶訪問視圖但限制用戶訪問視圖選擇的表的權限?SQL Server:查看錶

CREATE TABLE [dbo].[tUsers](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [Username] [nvarchar](50) NULL, 
    [Password] [nvarchar](50) NULL, 
    [TenantID] int 
) ON [PRIMARY] 

CREATE VIEW [scmTenant1].[vUsers] 
AS 
SELECT  ID, Username, Password 
FROM   dbo.tUsers 
WHERE  TenantID = 1 

的SQL Server用戶帳戶(usrTenant1)訪問模式scmTenant1但沒有訪問dbo架構。我登錄到SQL Server Management Studio中爲usrTenant1,並嘗試執行此查詢:

SELECT * FROM scmTenant1.vUsers 

給我的錯誤:

The SELECT permission was denied on the object 'tUsers', database 'Sandbox', schema 'dbo'.

如果我授予dbo架構查詢執行罰款此帳戶的訪問。

我想我真的想授予表的查看權限。但我的問題是,你能授予用戶訪問視圖並限制該用戶訪問視圖選擇的基礎表嗎?

回答

2

如果您讓視圖dbo而不是scmTenant的所有者 - 或創建一個相同的中間視圖 - 那麼您可以授予視圖權限而不授予對基礎表的權限。

CREATE VIEW dbo.vUsers_T1 
AS 
SELECT  ID, Username, Password 
FROM   dbo.tUsers 
WHERE  TenantID = 1 

CREATE VIEW [scmTenant1].[vUsers] as 
SELECT * FROM dbo.vUsers_T1 

或者,你可以創建一個返回當前租戶的ID的功能,並創建指的是在DBO視圖。

CREATE VIEW dbo.vUsers 
AS 
SELECT  ID, Username, Password 
FROM   dbo.tUsers 
WHERE  TenantID = dbo.GetCurrentTenant() 
+0

謝謝你的建議,但我不認爲這會在我的環境中工作。我計劃爲我的系統中的每個租戶創建一個Schema和View。如果我將視圖移至dbo,那麼每個租戶的視圖都需要一個唯一的名稱,這會破壞我的代碼。 – jwdenny13

+0

@ jwdenny13請參閱上面的編輯 – podiluska

+0

用SUSER_SID()代替dbo.GetCurrentTenant()並更改了用SID替換TenantID的表。此列有一個默認值SUSER_SID()。非常好,謝謝! – jwdenny13