資料庫遷移、合併、權限整理時,非 dbo 擁有的物件(資料表、檢視、程序、函數)導致權限鏈斷裂、程式碼需加結構描述前綴、維護困難。批次轉移擁有者至 dbo 可統一管理。
-- 允許系統目錄更新(舊版需求,新版已移除此選項)
EXEC sp_configure 'allow updates', 1
RECONFIGURE WITH OVERRIDE
-- 批次更新 sysobjects uid 為 1 (dbo)
UPDATE sysobjects SET uid = 1 WHERE uid <> 1
-- 還原設定
EXEC sp_configure 'allow updates', 0
RECONFIGURE WITH OVERRIDE
不建議直接更新系統表(已不可直接修改)。改用 ALTER AUTHORIZATION 或 ALTER SCHEMA ... TRANSFER:
-- 單一物件
ALTER AUTHORIZATION ON OBJECT::SchemaName.TableName TO dbo
-- 批次產生指令
SELECT 'ALTER AUTHORIZATION ON OBJECT::' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name) + ' TO dbo;'
FROM sys.objects
WHERE principal_id <> 1 -- 非 dbo 擁有
AND type IN ('U','V','P','FN','IF','TF','TR')
-- 將非 dbo 結構描述下的所有物件移至 dbo
DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql += N'ALTER SCHEMA dbo TRANSFER ' + QUOTENAME(SCHEMA_NAME(schema_id)) + N'.' + QUOTENAME(name) + N';'
FROM sys.objects
WHERE SCHEMA_NAME(schema_id) <> 'dbo'
AND type IN ('U','V','P','FN','IF','TF','TR')
EXEC sp_executesql @sql
| 代碼 | 類型 | 說明 |
|---|---|---|
| U | USER_TABLE | 使用者資料表 |
| V | VIEW | 檢視表 |
| P | PROCEDURE | 儲存程序 |
| FN | SQL_SCALAR_FUNCTION | 純量函數 |
| IF | SQL_INLINE_TABLE_VALUED_FUNCTION | 內嵌表值函數 |
| TF | SQL_TABLE_VALUED_FUNCTION | 多陳述式表值函數 |
| TR | TRIGGER | 觸發器 |
UserA.Table)sys.sql_expression_dependenciesSELECT SCHEMA_NAME(schema_id) AS SchemaName, name, type_desc
FROM sys.objects
WHERE SCHEMA_NAME(schema_id) <> 'dbo'
ORDER BY SchemaName, name
結果為空表示全數轉移完成。