數據庫“所有者”的目的是什麼?
今天在解決服務代理問題時,我發現數據庫所有者是一名離職員工的 Windows 登錄名。他的登錄名已被刪除,因此查詢通知失敗。
據說處理這個問題的最佳實踐是讓“sa”成為數據庫所有者。我們更改了它並清除了隊列。
我的(非常基本的)問題:什麼是數據庫所有者,它的目的是什麼?
一方面的“dbo”(使用者)和“db_owner”(固定角色)的數據庫概念與另一側的“數據庫所有者”的實例概念之間存在一些混淆。“dbo”和“db_owner”通常被稱為“數據庫所有者”。在您所問的內容中,您正在談論數據庫所有者作為擁有數據庫的伺服器主體。
理論是這樣的:任何可以被授予權限的東西都是“安全的”。所有有價證券都有一個所有者。擔保物的所有者對擔保物擁有絕對的控制權,並且不能被剝奪任何特權。實例級安全對象由伺服器主體(登錄)擁有。數據庫級安全對象由數據庫主體(使用者)擁有。主要有兩種形式:主要(身份)和次要(成員)。預設情況下,伺服器級別的安全對象歸目前記錄的主伺服器主體所有。預設情況下,數據庫級別的安全對象由目前數據庫主體擁有,但預設情況下由架構所有者擁有的架構綁定對象除外。所有安全對像在創建時都支持 AUTHORIZATION 子句以強制執行不同的所有者。
ALTER AUTHORIZATION
以後可以用來更改任何安全對象的所有者。由於數據庫是伺服器級別的安全數據庫,因此預設情況下,它將由發出 CREATE DATABASE 語句的主要主體擁有。IE。離職員工的 NT 登錄。
因此,您的問題實際上是“為什麼安全對象需要所有者? ”。因為所有者是信任的根源。授予、拒絕和撤銷對象權限的是所有者。可以設計一個沒有安全資產所有者的安全系統嗎?可能是的,但必須有某種機制來取代目前模型中所有者所扮演的角色。例如,考慮爸爸安全對像沒有所有者(例如,原始創建者只是被授予對它的控制權,而不是擁有安全對象),它可能會創建一個安全對象並撤銷對所有人的訪問權限,包括他自己。業主的要求規避了這個問題,因為業主不能把自己鎖在外面。
創建原始 NT 登錄擁有的安全(數據庫)的 CREATE DATABASE 的鮮為人知的副作用之前已經燒毀了很多。每個安全對象的規則都是相同的,但有些因素會加劇 DATABASE 所有者的問題:
- 其他伺服器級別的安全對象(端點、伺服器角色、登錄)很少使用、移動等。
- 數據庫級安全對象通常最終歸
dbo
(數據庫主體)或其他數據庫主體所有,因此所有者包含在數據庫中- 將數據庫所有權預設設置為 NT 主要主體會產生遏制問題(所有者是由 AD 管理的 NT SID,並且不與數據庫文件一起旅行,NT 帳戶可能會被豎起等)
- 最重要的事情:數據庫所有者俱有重要的副作用,特別是
EXECUTE AS context
. 後一個問題是大多數使用者的痛點。由於 Service Broker 廣泛使用 EXECUTE AS(消息傳遞具有隱式的 EXECUTE AS 上下文,以及具有顯式上下文的隊列啟動),通常是 Service Broker 使用者首先發現此問題。順便說一句,感謝調查和解決您的原始問題 :)