資料庫維護通常由專業的 DBA 負責,但身為開發人員,有時也需要臨時處理維護工作。掌握幾個實用的 SQL Server 維護技巧,不僅能提升工作效率,甚至可能讓資深 DBA 都眼前一亮。本文將介紹兩個核心技巧:重新指定資料庫擁有者與使用 DBCC INDEXDEFRAG 整理索引碎片。
當您還原或建立新資料庫時,SQL Server 預設會將資料庫擁有者設為您的 NT 登入帳號。為了確保跨資料庫的一致性與安全性,建議統一將擁有者變更為系統管理員。這可以透過系統預存程序 sp_changedbowner 來完成。
sp_changedbowner 有一個重要參數 @map(預設為 NULL),它能控制舊擁有者的別名是否重新映射給新擁有者。以下透過實際範例示範:
-- 建立測試資料庫
CREATE DATABASE test;
GO
USE test;
GO
EXEC sp_helpuser;
GO
執行後會列出資料庫使用者,若使用 Windows 驗證,dbo 的登入名會顯示為 NULL。
-- 新增兩個登入帳號並設為 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 重新映射別名
EXEC sp_changedbowner @loginame = 'sa', @map = 'TRUE';
EXEC sp_helpuser;
此時 sa 成為 db_owner,ISUser1 成為其別名。
-- 再次變更擁有者為 ISUser2,但不映射別名(@map = FALSE)
EXEC sp_changedbowner @loginame = 'ISUser2', @map = 'FALSE';
EXEC sp_helpuser;
GO
結果顯示 ISUser2 成為新擁有者,ISUser1 降為一般別名。最後清理測試環境:
USE master;
GO
DROP DATABASE test;
GO
索引維護向來耗時費力,SQL Server 2000 引入的 DBCC INDEXDEFRAG 相較於 SQL Server 7.0 的 DBREINDEX 擁有顯著優勢:
若資料表中有兩個索引共用同一區段但不相鄰,建議改用重建索引使其相鄰,以獲得最佳效能。
善用 sp_changedbowner 統一擁有者設定,搭配 DBCC INDEXDEFRAG 定期線上整理碎片,能讓資料庫維護更輕鬆、更安全、更高效。