方法一:單一資料表變更
EXEC sp_changeobjectowner 'tablename', 'dbo';
方法二:批次變更指定舊擁有者的所有物件
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
@OldOwner NVARCHAR(128),
@NewOwner NVARCHAR(128)
AS
BEGIN
DECLARE @Name NVARCHAR(128), @Owner NVARCHAR(128), @OwnerName NVARCHAR(128);
DECLARE cur CURSOR FOR
SELECT name, USER_NAME(uid)
FROM sysobjects
WHERE USER_NAME(uid) = @OldOwner
ORDER BY name;
OPEN cur;
FETCH NEXT FROM cur INTO @Name, @Owner;
WHILE @@FETCH_STATUS = 0 BEGIN
IF @Owner = @OldOwner BEGIN
SET @OwnerName = @OldOwner + '.' + RTRIM(@Name);
EXEC sp_changeobjectowner @OwnerName, @NewOwner;
END
FETCH NEXT FROM cur INTO @Name, @Owner;
END
CLOSE cur;
DEALLOCATE cur;
END
GO
使用範例
-- 將 old_user 擁有的所有物件改為 dbo
EXEC User_ChangeObjectOwnerBatch 'old_user', 'dbo';
說明
sp_changeobjectowner 僅支援資料表、檢視、預存程序等結構描述物件。
- 批次程序透過
sysobjects 系統表枚舉,適用於大量物件遷移擁有者(如開發環境轉正式環境)。
- 執行前請備份資料庫,並確認新擁有者帳號存在。