Sql-Server
數據庫角色權限是否優先於架構/對象級別權限?
我對 SQL Server 安全權限有一個有趣的觀察。
我的設置如下。我試圖限制使用者更新特定模式下的表。
問題陳述是為什麼允許使用者通過視圖(不同模式)在表上進行插入,即使插入在視圖定義中的表模式上被明確拒絕?
USE master GO CREATE LOGIN Login1 WITH password = 'Admin@123' GO CREATE DATABASE TestDB GO USE TestDB GO CREATE user Login1 FROM LOGIN Login1 GO CREATE SCHEMA sch1 GO CREATE SCHEMA V GO CREATE TABLE sch1.table1 ( id INT ,name VARCHAR(5) ) GO CREATE VIEW v.view1 AS SELECT * FROM sch1.table1 GO CREATE VIEW sch1.view2 AS SELECT * FROM sch1.table1 GO --User can update all tables ALTER ROLE [db_datawriter] ADD MEMBER [Login1] GO --Except tables under this schema DENY INSERT ON SCHEMA::[sch1] TO [Login1] GO --Open session with Login1 USE TestDB GO --Should not work, does not work. INSERT sch1.table1 SELECT 1, 'A' --The INSERT permission was denied on the object 'table1', database 'TestDB', schema 'sch1'. --Should not work, does not work. INSERT sch1.view2 SELECT 1, 'A' --The INSERT permission was denied on the object 'view2', database 'TestDB', schema 'sch1'. -- Works! - even though write is denied on underlying table? INSERT v.view1 SELECT 1, 'A' --(1 row affected)
根據文件,我希望通過視圖插入也會失敗。
需要對目標表具有 UPDATE、INSERT 或 DELETE 權限,具體取決於正在執行的操作。
但它之所以有效,是因為有一個名為Ownership chaining的概念。官方教程在這裡
當您有權訪問一個對象(在本例中為 v.view1)並且該對象引用具有相同所有者(sch1.table1)的安全對象時,根本不會檢查權限。
由於兩個對像都沒有明確的所有者:
預設情況下,包含架構的對象歸架構所有者所有
和架構所有者可以在這裡找到
SELECT s.name AS schName, dp.name AS ownerUser FROM sys.schemas AS s JOIN sys.database_principals AS dp ON dp.principal_id = s.principal_id WHERE s.name IN (N'v', N'sch1')
您可以通過更改架構v的所有者來打破所有權鏈,如下所示:
ALTER AUTHORIZATION ON SCHEMA::v TO Login1
然後你會得到你期望的拒絕。