结构化查询语言/数据控制语言
数据控制语言用于修改数据库的用户权限。它描述了两个语句: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 |
... | ... | ... | ... | ... | ... |
现在您可以管理数据库了。