結構化查詢語言/資料控制語言
資料控制語言用於修改資料庫的使用者許可權。它描述了兩個語句:GRANT 和 REVOKE。
GRANT 語句的完整語法如下
GRANT
{
ALL PRIVILEGES ON[ TABLE] <table or view name>
|
{SELECT|DELETE|{INSERT|UPDATE}[ (<column name>[, <column name>]*)]}
[, {SELECT|DELETE|{INSERT|UPDATE}[ (<column name>[, <column name>]*)]}]* ON[ TABLE] <table or view name>
|
USAGE ON
{DOMAIN <domain name>|COLLATION <collation name>|CHARACTER SET <charset name>|TRANSLATION <translation name>}
|
REFERENCES <column name>[, <column name>]* ON <table name>
}
[,
{
ALL PRIVILEGES ON[ TABLE] <table or view name>
|
{SELECT|DELETE|{INSERT|UPDATE}[ (<column name>[, <column name>]*)]}
[ ,{SELECT|DELETE|{INSERT|UPDATE}[ (<column name>[, <column name>]*)]}]* ON[ TABLE] <table or view name>
|
USAGE ON
{DOMAIN <domain name>|COLLATION <collation name>|CHARACTER SET <charset name>|TRANSLATION <translation name>}
|
REFERENCES <column name>[, <column name>]* ON <table name>
}
]* TO {PUBLIC|<user name>}[, {PUBLIC|<user name>}]*[ WITH GRANT OPTION];
GRANT 語句用於授予某人許可權。任何 SQL 操作都是使用使用者名稱完成的。使用者名稱由資料庫管理系統建立。
DBA |
開發人員 1 |
開發人員 2 |
開發人員 3 |
使用者 1 |
使用者 2 |
許可權適用於表(例如 employee、office 等)、檢視、它們的列、域、排序規則、字元集和翻譯。
DBA |
開發人員 1 |
開發人員 2 |
開發人員 3 |
使用者 1 |
使用者 2 |
| ... | ... | ... | ... | ... | ... |
許可權可以允許處理 SELECT(“s”)、INSERT(“i”)、UPDATE(“u”)和 DELETE(“d”)語句(不包括 CREATE、ALTER 或 DROP 語句)。假設只有資料庫管理員擁有許可權。
DBA |
開發人員 1 |
開發人員 2 |
開發人員 3 |
使用者 1 |
使用者 2 |
| ... | ... | ... | ... | ... | ... |
對於每個許可權(“s”,“i”,“u” 和 “d”),也存在一個元許可權(“S”,“I”,“U” 和 “D”):使用者可以將許可權傳送給另一個使用者。假設只有資料庫管理員擁有元許可權。
DBA |
開發人員 1 |
開發人員 2 |
開發人員 3 |
使用者 1 |
使用者 2 |
| ... | ... | ... | ... | ... | ... |
DBA 希望允許 DEVELOPER_1 選擇表 employee 上的列
GRANT SELECT ON employee TO DEVELOPER_1;
|
DEVELOPER_1 的許可權已更改
DBA |
開發人員 1 |
開發人員 2 |
開發人員 3 |
使用者 1 |
使用者 2 |
| ... | ... | ... | ... | ... | ... |
SELECT 指示我們希望傳送 SELECT 許可權。關鍵字 ON 後跟 employee 指示許可權適用於表 employee。關鍵字 TO 後跟 DEVELOPER_1 指示許可權已傳送給 DEVELOPER_1。
DBA 希望允許 DEVELOPER_2 和 DEVELOPER_3 在表 office 上插入、更新和刪除行
GRANT INSERT, UPDATE, DELETE ON office TO DEVELOPER_2 DEVELOPER_3;
|
DEVELOPER_2 和 DEVELOPER_3 的許可權已更改
DBA |
開發人員 1 |
開發人員 2 |
開發人員 3 |
使用者 1 |
使用者 2 |
| ... | ... | ... | ... | ... | ... |
雖然你可以將多個表的多個許可權一次性發送給多個使用者,但不能一次性發送多個表的許可權。如果要傳送所有許可權(SELECT、INSERT、UPDATE 和 DELETE),可以使用關鍵字 ALL PRIVILEGES 替換許可權列表。
現在,DBA 希望允許 USER_1 在表 employee 上插入資料,並允許他將此許可權傳送給其他使用者
GRANT INSERT ON employee TO USER_1 WITH GRANT OPTION;
|
USER_1 的許可權已更改
DBA |
開發人員 1 |
開發人員 2 |
開發人員 3 |
使用者 1 |
使用者 2 |
| ... | ... | ... | ... | ... | ... |
關鍵字 WITH GRANT OPTION 指示我們希望將元許可權與許可權一起傳送給使用者。現在,USER_1 可以將表 employee 上的 SELECT 許可權傳送給其他使用者。假設 USER_1 希望允許任何人對錶 employee 執行 SELECT 操作
GRANT SELECT ON TABLE employee TO PUBLIC;
|
所有使用者的許可權都已更改
DBA |
開發人員 1 |
開發人員 2 |
開發人員 3 |
使用者 1 |
使用者 2 |
| ... | ... | ... | ... | ... | ... |
關鍵字 PUBLIC 指示我們希望將許可權傳送給所有使用者,包括新使用者。
假設 DEVELOPER_3 嘗試允許 USER_2 將記錄插入表 office
GRANT INSERT ON TABLE office TO USER_2;
|
DBA |
開發人員 1 |
開發人員 2 |
開發人員 3 |
使用者 1 |
使用者 2 |
| ... | ... | ... | ... | ... | ... |
操作被拒絕,因為 DEVELOPER_3 許可權不足。
您可以只發送列上的許可權(僅限 INSERT 和 UPDATE)
GRANT INSERT (name, description) ON TABLE office TO USER_2;
GRANT UPDATE (id_office, name) ON TABLE office TO USER_2;
對於 INSERT,請確保使用者無法填充的所有列都具有預設值、自動生成或在插入前由觸發器填充。否則,許可權毫無用處。
REVOKE 語句的完整語法如下
REVOKE[ GRANT OPTION FOR]
{
ALL PRIVILEGES ON[ TABLE] <table or view name>
|
{SELECT|DELETE|{INSERT|UPDATE}[ (<column name>[, <column name>]*)]}
[, {SELECT|DELETE|{INSERT|UPDATE}[ (<column name>[, <column name>]*)]}]* ON[ TABLE] <table or view name>
|
USAGE ON
{DOMAIN <domain name>|COLLATION <collation name>|CHARACTER SET <charset name>|TRANSLATION <translation name>}
|
REFERENCES <column name>[, <column name>]* ON <table name>
}
[,
{
{SELECT|DELETE|{INSERT|UPDATE}[ (<column name>[, <column name>]*)]}
[, {SELECT|DELETE|{INSERT|UPDATE}[ (<column name>[, <column name>]*)]}]* ON[ TABLE] <table or view name>
|
USAGE ON
{DOMAIN <domain name>|COLLATION <collation name>|CHARACTER SET <charset name>|TRANSLATION <translation name>}
|
REFERENCES <column name>[, <column name>]* ON <table name>
}
]* FROM {PUBLIC|<user name>}[, {PUBLIC|<user name>}]*[ RESTRICT| CASCADE]
REVOKE 語句用於收回授予某人的許可權。此收回可能比您預期的更復雜。要完全刪除使用者的許可權,必須由所有傳送過該許可權的使用者收回該許可權。
例如,DBA 希望從 DEVELOPER_2 和 DEVELOPER_3 中刪除表 employee 上的 INSERT 和 DELETE 許可權
REVOKE INSERT, DELETE ON TABLE office FROM DEVELOPER_2, DEVELOPER_3;
|
DBA |
開發人員 1 |
開發人員 2 |
開發人員 3 |
使用者 1 |
使用者 2 |
| ... | ... | ... | ... | ... | ... |
如果您刪除了使用者許可權,而該使用者也擁有相關元許可權(例如,USER_1 的 SELECT 許可權),則操作也會刪除元許可權。要僅刪除元許可權,請新增關鍵字 GRANT OPTION FOR
REVOKE GRANT OPTION FOR SELECT ON TABLE employee FROM USER_1;
|
DBA |
開發人員 1 |
開發人員 2 |
開發人員 3 |
使用者 1 |
使用者 2 |
| ... | ... | ... | ... | ... | ... |
現在您可以管理資料庫了。