Sql-Server
跨數據庫權限連結是否適用於 sa/dbo 擁有的對象?
我有兩個數據庫,都歸
sa
. 兩個數據庫中的所有對像都在 schema 中dbo
。我有一個使用者需要從連接表的視圖中進行
bob
選擇和。我不想授予對 中的這些表的直接權限,因為它們包含我不想看到的列。dbSafe``dbSafe``dbRestricted``bob``dbRestricted``bob
我已授予
bob
SELECT
視圖和SET DB_CHAINING ON
兩個數據庫的權限,但仍然出現錯誤:伺服器主體“bob”無法在目前安全上下文下訪問數據庫“dbRestricted”。
我是否誤解了跨數據庫連結的作用?
如果源數據庫中的源對象和目標數據庫中的目標對象屬於同一個登錄帳戶,則 SQL Server 不會檢查目標對象的權限。
數據庫連結可以在這種情況下使用數據庫所有者
sa
和架構dbo
嗎?還是必須是顯式登錄帳戶/非預設模式?這個問題的公認答案建議在 中創建一個視圖
dbRestricted
並分配直接權限bob
,在這種情況下可以嗎?如果我無法選擇向該數據庫添加視圖(由於開發人員/供應商的限制),該怎麼辦?這不是跨數據庫連結的目的嗎?
您需要為 bob in 創建一個使用者
dbRestricted
。您無需授予 bob 對dbRestricted
.這個最低限度完整的可驗證範例顯示了這一點:
USE master; CREATE DATABASE db_a; ALTER DATABASE db_a SET DB_CHAINING ON; CREATE DATABASE db_b; ALTER DATABASE db_b SET DB_CHAINING ON; CREATE LOGIN db_a_login WITH PASSWORD = 'aasdfasdfasdf78723%'; GO USE db_a; CREATE TABLE dbo.t ( someval varchar(10) NOT NULL ); INSERT INTO dbo.t (someval) VALUES ('db_a'); CREATE USER db_a_login FOR LOGIN db_a_login; USE db_b; CREATE TABLE dbo.t ( someval varchar(10) NOT NULL ); INSERT INTO dbo.t (someval) VALUES ('db_b'); CREATE USER db_a_login FOR LOGIN db_a_login; USE db_a; GO CREATE VIEW dbo.both_t AS SELECT * FROM db_a.dbo.t UNION ALL SELECT * FROM db_b.dbo.t; GO GRANT SELECT ON dbo.both_t TO db_a_login; GRANT SELECT ON dbo.t TO db_a_login; GO EXECUTE AS LOGIN = 'db_a_login'; SELECT * FROM dbo.both_t; REVERT
╔═════════╗ ║一些║ ╠═════════╣ ║ db_a ║ ║ db_b ║ ╚═════════╝
如果我們刪除 cross-database-ownership-chaining,我們會看到失敗:
ALTER DATABASE db_a SET DB_CHAINING OFF; ALTER DATABASE db_b SET DB_CHAINING OFF; EXECUTE AS LOGIN = 'db_a_login'; SELECT * FROM dbo.both_t; REVERT
消息 229,級別 14,狀態 5,第 50 行
對象“t”、數據庫“db_b”、模式“dbo”的 SELECT 權限被拒絕。
之後使用它進行清理:
USE master; IF EXISTS (SELECT 1 FROM sys.databases d WHERE d.name = 'db_a') DROP DATABASE db_a; IF EXISTS (SELECT 1 FROM sys.databases d WHERE d.name = 'db_b') DROP DATABASE db_b; IF EXISTS (SELECT 1 FROM sys.server_principals sp WHERE sp.name = 'db_a_login') DROP LOGIN db_a_login; GO