我附加了一個資料庫並嘗試將所有者更改為有效的登入名稱。
我使用了語句:ALTER AUTHORIZATION ON database::my_db_name TO“sa”。資料庫屬性顯示新擁有者是“sa”,但是我仍然收到不受限制的 CLR 組件(0x80FC80F1、0x8013150A)的權限錯誤,這與組件信任問題有關。
我透過使用以下語句解決了這個問題: EXEC sp_changedbowner 'sa';更改資料庫擁有者。
我的問題是,這兩種更改資料庫擁有者的方法有什麼區別。它們相等嗎?對我來說,很明顯 sp_changedbowner 正在做一些更/正確的事情,而 alterauthorization 語句沒有做。
如果您有興趣...在使用 sp_changedbowner 修復問題之前,我嘗試過:
- 將資料庫的可信任屬性設為ON;事實上,我這樣做過幾次;我知道需要運行不受限制、未簽名的自訂 CLR 程序集
- 將每個 CLR 組件的擁有者變更為 dbo,因為所有者是空白的,但顯然 dbo 已經是所有者,並且它在 SSMS 中始終為空白。
- 將每個 CLR 組件的擁有者變更為其他內容,但這不起作用,因為具有依賴組件的組件似乎總是需要相同的擁有者;但不可能透過提供的介面同時更改兩者的所有者。
- 調用 GRANT UNSAFE ASSEMBLY 到 [sa];顯然,您無法向該內建帳戶以及其他一些帳戶授予權限;他們已經獲得許可
- 呼叫 GRANT UNSAFE ASSEMBLY to [NT AUTHORITY\NETWORK SERVICE] (程式集中的帳戶呼叫方法);沒有錯誤,但似乎沒有實現任何目標(也許更改了錯誤號碼?但訊息從未改變)。
- ……可能還有一些我不記得的事。
答案1
在您的清單中,我沒有看到將資料庫設定為值得信賴的,因此我假設您忘記了此步驟:
ALTER DATABASE my_db_name SET TRUSTWORTHY ON;
但也許不是...
檢查這篇文章:http://support.microsoft.com/kb/918040看來他們確實建議使用 sp_changedbowner 而不是 ALTER AUTHORIZATION。但事實是,它執行完全相同的操作(sp_changedbowner 在幕後呼叫 ALTER AUTHORIZATION)。不同之處在於,它還刪除了 dbo 用戶的「別名」(無論如何已棄用的功能)並強制設定資料庫檢查點。最後一件作品可能就是您正在尋找的作品。
答案2
我相信ALTER_AUTHORIZATION
並且sp_changedbowner
都可以更改資料庫物件的所有權。當然,這些命令之間的差異在於ALTER_AUTHORIZATION
可以更改其他內容(例如表的所有權),而sp_changedbowner
僅用於更改資料庫的擁有者。
不過,您指出的行為聽起來很奇怪。你能複製它嗎?