结构化查询语言(Structured Query Language)
Completion requirements
对于多用户系统(如数据库管理系统,DBMS),需要控制用户对数据库对象的操作权限。GRANT 命令用于授予用户对对象(如表、视图、索引、序列、触发器等)的操作权限,而 REVOKE 命令用于收回已授予的权限。
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 ];
以下示例中,GRANT
语句授予用户 hibernate
对表 person
的 SELECT
和 INSERT
权限,而 REVOKE
语句收回这些权限:
GRANT SELECT, INSERT ON person TO hibernate;
REVOKE SELECT, INSERT ON person FROM hibernate;
权限(Privileges)
权限是用户可以执行的操作。SQL 标准支持的权限列表有限,而实际数据库实现通常支持更多的权限。常见的权限包括:
- SELECT:查询表数据。
- INSERT:向表中插入数据。
- UPDATE:更新表数据。
- DELETE:删除表数据。
- CREATE <object_type>:创建对象(如表、视图等)。
- DROP <object_type>:删除对象。
- EXECUTE:执行存储过程或函数。
对象类型(Object Types)
权限可应用于的对象类型在 SQL 标准中列表较短,但实际实现支持的对象类型更多。常见对象类型包括:
角色与公共权限(Roles / Public)
对于大量用户的场景,可以通过将具有相同权限的用户分组为角色(Role)来简化权限管理。权限可授予角色,而不是直接授予用户。之后,再将用户关联到角色。
示例:
-- 创建角色
-- (MySQL 仅支持具有特殊语义的预定义角色)
CREATE ROLE department_human_resources;
-- 为角色赋予权限
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;
-- 将用户加入角色
GRANT department_human_resources TO user_1;
GRANT department_human_resources TO user_2;
此外,可以使用关键字 PUBLIC
代表所有已知用户。例如:
-- 授予所有用户读取表 'person' 的权限
GRANT SELECT ON person TO PUBLIC;
授予选项(Grant Option)
如果数据库管理员希望将权限管理委托给特定用户,可以在授予权限时添加 WITH GRANT
OPTION
关键字。这样,用户可以将已获得的权限转授给其他用户。
示例:
-- 用户 'hibernate' 被授予对表 'person' 的 SELECT 权限,并可将此权限授予其他用户。
GRANT SELECT ON person TO hibernate WITH GRANT OPTION;
总结
- GRANT 和 REVOKE 是控制数据库权限的核心命令。
- 角色(Roles) 提供了权限管理的灵活性,可将权限批量授予角色,再关联用户。
WITH GRANT OPTION
提供了权限委托功能,允许用户管理权限。PUBLIC
关键字适用于所有用户,是常见的全局权限设置方式。
Last modified: Tuesday, 28 January 2025, 2:05 PM