| 角色 | 權限 |
| db_owner | 資料庫所有操作 (含 DROP DATABASE) |
| db_securityadmin | 管理角色成員、權限授予 |
| db_accessadmin | 管理資料庫使用者存取 |
| db_backupoperator | BACKUP DATABASE/LOG、CHECKPOINT |
| db_ddladmin | 建立/修改/卸除結構描述物件 |
| db_datareader | 所有使用者資料表 SELECT |
| db_datawriter | 所有使用者資料表 INSERT/UPDATE/DELETE |
| db_denydatareader | 拒絕 SELECT |
| db_denydatawriter | 拒絕修改 |
實務操作腳本
新增登入並加入伺服器角色
-- Windows 帳號
EXEC sp_grantlogin 'DOMAIN\User';
EXEC sp_addsrvrolemember 'DOMAIN\User', 'sysadmin';
-- SQL Server 驗證帳號
EXEC sp_addlogin 'etl_user', 'StrongP@ssw0rd', 'MyDB';
EXEC sp_addsrvrolemember 'etl_user', 'bulkadmin';
資料庫使用者與角色對應
USE MyDB;
-- 建立使用者對應登入
EXEC sp_grantdbaccess 'etl_user', 'etl_user';
-- 加入固定資料庫角色
EXEC sp_addrolemember 'db_datawriter', 'etl_user';
EXEC sp_addrolemember 'db_datareader', 'etl_user';
-- 建立自訂角色並授權細粒度權限
EXEC sp_addrole 'role_etl_staging';
GRANT INSERT, UPDATE ON staging_table TO role_etl_staging;
GRANT SELECT ON dim_table TO role_etl_staging;
EXEC sp_addrolemember 'role_etl_staging', 'etl_user';
撤銷與清理
EXEC sp_droprolemember 'db_datawriter', 'etl_user';
EXEC sp_revokedbaccess 'etl_user';
EXEC sp_droplogin 'etl_user';
權限檢查查詢
-- 登入的伺服器角色
SELECT l.name AS LoginName, r.name AS ServerRole
FROM syslogins l
JOIN syssrvrolemembers m ON l.sid = m.sid
JOIN syssrvroles r ON m.srvrole = r.srvrole;
-- 資料庫使用者的角色
USE MyDB;
SELECT u.name AS UserName, r.name AS DbRole
FROM sysusers u
JOIN sysmembers m ON u.uid = m.memberuid
JOIN sysusers r ON m.groupuid = r.uid
WHERE u.issqluser = 1 OR u.isntuser = 1;
最佳實務原則
- 最小權限:應用程式帳號僅獲
db_datareader + db_datawriter 或自訂角色,嚴禁 sysadmin/db_owner。
- 角色基礎授權:權限授予角色,使用者透過加入角色繼承,便於批次變更。
- 定期審計:每季檢視
sysadmin 成員、db_owner 成員、BUILTIN\Administrators 成員。
- 分離職責:備份操作員、ETL 載入、開發部署、審計查詢使用不同帳號/角色。
結語
SQL Server 2000 雖已停止支援,其角色權限模型仍是理解後續版本 (含 Azure SQL) 權限體系的基石。掌握固定角色職掌、Windows 群組自動映射機制、角色基礎授權流程,能有效落實最小權限原則,降低內部與外部威脅風險。
- 上一篇文章: SQL Server T-SQL 實作資料庫備份與還原自動化:含預設路徑取得、強制離線還原與排程作業建立
- 下一篇文章: 解決 SQL Server 「Ad Hoc Distributed Queries」停用導致 OPENROWSET/OPENDATASOURCE 失敗
Copyright ©
程式碼之家 All Rights Reserved