天天看點

SQL Server修改資料庫對象所有者(Owner)淺析

在sql

server資料庫中如何修改資料庫對象(表、視圖、存儲過程..)的所有者(owner)呢?一般我們可以使用系統提供的系統存儲過程

sp_changeobjectowner來修改。 我們先看看sp_changeobjectowner在msdn的文檔介紹吧

如上msdn文檔所描述的,系統存儲過程的使用非常簡單,如下所示

SQL Server修改資料庫對象所有者(Owner)淺析

<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';

SQL Server修改資料庫對象所有者(Owner)淺析

如果存在對應表的同義詞,那麼使用系統存儲過程sp_changeobjectowner修改對象的所有者是會報錯的。

SQL Server修改資料庫對象所有者(Owner)淺析

sp_changeobjectowner這個系統存儲過程的定義如下所示:

<b>其他方式修改資料庫對象的所有者</b>

    使用alter schema修改資料庫對象的所有者。如下所示:

    alter schema dbo transfer db_owner.t1;

    go