所謂使用者權限,簡單來說就是「使用者能做什麼、不能做什麼」。在 SQL Server 2005 中,權限體系劃分為三大層級:
要讓使用者存取某個資料庫,第一步就是授予該資料庫的存取權。在 Management Studio 中,可透過將使用者加入資料庫節點的「使用者」成員來實現;若使用 T-SQL,則使用 CREATE USER 或舊版相容的 sp_grantdbaccess。
注意:當在資料庫中建立使用者時,權限實際儲存在資料庫內,並對應到該使用者的伺服器識別碼(SID)。還原資料庫時,可能需要在目標伺服器重新對應使用者權限至伺服器識別碼。
CREATE USER <使用者名稱>
[ { { FOR | FROM }
{ LOGIN <登入名稱>
| CERTIFICATE <憑證名稱>
| ASYMMETRIC KEY <非對稱金鑰名稱>
}
| WITHOUT LOGIN ]
[ WITH DEFAULT_SCHEMA = <結構描述名稱> ]
| 選項 | 說明 |
|---|---|
| LOGIN | 欲授予目前資料庫存取權限的登入名稱 |
| CERTIFICATE | 與使用者關聯的憑證邏輯名稱,需先以 CREATE CERTIFICATE 建立 |
| ASYMMETRIC KEY | 與使用者關聯的非對稱金鑰邏輯名稱,需先以 CREATE ASYMMETRIC KEY 建立 |
| WITHOUT LOGIN | 建立僅能在目前資料庫中活動的使用者,無法對應外部登入,也無法存取其他資料庫 |
| WITH DEFAULT_SCHEMA | 指定非預設 "dbo" 的結構描述作為該使用者的預設結構描述 |
sp_grantdbaccess [@loginame =] '<登入名稱>'[, [@name_in_db =] '<資料庫內別名>']
此預存程序授予目前資料庫的存取權限。name_in_db 參數允許在該資料庫內給使用者一個替代識別名稱,僅影響此資料庫內的身分識別函數(如 USER_NAME()),系統層級函數(如 SYSTEM_USER)仍回傳原始登入 ID。
擁有登入與資料庫存取權還不夠,SQL Server 提供細緻的物件級權限控制。可授權的物件包含資料表、檢視表、預存程序(觸發程序隱含建立者權限)。
| 權限 | 說明 |
|---|---|
| SELECT | 允許讀取資料,可對授權的資料表/檢視表執行 SELECT |
| INSERT | 允許新增資料,可執行 INSERT。注意:擁有 INSERT 不代表擁有 SELECT |
| UPDATE | 允許修改現有資料,可執行 UPDATE。同樣不隱含 SELECT |
| DELETE | 允許刪除資料,可執行 DELETE。不隱含 SELECT |
| REFERENCES | 當插入資料列涉及參考其他資料表的外鍵約束,而使用者無該表 SELECT 權限時,此權限允許插入 |
| EXECUTE | 允許執行指定的預存程序 |
這些權限可在 Management Studio 中透過「安全性」→「登入名」→ 右鍵「屬性」 設定,或使用 T-SQL 三大指令:GRANT、DENY、REVOKE。
GRANT
ALL [PRIVILEGES] | <權限>[,...n]
ON
<資料表或檢視表名稱>[(<資料行名稱>[,...n])]
| <預存程序或擴充預存程序名稱>
TO <登入 ID 或角色名稱>[,...n]
[WITH GRANT OPTION]
[AS <角色名稱>]
ALL:授予該物件類型所有適用權限(EXECUTE 不適用於資料表)ON:指定目標物件,支援資料行級權限(但微軟建議改用檢視表實現資料行級安全性)WITH GRANT OPTION:允許受授權者再授權給他人(不建議使用,難以追蹤權限鏈)AS:處理登入屬於多角色時的授權依據角色DENY 會覆蓋任何 GRANT。使用者若屬於多角色,任一角色或個人層級有 DENY,該權限即被封鎖。語法與 GRANT 類似,關鍵差異在 CASCADE 選項:若使用者曾以 WITH GRANT OPTION 授權他人,CASCADE 會連帶撤銷這些下游授權。
撤銷先前 GRANT 或 DENY 的效果。語法融合兩者,支援 CASCADE 連帶撤銷下游授權,以及 AS 指定角色依據。
除了物件權限,SQL Server 也控制特定陳述式的執行權限,包含:
CREATE DATABASE、CREATE DEFAULT、CREATE PROCEDURECREATE RULE、CREATE TABLE、CREATE VIEWBACKUP DATABASE、BACKUP LOG授權語法簡化為:GRANT <ALL | 陳述式[,...n]> TO <登入 ID>[,...n],DENY 與 REVOKE 運作邏輯相同。
TestAccount 登入,嘗試 SELECT * FROM Region → 失敗(無權限)sa 執行 GRANT SELECT ON Region TO TestAccountTestAccount,再次執行 SELECT → 成功INSERT → 失敗,再授予 INSERT 權限後成功DENY ALL ON Employees TO TestAccount → 即使 Public 角色有權限,TestAccount 也被封鎖REVOKE 移除授權/拒絕 → 權限恢復原狀掌握這三大指令與權限層級,即能建立精細、安全的資料庫存取控制體系。