跳转至内容

结构化查询语言/数据控制语言

100% developed
来自维基教科书,开放的书籍,为开放的世界

← 数据定义语言 | 性能 → 数据控制语言用于修改数据库的用户权限。它描述了两个语句:GRANT 和 REVOKE。

GRANT 语句

[编辑 | 编辑源代码]

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

权限适用于表(例如 employeeoffice 等)、视图、它们的列、域、排序规则、字符集和翻译。


DBA

开发人员 1

开发人员 2

开发人员 3

用户 1

用户 2
employee
employee
employee
employee
employee
employee
office
office
office
office
office
office
... ... ... ... ... ...

权限可以允许处理 SELECT(“s”)、INSERT(“i”)、UPDATE(“u”)和 DELETE(“d”)语句(不包括 CREATE、ALTER 或 DROP 语句)。假设只有数据库管理员拥有权限。


DBA

开发人员 1

开发人员 2

开发人员 3

用户 1

用户 2
employee
s i u d
employee
employee
employee
employee
employee
office
s i u d
office
office
office
office
office
... ... ... ... ... ...

对于每个权限(“s”,“i”,“u” 和 “d”),也存在一个元权限(“S”,“I”,“U” 和 “D”):用户可以将权限发送给另一个用户。假设只有数据库管理员拥有元权限。


DBA

开发人员 1

开发人员 2

开发人员 3

用户 1

用户 2
employee
S I U D
s i u d
employee
employee
employee
employee
employee
office
S I U D
s i u d
office
office
office
office
office
... ... ... ... ... ...

DBA 希望允许 DEVELOPER_1 选择表 employee 上的列


DBA
GRANT SELECT ON employee TO DEVELOPER_1;

DEVELOPER_1 的权限已更改


DBA

开发人员 1

开发人员 2

开发人员 3

用户 1

用户 2
employee
S I U D
s i u d
employee
s
employee
employee
employee
employee
office
S I U D
s i u d
office
office
office
office
office
... ... ... ... ... ...

SELECT 指示我们希望发送 SELECT 权限。关键字 ON 后跟 employee 指示权限适用于表 employee。关键字 TO 后跟 DEVELOPER_1 指示权限已发送给 DEVELOPER_1。

DBA 希望允许 DEVELOPER_2 和 DEVELOPER_3 在表 office 上插入、更新和删除行


DBA
GRANT INSERT, UPDATE, DELETE ON office TO DEVELOPER_2 DEVELOPER_3;

DEVELOPER_2 和 DEVELOPER_3 的权限已更改


DBA

开发人员 1

开发人员 2

开发人员 3

用户 1

用户 2
employee
S I U D
s i u d
employee
s
employee
employee
employee
employee
office
S I U D
s i u d
office
office
i u d
office
i u d
office
office
... ... ... ... ... ...

虽然你可以将多个表的多个权限一次性发送给多个用户,但不能一次性发送多个表的权限。如果要发送所有权限(SELECT、INSERT、UPDATE 和 DELETE),可以使用关键字 ALL PRIVILEGES 替换权限列表。

现在,DBA 希望允许 USER_1 在表 employee 上插入数据,并允许他将此权限发送给其他用户


DBA
GRANT INSERT ON employee TO USER_1 WITH GRANT OPTION;

USER_1 的权限已更改


DBA

开发人员 1

开发人员 2

开发人员 3

用户 1

用户 2
employee
S I U D
s i u d
employee
s
employee
employee
employee
S
s
employee
office
S I U D
s i u d
office
office
i u d
office
i u d
office
office
... ... ... ... ... ...

关键字 WITH GRANT OPTION 指示我们希望将元权限与权限一起发送给用户。现在,USER_1 可以将表 employee 上的 SELECT 权限发送给其他用户。假设 USER_1 希望允许任何人对表 employee 执行 SELECT 操作


用户 1
GRANT SELECT ON TABLE employee TO PUBLIC;

所有用户的权限都已更改


DBA

开发人员 1

开发人员 2

开发人员 3

用户 1

用户 2
employee
S I U D
s i u d
employee
s
employee
s
employee
s
employee
S
s
employee
s
office
S I U D
s i u d
office
office
i u d
office
i u d
office
office
... ... ... ... ... ...

关键字 PUBLIC 指示我们希望将权限发送给所有用户,包括新用户。

假设 DEVELOPER_3 尝试允许 USER_2 将记录插入表 office


开发人员 3
GRANT INSERT ON TABLE office TO USER_2;

DBA

开发人员 1

开发人员 2

开发人员 3

用户 1

用户 2
employee
S I U D
s i u d
employee
s
employee
s
employee
s
employee
S
s
employee
s
office
S I U D
s i u d
office
office
i u d
office
I
i u d
office
office
... ... ... ... ... ...

操作被拒绝,因为 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 语句的完整语法如下

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 权限


DBA
REVOKE INSERT, DELETE ON TABLE office FROM DEVELOPER_2, DEVELOPER_3;

DBA

开发人员 1

开发人员 2

开发人员 3

用户 1

用户 2
employee
S I U D
s i u d
employee
s
employee
s
employee
s
employee
S
s
employee
s
office
S I U D
s i u d
office
office
u
office
u
office
office
... ... ... ... ... ...

如果您删除了用户权限,而该用户也拥有相关元权限(例如,USER_1 的 SELECT 权限),则操作也会删除元权限。要仅删除元权限,请添加关键字 GRANT OPTION FOR


DBA
REVOKE GRANT OPTION FOR SELECT ON TABLE employee FROM USER_1;

DBA

开发人员 1

开发人员 2

开发人员 3

用户 1

用户 2
employee
S I U D
s i u d
employee
s
employee
s
employee
s
employee
s
employee
s
office
S I U D
s i u d
office
office
u
office
u
office
office
... ... ... ... ... ...

现在您可以管理数据库了。


华夏公益教科书