外观
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: 当用户遇到权限不足的问题时,可以采取以下措施:
- 检查用户是否拥有必要的权限
- 检查用户的角色是否已激活
- 检查权限是否被正确授予
- 如有必要,向数据库管理员请求所需权限
