Security

視圖中包含的使用者 - 選擇對象“table1”、數據庫“Database1”、模式“test”的權限被拒絕

  • February 22, 2021

例如,我在 Azure SQL Server 12.0.2000.8 上有一個名為“Database1”的數據庫,我需要設置一個只能訪問數據庫中視圖的帳戶(例如 View1)。這是通過以下方式實現的:

CREATE USER [testuser] WITH PASSWORD 'P@ssword1!'
GO
GRANT SELECT ON [dbo].[View1] to [testuser]
GO

這非常有效。我能夠連接到數據庫並且只看到視圖而不是相關表。

然後,我的同事利用這種方法創建了具有其他視圖讀取權限的其他使用者帳戶。

最近,使用者帳戶無法訪問具有以下錯誤消息的視圖。

“選擇對象’table1’,數據庫’Database1’,模式’test’的權限被拒絕”

我已經檢查過這些帳戶沒有拒絕權限。如果我在指定的表 (table1) 上授予選擇權限,問題就解決了,但是這使使用者帳戶能夠查看我想避免的表內容。

對此進行故障排除的任何幫助將不勝感激。

對視圖的 SELECT 權限不會授予對引用表的 SELECT 權限。相反*,如果*視圖和表具有相同的所有者,則它們之間存在“所有權鏈”,並且不會檢查表的權限。

因此,請確保視圖和表具有相同的所有者。

預設情況下,對象歸其架構的所有者所有。可以(但不明智)更改單個對象的所有權。無論如何,您可以像這樣列出對象及其所有者:

select o.name, type_desc, user_name(coalesce(o.principal_id,s.principal_id)) owner
from sys.objects o
join sys.schemas s
 on o.schema_id = s.schema_id
where o.is_ms_shipped = 0
 and type_desc in ('USER_TABLE','VIEW')
order by type_desc, name

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