Skip to content

OceanBase 角色管理

角色类型

系统内置角色

OceanBase 提供了以下内置角色:

  1. CONNECT:基本连接角色,允许用户连接到数据库
  2. RESOURCE:资源角色,允许用户创建表、索引等资源
  3. DBA:数据库管理员角色,拥有所有权限
  4. READ_ONLY:只读角色,只允许查询操作
  5. PUBLIC:公共角色,所有用户默认拥有

用户自定义角色

用户可以根据业务需求创建自定义角色,将相关权限组合在一起,方便管理和分配。

角色管理操作

创建角色

sql
-- 创建自定义角色
CREATE ROLE 'role_name';

-- 创建带有密码的角色
CREATE ROLE 'role_name' IDENTIFIED BY 'password';

-- 在特定租户下创建角色
CREATE ROLE 'role_name' TENANT='tenant_name';

授权角色

sql
-- 将权限授予角色
GRANT SELECT, INSERT, UPDATE ON table_name TO 'role_name';

-- 将系统权限授予角色
GRANT CREATE TABLE, CREATE INDEX TO 'role_name';

-- 将角色授予用户
GRANT 'role_name' TO 'user_name';

-- 将角色授予另一个角色
GRANT 'role_name1' TO 'role_name2';

撤销角色权限

sql
-- 撤销角色的表权限
REVOKE UPDATE, DELETE ON table_name FROM 'role_name';

-- 撤销角色的系统权限
REVOKE CREATE TABLE FROM 'role_name';

-- 撤销用户的角色
REVOKE 'role_name' FROM 'user_name';

设置默认角色

sql
-- 设置用户的默认角色
SET DEFAULT ROLE 'role_name' TO 'user_name';

-- 设置用户的所有角色为默认角色
SET DEFAULT ROLE ALL TO 'user_name';

-- 取消用户的默认角色
SET DEFAULT ROLE NONE TO 'user_name';

删除角色

sql
-- 删除角色
DROP ROLE 'role_name';

-- 删除多个角色
DROP ROLE 'role_name1', 'role_name2';

角色信息查询

查看角色信息

sql
-- 查看所有角色
SELECT * FROM oceanbase.DBA_OB_ROLES;

-- 查看用户拥有的角色
SELECT * FROM oceanbase.DBA_OB_ROLE_PRIVS WHERE grantee = 'user_name';

-- 查看角色拥有的权限
SELECT * FROM oceanbase.DBA_OB_TAB_PRIVS WHERE grantee = 'role_name';
SELECT * FROM oceanbase.DBA_OB_SYS_PRIVS WHERE grantee = 'role_name';

查看当前用户的角色

sql
-- 查看当前用户拥有的角色
SHOW GRANTS FOR CURRENT_USER();

-- 查看当前用户激活的角色
SELECT * FROM oceanbase.SESSION_ROLES;

激活/停用角色

sql
-- 激活角色
SET ROLE 'role_name';

-- 激活多个角色
SET ROLE 'role_name1', 'role_name2';

-- 激活所有角色
SET ROLE ALL;

-- 停用所有角色
SET ROLE NONE;

角色管理最佳实践

角色设计原则

  1. 最小权限原则:角色只包含完成任务所需的最小权限集合
  2. 职责分离原则:不同职责的权限分配给不同的角色
  3. 层次化设计:设计层次化的角色结构,便于管理和继承
  4. 命名规范:使用清晰的命名规范,便于识别角色的用途

角色管理建议

  1. 定期审计角色权限:定期检查角色的权限,确保权限符合业务需求
  2. 及时回收不再使用的角色:对于不再使用的角色,及时删除或回收权限
  3. 使用角色继承:合理使用角色继承,减少重复权限分配
  4. 限制高权限角色的使用:对于 DBA 等高级角色,严格控制使用范围

权限管理流程

  1. 需求分析:分析业务需求,确定所需的权限
  2. 角色设计:根据需求设计合适的角色
  3. 权限分配:将权限分配给角色
  4. 角色授予:将角色授予用户
  5. 定期审计:定期审计角色和权限,确保安全

常见问题(FAQ)

Q1: 角色和用户有什么区别?

A1: 角色是一组权限的集合,而用户是数据库的实际使用者。角色不能直接登录数据库,只能被授予用户后,通过用户来使用。一个用户可以拥有多个角色,一个角色也可以被多个用户拥有。

Q2: 如何查看角色的详细权限?

A2: 可以通过以下方式查看角色的详细权限:

sql
-- 查看角色的表权限
SELECT * FROM oceanbase.DBA_OB_TAB_PRIVS WHERE grantee = 'role_name';

-- 查看角色的系统权限
SELECT * FROM oceanbase.DBA_OB_SYS_PRIVS WHERE grantee = 'role_name';

-- 查看角色的对象权限
SELECT * FROM oceanbase.DBA_OB_OBJ_PRIVS WHERE grantee = 'role_name';

Q3: 角色权限继承是如何工作的?

A3: 当一个角色被授予另一个角色时,会形成角色继承关系。子角色会继承父角色的所有权限。例如,如果角色 A 拥有 SELECT 权限,角色 B 被授予角色 A,那么角色 B 也会拥有 SELECT 权限。

Q4: 如何撤销角色的所有权限?

A4: 可以通过以下方式撤销角色的所有权限:

sql
-- 撤销角色的所有表权限
REVOKE ALL PRIVILEGES ON table_name FROM 'role_name';

-- 撤销角色的所有系统权限
REVOKE ALL PRIVILEGES FROM 'role_name';

-- 删除并重新创建角色(彻底清理权限)
DROP ROLE 'role_name';
CREATE ROLE 'role_name';

Q5: 为什么用户无法使用已授予的角色权限?

A5: 可能的原因包括:

  1. 角色未被激活:需要使用 SET ROLE 命令激活角色
  2. 角色不是默认角色:需要设置为默认角色
  3. 权限被撤销:检查角色的权限是否被撤销
  4. 权限作用域问题:检查权限的作用域是否正确
sql
-- 激活角色
SET ROLE 'role_name';

-- 设置为默认角色
SET DEFAULT ROLE 'role_name' TO 'user_name';

-- 检查角色权限
SELECT * FROM oceanbase.DBA_OB_TAB_PRIVS WHERE grantee = 'role_name';