單一指令即可將目前資料庫所有資料表擁有者改為 dbo:
EXEC sp_msforeachtable 'sp_changeobjectowner ''?'', ''dbo''';
使用游標逐一處理,忽略錯誤訊息繼續執行:
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;
建立 Changename 程序供重複呼叫:
CREATE PROCEDURE Changename @oldowner SYSNAME, @newowner SYSNAME
AS
DECLARE @objname SYSNAME, @sql NVARCHAR(4000);
DECLARE cur CURSOR FOR
SELECT '[' + USER_NAME(uid) + '].[' + name + ']'
FROM sysobjects
WHERE xtype IN ('U','V','P','TR','FN','IF','TF') AND USER_NAME(uid) = @oldowner;
OPEN cur;
FETCH NEXT FROM cur INTO @objname;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'EXEC sp_changeobjectowner ''' + @objname + ''', ''' + @newowner + '''';
EXEC(@sql);
FETCH NEXT FROM cur INTO @objname;
END
CLOSE cur; DEALLOCATE cur;
呼叫方式:EXEC Changename '原擁有者', 'dbo'。
EXEC sp_changeobjectowner 'dataname.資料表名', 'dbo';
sa 或 db_owner 角色執行。ALTER AUTHORIZATION 語法,sp_changeobjectowner 已標記為未來版本移除。