Skip to content

DM 用户和权限管理

用户管理

1. 用户类型

DM数据库中的用户分为以下几种类型:

  • 系统管理员用户:具有最高权限的用户,如SYSDBA、SYSAUDITOR等
  • 普通用户:由系统管理员创建的用户,用于日常业务操作
  • 角色用户:用于权限管理的虚拟用户,不能直接登录数据库

2. 用户创建

sql
-- 创建普通用户
CREATE USER TEST IDENTIFIED BY "123456" 
    DEFAULT TABLESPACE USERS 
    TEMPORARY TABLESPACE TEMP 
    QUOTA UNLIMITED ON USERS;

-- 创建具有特定权限的用户
CREATE USER APP_USER IDENTIFIED BY "app_password" 
    DEFAULT TABLESPACE APP_DATA 
    GRANT CREATE SESSION, CREATE TABLE TO APP_USER;

3. 用户修改

sql
-- 修改用户密码
ALTER USER TEST IDENTIFIED BY "654321";

-- 修改用户默认表空间
ALTER USER TEST DEFAULT TABLESPACE APP_DATA;

-- 修改用户临时表空间
ALTER USER TEST TEMPORARY TABLESPACE TEMP2;

-- 锁定用户
ALTER USER TEST ACCOUNT LOCK;

-- 解锁用户
ALTER USER TEST ACCOUNT UNLOCK;

-- 修改用户状态
ALTER USER TEST ACCOUNT EXPIRE;

4. 用户删除

sql
-- 删除用户(如果用户拥有对象,需要使用CASCADE选项)
DROP USER TEST CASCADE;

-- 删除用户但保留其对象
DROP USER TEST;

5. 用户查询

sql
-- 查询所有用户
SELECT * FROM DBA_USERS;

-- 查询用户详细信息
SELECT USERNAME, ACCOUNT_STATUS, DEFAULT_TABLESPACE, CREATED 
FROM DBA_USERS 
WHERE USERNAME = 'TEST';

-- 查询当前用户
SELECT USER FROM DUAL;

权限管理

1. 权限类型

DM数据库中的权限分为以下两种类型:

  • 系统权限:允许用户执行特定的系统级操作,如创建用户、创建表空间等
  • 对象权限:允许用户访问和操作特定的数据库对象,如表、视图、存储过程等

2. 系统权限管理

sql
-- 授予系统权限
GRANT CREATE USER, CREATE TABLESPACE TO TEST;

-- 授予系统权限并允许转授
GRANT CREATE SESSION TO TEST WITH ADMIN OPTION;

-- 回收系统权限
REVOKE CREATE TABLESPACE FROM TEST;

-- 查询用户拥有的系统权限
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'TEST';

-- 查询当前用户拥有的系统权限
SELECT * FROM USER_SYS_PRIVS;

3. 对象权限管理

sql
-- 授予表权限
GRANT SELECT, INSERT, UPDATE, DELETE ON EMP TO TEST;

-- 授予视图权限
GRANT SELECT ON V_EMP TO TEST;

-- 授予存储过程权限
GRANT EXECUTE ON PROC_GET_EMP TO TEST;

-- 授予对象权限并允许转授
GRANT SELECT ON EMP TO TEST WITH GRANT OPTION;

-- 回收对象权限
REVOKE UPDATE, DELETE ON EMP FROM TEST;

-- 查询用户拥有的对象权限
SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'TEST';

-- 查询当前用户拥有的对象权限
SELECT * FROM USER_TAB_PRIVS;

角色管理

1. 角色类型

DM数据库中的角色分为以下两种类型:

  • 系统角色:由数据库预定义的角色,如DBA、RESOURCE、CONNECT等
  • 自定义角色:由用户创建的角色,用于灵活的权限管理

2. 系统角色

DM数据库预定义了以下常用系统角色:

  • DBA:数据库管理员角色,拥有所有系统权限
  • RESOURCE:资源角色,允许用户创建表、索引、视图等数据库对象
  • CONNECT:连接角色,允许用户连接到数据库
  • PUBLIC:公共角色,所有用户默认拥有该角色

