结构化查询语言/权限管理
外观
< 结构化查询语言
对于像 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;