1045 字
5 分鐘
瀏覽次數
別再手動給權限了!用這套 SQL 角色設計讓管理變簡單
2026-03-26
2026-04-10

結論#

  • 用「自訂角色 + 內建角色」組合管理 SQL Server 權限,比直接對使用者 GRANT 更穩,也更容易維護。

適合用在哪裡#

  • 資料庫使用者越來越多,權限開始失控
  • 新人、廠商、支援人員需要不同層級的 DB 權限
  • 想把權限管理做成固定模板,而不是每次手動重配
  • 希望降低直接對 User 給權限造成的追蹤困難

流程步驟#

1. 先把角色模型定下來#

  • 先不要急著對人給權限,先定義三種標準角色:唯讀、一般開發、可改 Schema 的進階開發。這樣做的重點不是「分很多角色」,而是把常見需求收斂成固定模板,之後新增人員只要加到對應角色就好。實務上我會把命名統一成 role_db_*,一眼就知道這是自訂角色,不會跟內建角色混在一起。
IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = 'role_db_readonly')
CREATE ROLE role_db_readonly;
IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = 'role_db_developer')
CREATE ROLE role_db_developer;
IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = 'role_db_schema_developer')
CREATE ROLE role_db_schema_developer;
GO

2. 用內建角色拼出權限模板#

  • 建完自訂角色後,再把內建角色的能力掛進去。role_db_readonly 給查詢與檢視定義,適合報表或查詢人員;role_db_developer 再加上寫入與執行 SP 的能力,適合一般後端工程師。這樣做的好處是層級很清楚,權限差異也看得出來,不會每個人都一套特規。
ALTER ROLE db_datareader ADD MEMBER role_db_readonly;
GRANT VIEW DEFINITION TO role_db_readonly;
GO
ALTER ROLE db_datareader ADD MEMBER role_db_developer;
ALTER ROLE db_datawriter ADD MEMBER role_db_developer;
GRANT EXECUTE ON SCHEMA::dbo TO role_db_developer;
GRANT VIEW DEFINITION TO role_db_developer;
GO

3. 進階角色只留給真的需要的人#

  • role_db_schema_developer 可以再加上 db_ddladmin,讓角色具備 CREATE / ALTER / DROP 這類 DDL 能力。這類權限很方便,但也很容易手滑出事,所以不要因為「比較省事」就亂發。通常只建議給 Tech Lead、DBA,或真的需要調整物件結構的人。
ALTER ROLE db_datareader ADD MEMBER role_db_schema_developer;
ALTER ROLE db_datawriter ADD MEMBER role_db_schema_developer;
ALTER ROLE db_ddladmin ADD MEMBER role_db_schema_developer;
GRANT EXECUTE ON SCHEMA::dbo TO role_db_schema_developer;
GRANT VIEW DEFINITION TO role_db_schema_developer;
GO

4. 最後只管角色,不直接管人#

  • 權限模型定好後,使用者只要加入角色即可。關鍵原則很簡單:不要直接對 User 發權限。你今天直接 GRANT SELECT TO user1,明天就很難知道這個人到底為什麼有權限;但如果是加進 role_db_readonly,整個權限來源就很清楚。權限管理本質上不是發散,而是收斂,這句話不是裝深沉,是真的能救命 =_=
-- 將使用者加入對應角色
-- ALTER ROLE role_db_readonly ADD MEMBER [user1];
-- ALTER ROLE role_db_developer ADD MEMBER [user2];
-- ALTER ROLE role_db_schema_developer ADD MEMBER [user3];
GO
-- 不建議:直接對使用者給權限
GRANT SELECT TO user1;
-- 建議:把使用者加進角色
ALTER ROLE role_db_readonly ADD MEMBER user1;

指令 / 範例整理#

角色與權限對照表#

角色名稱權限內容適用對象
role_db_readonly查詢、檢視定義報表、查詢、支援
role_db_developer查詢、寫入、執行、檢視定義後端工程師、API 開發
role_db_schema_developer查詢、寫入、執行、DDL、檢視定義Tech Lead、DBA

SQL Agent 補充權限#

  • 很多人以為加了資料庫權限就能看 SQL Agent Job,結果打開一片空白,然後開始懷疑人生。這不是 SQL Server 壞掉,而是 **SQL Agent 權限在 ****msdb**,要另外補。 | 需求 | msdb 角色 | | --- | --- | | 只看自己的 Job | SQLAgentUserRole | | 看全部 Job / History | SQLAgentReaderRole | | 看全部且可操作 Job | SQLAgentOperatorRole |
USE msdb;
GO
ALTER ROLE SQLAgentUserRole ADD MEMBER [YourLogin];
GO
USE msdb;
GO
ALTER ROLE SQLAgentReaderRole ADD MEMBER [YourLogin];
GO
USE msdb;
GO
ALTER ROLE SQLAgentOperatorRole ADD MEMBER [YourLogin];
GO

補充#

  • GRANT EXECUTE ON SCHEMA::dbo 只涵蓋 dbo schema;若你的 SP 不在 dbo,要另外補授權。
  • db_ddladmin 很強,但不等於完整 DBA;它偏向物件結構調整,不是所有管理權限都包含。
  • 若系統已經存在大量直接對 User 的授權,建議先盤點再慢慢收斂,不要一次硬切,否則很容易炸。

收尾#

  • 把權限做成角色模板,之後維護的就不是一堆人,而是一套規則;規則穩了,系統才不會天天鬧脾氣。
別再手動給權限了!用這套 SQL 角色設計讓管理變簡單
https://joyceowo.github.io/posts/32fa78ea09fa800285daf3ee84dd0fc4/
作者
JoyceOwO
發佈於
2026-03-26
許可協議
CC BY-NC-SA 4.0