3. 自定义角色创建和管理

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

-- 为角色授予权限
GRANT SELECT, INSERT, UPDATE ON EMP TO APP_ROLE;
GRANT EXECUTE ON PROC_GET_EMP TO APP_ROLE;
GRANT CREATE SESSION TO APP_ROLE;

-- 将角色授予用户
GRANT APP_ROLE TO TEST;

-- 激活用户的角色
ALTER USER TEST DEFAULT ROLE ALL;

-- 修改角色
ALTER ROLE APP_ROLE RENAME TO NEW_APP_ROLE;

-- 删除角色
DROP ROLE NEW_APP_ROLE;

4. 角色查询

sql
-- 查询所有角色
SELECT * FROM DBA_ROLES;

-- 查询角色拥有的权限
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'APP_ROLE';
SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'APP_ROLE';

-- 查询用户拥有的角色
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'TEST';

-- 查询当前用户拥有的角色
SELECT * FROM USER_ROLE_PRIVS;

权限继承和传递

1. 权限继承

DM数据库支持权限继承,当用户被授予某个角色时,该用户将继承该角色拥有的所有权限。

2. 权限传递

  • 系统权限传递:使用WITH ADMIN OPTION子句授予的系统权限可以被转授
  • 对象权限传递:使用WITH GRANT OPTION子句授予的对象权限可以被转授

3. 权限传递示例

sql
-- 授予系统权限并允许转授
GRANT CREATE TABLE TO TEST WITH ADMIN OPTION;

-- TEST用户可以将CREATE TABLE权限转授给其他用户
GRANT CREATE TABLE TO APP_USER;

-- 授予对象权限并允许转授
GRANT SELECT ON EMP TO TEST WITH GRANT OPTION;

-- TEST用户可以将SELECT ON EMP权限转授给其他用户
GRANT SELECT ON EMP TO APP_USER;

权限回收

1. 权限回收规则

  • 回收系统权限时,使用WITH ADMIN OPTION授予的权限不会级联回收
  • 回收对象权限时,使用WITH GRANT OPTION授予的权限会级联回收

2. 权限回收示例

sql
-- 回收系统权限
REVOKE CREATE TABLE FROM TEST;

-- 回收对象权限
REVOKE SELECT ON EMP FROM TEST;

-- 回收角色
REVOKE APP_ROLE FROM TEST;

权限管理最佳实践

1. 最小权限原则

遵循最小权限原则,只授予用户完成其工作所需的最小权限,避免授予过多权限。

2. 使用角色管理权限

使用角色管理权限,将相关权限组合成角色,然后将角色授予用户,简化权限管理。

3. 定期审查权限

定期审查用户和角色的权限,及时回收不必要的权限,确保权限的合理性和安全性。

4. 使用强密码策略

实施强密码策略,要求用户使用复杂密码,并定期更换密码。

5. 限制管理员用户访问

限制系统管理员用户的访问,只允许在必要时使用管理员权限,日常操作使用普通用户。

6. 启用审计功能

启用数据库审计功能,记录用户的权限操作,便于审计和追踪。

权限管理注意事项

1. 权限冲突

当用户通过多个角色获得权限时,可能会出现权限冲突。DM数据库采用权限累加的方式处理权限冲突,即用户拥有所有角色的权限总和。

2. 权限优先级

系统权限优先于对象权限,显式授予的权限优先于通过角色获得的权限。

3. 权限依赖关系

某些权限之间存在依赖关系,如创建表需要拥有CREATE TABLE权限和表空间配额。

4. 权限与角色的区别

  • 权限是执行特定操作的能力
  • 角色是权限的集合,用于简化权限管理
  • 用户可以直接拥有权限,也可以通过角色获得权限

版本差异

