对于多用户系统(如数据库管理系统,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 对表 personSELECTINSERT 权限,而 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 标准中列表较短,但实际实现支持的对象类型更多。常见对象类型包括:

  • 表(Tables)
  • 视图(Views)
  • 索引(Indexes)
  • 序列(Sequences)
  • 触发器(Triggers)
  • 存储过程(Procedures)

角色与公共权限(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;

总结

  1. GRANTREVOKE 是控制数据库权限的核心命令。
  2. 角色(Roles) 提供了权限管理的灵活性,可将权限批量授予角色,再关联用户。
  3. WITH GRANT OPTION 提供了权限委托功能,允许用户管理权限。
  4. PUBLIC 关键字适用于所有用户,是常见的全局权限设置方式。
Last modified: Tuesday, 28 January 2025, 2:05 PM