為保護資料庫安全,生產環境常需建立「唯讀帳號」供報表、BI、稽核人員使用。本文以圖文詳細說明在 SSMS 中建立 SQL 登入、對應資料庫使用者、指派 db_datareader 角色,以及進階需求:授予 檢視任意定義 (VIEW ANY DEFINITION) 以查看預存程序/檢視表/函數定義的完整步驟。
sa 登入。ReadOnlyUser)。




db_datareader 僅授予 資料列層級 的 SELECT 權限,不包含 檢視物件定義 (CREATE PROCEDURE / VIEW / FUNCTION 文字)。若唯讀帳號需閱讀程式碼,需額外授予伺服器層級權限 VIEW ANY DEFINITION。



伺服器層級權限變更通常**即時生效**;若未生效,可嘗試重啟 MSSQLSERVER 服務 (注意:會同時停止 SQL Server Agent,重啟後請手動啟動 Agent)。
| 角色 | 權限說明 |
|---|---|
| sysadmin | 執行任何活動,跨越所有其他角色;預設 BUILTIN\Administrators 成員皆為 sysadmin |
| securityadmin | 管理登入及屬性,GRANT/DENY/REVOKE 伺服器與資料庫權限,重設 SQL 登入密碼 |
| serveradmin | 變更伺服器範圍設定選項、關閉伺服器 |
| setupadmin | 加入/移除連結伺服器、執行特定系統預存程序 (sp_serveroption 等) |
| processadmin | 結束資料庫引擎實例中執行的處理序 |
| diskadmin | 管理磁碟檔案 |
| dbcreator | 建立、修改、刪除、還原任何資料庫 |
| bulkadmin | 執行 BULK INSERT 陳述式 |
| 角色 | 權限說明 |
|---|---|
| db_owner | 資料庫所有作業 (結構、資料、安全性、備份/還原) |
| db_datareader | 讀取所有使用者資料表/檢視表資料 (唯讀帳號核心角色) |
| db_datawriter | 新增、修改、刪除所有使用者資料表資料 |
| db_ddladmin | 執行 DDL (CREATE/ALTER/DROP 表、檢視、索引等) |
| db_securityadmin | 管理資料庫角色成員、權限、應用程式角色 |
| db_backupoperator | 備份資料庫 (可執行 DBCC CHECKPOINT 等) |
| db_denydatareader | 拒絕讀取任何資料 |
| db_denydatawriter | 拒絕修改任何資料 |
-- 1. 建立 SQL 登入
CREATE LOGIN [ReadOnlyUser] WITH PASSWORD = N'Str0ng!P@ss',
CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF;
-- 2. 對每個目標資料庫建立使用者並加入 db_datareader
USE [TargetDB];
CREATE USER [ReadOnlyUser] FOR LOGIN [ReadOnlyUser];
ALTER ROLE [db_datareader] ADD MEMBER [ReadOnlyUser];
-- 3. (選擇性) 授予檢視任意定義
GRANT VIEW ANY DEFINITION TO [ReadOnlyUser];
依據上述流程即可建立安全、合規的唯讀帳號,滿足報表查詢與程式碼審閱雙重需求。