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

SQL Server 一鍵將所有物件擁有者變更為 dbo:sp_msforeachtable 與游標法

     編輯:關於SqlServer

資料庫遷移、合併或權限整理時,常需將所有資料表、視圖、預存程序、觸發器、函數的擁有者統一變更為 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 語法錯誤。
  • 執行過程可能出現錯誤訊息(如系統物件無法變更),可忽略繼續。

替代寫法:使用 sp_changeobjectowner 逐一指定

-- 單一物件
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 標準語法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved