在sql
server資料庫中如何修改資料庫對象(表、視圖、存儲過程..)的所有者(owner)呢?一般我們可以使用系統提供的系統存儲過程
sp_changeobjectowner來修改。 我們先看看sp_changeobjectowner在msdn的文檔介紹吧
如上msdn文檔所描述的,系統存儲過程的使用非常簡單,如下所示
<b></b>
<b>批量修改資料庫對象的所有者(owner)</b>
執行上面存儲過程過後,表對象t1的所有者(owner)就從db_owner改為了dbo了。如果一個資料庫裡面的表對象非常多,那麼使用該方法就非常的繁瑣了。此時就可以使用sp_msforeachtable來批量處理該工作。
但是使用sp_msforeachtable結合系統存儲過程
sp_changeobjectowner,隻能修改資料庫裡面所有表對象的所有者(owner)。并不能修改視圖、存儲過程、使用者函數的所有者。那麼應
該如何批量修改存儲過程、視圖、使用者自定義函數的所有者呢? 其實也很簡單,自己寫個腳本将所有sql script腳本生成就ok了
網上有個腳本對資料庫所有對象所有者進行批量修改,已經相當全面了,在此就不重複造輪子了。
<b>使用sp_changeobjectowner需要注意的地方</b>
在使用系統函數sp_changeobjectowner時,你都會收到一條提示資訊“注意:
更改對象名的任一部分都可能會破壞腳本和存儲過程。”,這個是因為系統函數sp_changeobjectowner雖然會修改資料庫對象的所有者,但
是,在視圖、存儲過程、使用者自定義函數裡面,如果你使用了owner.object_name這種寫法,系統函數并不能檢測到。是以當資料庫對象修改過
後,就有可能導緻部分視圖、存儲過程出現錯誤,不太明白上面描述的,可以通過下面的例子了解一下。
修改了表t1的所有者後,視圖[db_owner].v_t2、存儲過程prc_test_two都會報錯。 如下截圖所示。這也就是提示資訊“注意: 更改對象名的任一部分都可能會破壞腳本和存儲過程。”所描述的情況。
exec sp_changeobjectowner 'db_owner.t1', 'dbo';
如果存在對應表的同義詞,那麼使用系統存儲過程sp_changeobjectowner修改對象的所有者是會報錯的。
sp_changeobjectowner這個系統存儲過程的定義如下所示:
<b>其他方式修改資料庫對象的所有者</b>
使用alter schema修改資料庫對象的所有者。如下所示:
alter schema dbo transfer db_owner.t1;
go