首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 批次修改所有物件擁有者為 dbo 指令集

     編輯:關於SqlServer

快速修改所有使用者資料表

單一指令即可將目前資料庫所有資料表擁有者改為 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 角色執行。
  • 執行前請備份資料庫,修改擁有者可能影響現有權限設定與應用程式連線字串。
  • SQL Server 2005+ 建議改用 ALTER AUTHORIZATION 語法,sp_changeobjectowner 已標記為未來版本移除。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved