跳转到内容

结构化查询语言/权限管理

来自维基教科书,开放的书籍,面向开放的世界



对于像 DBMS 这样的多用户系统,必须授予和撤销操作其对象的权限。GRANT 命令定义了哪个用户可以操作(创建、读取、更改、删除……)哪个对象(表、视图、索引、序列、触发器……)。

GRANT <privilege_name>
ON    <object_name>
TO    [ <user_name> | <role_name> | PUBLIC ]
[WITH GRANT OPTION];

REVOKE 语句剥夺已授予的权限。

REVOKE <privilege_name>
ON     <object_name>
FROM   [ <user_name> | <role_name> | PUBLIC ];

示例语句授予用户 hibernate 对表 person 的 SELECT 和 INSERT 权限。第二个语句删除已授予的权限。

GRANT  SELECT, INSERT ON person TO   hibernate;
REVOKE SELECT, INSERT ON person FROM hibernate;

权限是用户可以执行的操作。SQL 标准只支持有限的权限列表,而实际实现提供了大量不同的权限。该列表包括:SELECT、INSERT、UPDATE、DELETE、CREATE <object_type>、DROP <object_type>、EXECUTE 等。

对象类型

[编辑 | 编辑源代码]

SQL 标准中可以授予权限的对象类型列表很短,而实际实现中的列表很长。它包括表、视图、索引、序列、触发器、过程等。

角色/公共

[编辑 | 编辑源代码]

如果连接到 DBMS 的用户数量很多,将具有相同权限的用户分组到一个角色中,并将权限授予角色而不是单个用户,会很有帮助。为此,必须通过 CREATE ROLE 语句创建角色。之后,用户将加入该角色。

-- Create a role
-- (MySQL supports only predefined roles with special semantics).
CREATE ROLE department_human_resources;

-- Enrich the role with rights
GRANT  SELECT, INSERT, UPDATE, DELETE ON person        TO department_human_resources;
GRANT  SELECT, INSERT                 ON hobby         TO department_human_resources;
GRANT  SELECT, INSERT, UPDATE, DELETE ON person_hobby  TO department_human_resources;

-- Join users with the role
GRANT  department_human_resources TO user_1;
GRANT  department_human_resources TO user_2;

PUBLIC 关键字表示所有已知用户,而不是单个用户名。

-- Everybody shall be allowed to read the rows of the 'person' table.
GRANT SELECT ON person TO PUBLIC;

授予选项

[编辑 | 编辑源代码]

如果 DBA 希望将权限管理委托给特定用户,他可以授予他们权限,并使用“WITH GRANT OPTION”短语扩展语句。这使用户能够将收到的权限授予任何其他用户。

-- User 'hibernate' gets the right to pass the SELECT privilege on table 'person' to any other user.
GRANT SELECT ON person TO hibernate WITH GRANT OPTION;


华夏公益教科书