資料庫遷移、合併或權限整理時,常需將所有資料表、視圖、預存程序、觸發器、函數的擁有者統一變更為 dbo。本文提供兩種方法:簡易單行指令與完整游標腳本,並說明 sp_changeobjectowner 用法。
EXEC sp_msforeachtable 'sp_changeobjectowner ''?'', ''dbo''';
sp_msforeachtable 為未文件化預存程序,會遍歷目前資料庫所有使用者資料表執行指定命令,? 代表資料表名稱。
DECLARE tb CURSOR LOCAL FOR
SELECT 'sp_changeobjectowner ''[' + REPLACE(USER_NAME(uid), ']', ']]') + '].[' + REPLACE(name, ']', ']]') + ']'', ''dbo'''
FROM sysobjects
WHERE xtype IN ('U','V','P','TR','FN','IF','TF') AND status >= 0;
OPEN tb;
DECLARE @s NVARCHAR(4000);
FETCH tb INTO @s;
WHILE @@FETCH_STATUS = 0 BEGIN
EXEC(@s);
FETCH tb INTO @s;
END
CLOSE tb;
DEALLOCATE tb;
GO
說明:
xtype 對照:U=資料表、V=視圖、P=預存程序、TR=觸發器、FN=標量函數、IF=內嵌資料表值函數、TF=多陳述式資料表值函數。REPLACE(..., ']', ']]') 處理物件名稱中含有右括號的情況,防止動態 SQL 語法錯誤。-- 單一物件
EXEC sp_changeobjectowner 'schema.tablename', 'dbo';
-- 以 sa 登入查詢分析器,選中目標資料庫後執行
EXEC sp_changeobjectowner '原擁有者.物件名', 'dbo';
-- 或反向變更
EXEC sp_changeobjectowner 'dbo.物件名', '新擁有者';
適用版本: SQL Server 2000/2005/2008/2008 R2。SQL Server 2012+ 建議改用 ALTER AUTHORIZATION 或 ALTER SCHEMA ... TRANSFER 標準語法。