版本用户和权限管理功能差异
DM 8.1.1.41 及以上支持完整的用户和权限管理功能
DM 8.1.1.133 及以上增强了角色管理功能,支持更灵活的角色权限配置
DM 8.1.2.126 及以上支持细粒度的权限控制和更完善的审计功能

常见问题(FAQ)

Q1: 如何创建一个具有最小权限的用户?

A1: 可以创建一个只有CONNECT权限的用户,然后根据需要逐步授予其他权限:

sql
CREATE USER minimal_user IDENTIFIED BY "password";
GRANT CONNECT TO minimal_user;
-- 根据需要授予其他权限
GRANT SELECT ON specific_table TO minimal_user;

Q2: 如何查看用户拥有的所有权限?

A2: 可以通过以下SQL语句查看用户拥有的所有权限:

sql
-- 查看系统权限
SELECT PRIVILEGE FROM DBA_SYS_PRIVS WHERE GRANTEE = 'username'
UNION ALL
-- 查看角色拥有的系统权限
SELECT PRIVILEGE FROM DBA_SYS_PRIVS 
WHERE GRANTEE IN (SELECT GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'username');

-- 查看对象权限
SELECT OWNER, TABLE_NAME, PRIVILEGE FROM DBA_TAB_PRIVS WHERE GRANTEE = 'username'
UNION ALL
-- 查看角色拥有的对象权限
SELECT OWNER, TABLE_NAME, PRIVILEGE FROM DBA_TAB_PRIVS 
WHERE GRANTEE IN (SELECT GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'username');

Q3: 如何回收用户的所有权限?

A3: 可以先回收用户的所有角色,然后回收直接授予的权限:

sql
-- 回收所有角色
DECLARE
  v_role VARCHAR2(30);
BEGIN
  FOR r IN (SELECT GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'username') LOOP
    EXECUTE IMMEDIATE 'REVOKE ' || r.GRANTED_ROLE || ' FROM username';
  END LOOP;
END;
/

-- 回收所有系统权限
DECLARE
  v_priv VARCHAR2(100);
BEGIN
  FOR r IN (SELECT PRIVILEGE FROM DBA_SYS_PRIVS WHERE GRANTEE = 'username') LOOP
    EXECUTE IMMEDIATE 'REVOKE ' || r.PRIVILEGE || ' FROM username';
  END LOOP;
END;
/

-- 回收所有对象权限
DECLARE
  v_sql VARCHAR2(200);
BEGIN
  FOR r IN (SELECT OWNER, TABLE_NAME, PRIVILEGE FROM DBA_TAB_PRIVS WHERE GRANTEE = 'username') LOOP
    v_sql := 'REVOKE ' || r.PRIVILEGE || ' ON ' || r.OWNER || '.' || r.TABLE_NAME || ' FROM username';
    EXECUTE IMMEDIATE v_sql;
  END LOOP;
END;
/

Q4: 什么是角色的默认权限?

A4: 角色的默认权限是指用户登录数据库时自动激活的角色权限。可以通过ALTER USER语句设置用户的默认角色:

sql
-- 设置所有角色为默认角色
ALTER USER username DEFAULT ROLE ALL;

-- 设置特定角色为默认角色
ALTER USER username DEFAULT ROLE role1, role2;

-- 取消所有默认角色
ALTER USER username DEFAULT ROLE NONE;

Q5: 如何实现权限的精细化管理?

A5: 可以通过以下方式实现权限的精细化管理:

  • 使用自定义角色,将相关权限组合成角色
  • 使用行级安全性,限制用户只能访问特定行的数据
  • 使用列级安全性,限制用户只能访问特定列的数据
  • 使用视图,限制用户只能访问特定的数据子集
  • 实施细粒度的审计,监控用户的权限操作

Q6: 如何处理权限不足的问题?

A6: 当用户遇到权限不足的问题时,可以采取以下措施:

  • 检查用户是否拥有必要的权限
  • 检查用户的角色是否已激活
  • 检查权限是否被正确授予
  • 如有必要,向数据库管理员请求所需权限