還原或建立資料庫時,SQL Server 預設將擁有者設為執行者的 Windows 登入。為確保一致性與安全性,建議統一改為 sa 或指定服務帳號。
@map = 'true'(預設):將舊擁有者的別名重新對應至新擁有者。@map = 'false':保留舊擁有者為別名,新擁有者成為實際擁有者。-- 建立測試資料庫
CREATE DATABASE test; GO
USE test; GO
EXEC sp_helpuser; GO -- 觀察初始擁有者
-- 新增兩個登入並加為 dbo 別名
EXEC sp_addlogin @loginame = 'ISUser1', @passwd = 'ISUser1', @defdb = 'master';
EXEC sp_addlogin @loginame = 'ISUser2', @passwd = 'ISUser2', @defdb = 'master';
EXEC sp_addalias @loginame = 'ISUser1', @name_in_db = 'dbo';
-- 改為 sa 擁有,@map=true 將 ISUser1 別名對應給 sa
EXEC sp_changedbowner @loginame = 'sa', @map = 'true';
EXEC sp_helpuser; -- sa 為擁有者,ISUser1 為別名
-- 改為 ISUser2 擁有,@map=false 保留 ISUser1 別名不變
EXEC sp_changedbowner @loginame = 'ISUser2', @map = 'false';
EXEC sp_helpuser; -- ISUser2 為新擁有者,ISUser1 降為別名
-- 清理
USE master; GO
DROP DATABASE test; GO
SQL Server 2000 引入 DBCC INDEXDEFRAG,優於舊版 DBCC DBREINDEX:
| 特性 | INDEXDEFRAG | DBREINDEX |
|---|---|---|
| 線上操作 | ✅ 不鎖定資源,使用者可持續存取 | ❌ 需獨佔鎖定 |
| 進度追蹤 | ✅ 每 5 分鐘回報完成百分比,可中斷續傳 | ❌ 全程鎖定不可中斷 |
| 碎片整理效果 | 重排葉層頁面,邏輯/物理順序一致 | 完全重建索引,效果最徹底 |
| 適用情境 | 大型資料表、7x24 服務、輕度碎片 | 維護時窗、嚴重碎片、需完全重建 |
DBCC INDEXDEFRAG (資料庫名稱, 資料表名稱, 索引名稱);
-- 範例
DBCC INDEXDEFRAG (Northwind, Orders, PK_Orders);
掌握 sp_changedbowner 的 @map 行為與 DBCC INDEXDEFRAG 線上整理特性,能讓資料庫維護更精準、服務更連續,是 DBA 實務工具箱必備技能。