注册
权限管理
专栏/技术分享/ 文章详情 /

权限管理

DM_lll 2026/08/28 248 0 0
摘要

权限分配

  • 可以通过GRANT语句将权限(包括数据库权限、对象权限、角色权限和模式权限)分配给用户和角色,之后也可以使用REVOKE语句将授出的权限再进行回收。

1、数据库权限

  • 实例级全局权限,与具体某张表无关,控制 DDL、系统管理类操作,作用整个数据库实例,权限范围大,偏向管理员使用。
    语法授权:
GRANT 系统权限 TO 用户/角色 [WITH ADMIN OPTION];
WITH ADMIN OPTION:允许被授权者把该系统权限继续转授其他用户。
  • 回收特点:回收用户系统权限不会自动级联回收该用户转授出去的权限,转授出去的权限仍然生效,需要手动单独回收。
  • 常用数据库权限
权限 说明 风险等级
CREATE SESSION 登录数据库会话必备权限,新建用户必须授予
CREATE TABLE 在自己的模式下创建表
CREATE VIEW / CREATE PROCEDURE 自建模式创建视图、存储过程
CREATE USER 创建数据库用户
SELECT ANY TABLE 查询实例内所有模式全部表 极高,业务账号禁止授予
ALTER ANY TABLE 修改任意模式下任意表结构 极高
DROP ANY TABLE 删除全库任意表,高危 极高
CREATE ANY TABLE 任意模式下创建表
BACKUP DATABASE 执行数据库备份
  • 视图查询系统权限:DBA_SYS_PRIVS(DBA 查看全库);USER_SYS_PRIVS查看当前用户自身系统权限。

(1)数据库权限分配

示例:SYSDBA授权testuser001创建表的权限,并且可以转授权给其他用户(WITH ADMIN OPTION)。
image.png
在testuser001可以查询到创建表和转授权。
image.png
使用testuser001授权创建表给testuser002。
image.png
在testuser002可以查询到创建表的权限。
image.png

(2)数据库权限回收

示例:SYSDBA收回testuser001创建表的转授权限。
image.png
在testuser001可以查询到已经没有转授创建表的权限。
image.png
SYSDBA收回testuser002创建表的权限。
image.png
在testuser002可以查询到已经没有创建表的权限。
image.png

2、对象权限

  • 针对某一个具体对象(表、视图、存储过程、序列)的细粒度权限,管控 DML 数据操作,作用范围仅限于指定对象,适合普通业务账号。
  • 常见对象权限:
    SELECT 查询;INSERT插入;UPDATE更新;DELETE删除;
    EXECUTE执行存储过程 / 函数;REFERENCES外键引用;
  • 支持列级权限:GRANT UPDATE(col1,col2) ON t1 TO user1,只允许更新指定列。

(1)对象权限分配

示例:SYSDBA把SYSDBA.test表的全部权限授给用户testuser001。
image.png
在testuser001用户下可以查询到SYSDBA.test表中内容。
image.png

(2)对象权限回收

示例:SYSDBA把SYSDBA.test表的全部权限从用户testuser001回收。
image.png
在testuser001用户没有查询权限,无法查询到SYSDBA.test表中内容。
image.png

  • CASCADE 表示级联回收,可回收授予时带或不带 WITH GRANT OPTION 的权限,若带 WITH GRANT OPTION 还会引起级联回收。
    级联回收指不仅收回该用户或角色直接拥有的权限,还同时回收所有因该用户或角色而间接获得这些权限的其他用户或角色的权限。
    例如: A 将 SELECT 授权(选择了 WITH GRANT OPTION)给 B,B 转授给 C,则使用 CASCADE 选项收回 A 的 SELECT 权限时,会将 B 和 C 的 SELECT 权限一同收回。利用此选项时不会检查权限是否存在依赖等限制。另外,利用此选项进行级联回收时,若被回收对象上存在另一条路径授予同样权限给该对象时,则仅需回收当前权限。
  • RESTRICT 表示限制回收,只能回收授予时不带 WITH GRANT OPTION 的权限。无法回收授予时带 WITH GRANT OPTION 的权限,也无法回收存在依赖等限制的权限(如角色上的某权限被别的用户用于创建视图等)。
  • 缺省 < 回收选项 >,表示无法回收授予时带 WITH GRANT OPTION 的权限,但也不会检查要回收的权限是否存在依赖等限制。

3、角色权限

  • 角色就是权限容器,把多条系统 / 对象权限打包进角色,把角色授予用户,实现批量权限管理;角色可以嵌套(角色授予另一个角色)。
角色 权限说明 适用分配场景
DBA 最高权限,几乎全部系统权限、ANY 权限,可建用户、建表空间、备份恢复 只给专职 DBA 运维账号;严禁业务应用账号
RESOURCE 允许在自己的模式创建表、视图、存储过程、索引;不能创建用户、不能操作其他模式对象 业务系统账号,需要自己建业务对象时分配
PUBLIC 所有新建用户自动被授予 PUBLIC 角色;包含基础公共对象访问权限;不建议回收 PUBLIC 角色;GRANT xxx TO PUBLIC会把权限给到全库所有用户,谨慎使用 默认自带,一般不用手动授予
VTI 查询 V$ 开头动态性能视图(会话、等待事件、实例状态监控视图) 运维、监控采集账号;普通业务程序不给
SOI 查询 SYS 开头非安全审计类系统字典表 运维开发人员,查看元数据;业务应用不需要
SVI 基础 V 类系统视图查询权限 运维人员,普通业务账号不分配

(1)角色创建与删除

创建角色test_role1:CREATE ROLE test_role1;
授予查询SYSDBA.test权限:GRANT SELECT ON SYSDBA.test TO test_role1;
删除角色test_role1:DROP ROLE test_role1;
image.png

(2)角色启用与禁用

禁用角色:SP_SET_ROLE(‘TEST_ROLE1’,0);
启用角色:SP_SET_ROLE(‘TEST_ROLE1’,1);
image.png

(3)角色权限分配

将角色TEST_ROLE1的权限授予testuser001
image.png

(4)角色权限回收

将角色TEST_ROLE1的权限从testuser001回收
image.png

4、模式权限

(1)角色创建与删除

首先再dm.ini文件中将GRANT_SCHEMA设置为1。
将testuser001模式下所有表的查询权限授予testuser002;
创建表test_schema,并插入测试数据。
image.png
从testuser002可以查询到插入数据。
image.png
收回testuser002对testuser001模式下所有表的查询权限。
image.png
在testuser002下无法查询testuser001模式下表。
image.png

5、三、四权分立

(1)三权分立

  • 预设账号:SYSDBA(DBA 数据库管理员)、SYSSSO(SSO 数据库安全员)、SYSAUDITOR(AUDITOR 数据库审计员)
  • SYSDBA 数据库管理员 (DBA) 负责数据库软硬件环境评估、安装升级、库结构设计、性能监控调优、备份恢复;拥有系统维护权限,同时可以创建对象、对业务数据做增删改查,拥有ANY类权限。
  • SYSSSO 数据库安全员 (SSO) 负责制定安全策略、定义安全级别/安全标记,实现强制访问控制;给用户、数据库客体打安全标记,约束 DBA 访问受标记保护的数据;可管理安全相关用户权限。不能增删改查业务数据,不能执行普通 DDL 建表建视图,只管安全策略。
  • SYSAUDITOR 数据库审计员 (AUDITOR) 管理审计员账号,配置/取消审计策略,查看、分析审计日志记录;用于追溯数据库各类用户的违规操作行为。
  • 三者互相制约: DBA 管数据库运维与数据;SSO 管访问安全策略限制 DBA;AUDITOR 负责审计监控所有人操作。

(2)四权分立

  • 在三权分立基础上新增 SYSDBO(DBO 数据库对象操作员),SSO、AUDITOR 职责完全不变;核心变化是拆分DBA权限,把对象、数据操作权限从DBA剥离出去交给DBO。
  • SYSDBA 数据库管理员 (DBA) 仅保留数据库系统运维权限:建库、备份、还原、校验、服务器维护。移除:所有 ANY 权限、创建对象、业务数据增删改查、对象权限管理。不能操作业务表数据,不能创建业务对象。
  • SYSDBO 数据库对象操作员 (DBO,新增角色) 负责创建表、视图、存储过程等业务对象;对自己的对象拥有完整权限,可以授予回收对象权限。不能做数据库系统级的管理维护工作。
  • SYSSSO 数据库安全员 (SSO) 和三权分立完全一致,负责强制访问控制、安全标记、安全策略。
  • SYSAUDITOR 数据库审计员 (AUDITOR) 和三权分立完全一致,负责审计策略与审计日志查看分析。

(3)对比

项目 三权分立 四权分立
管理角色 DBA、SSO、AUDITOR DBA、DBO、SSO、AUDITOR
DBA 权限 系统运维 + 创建对象 + 数据增删改查,拥有 ANY 权限 仅系统运维;取消 ANY 权限,不能操作业务对象和业务数据
对象/数据操作 DBA 完成 交给新增 DBO 对象操作员完成
SSO、AUDITOR 负责安全策略、审计 职责完全不变
启用条件 默认,普通版本可用 DM 安全版本,PRIV_FLAG=1

6、场景

1:客户上线新业务系统,新建业务用户,一般给什么权限?

  • 遵循最小权限原则:

(1)如果业务账号需要自己创建表、视图、存储过程等业务对象:

CREATE USER USER001 IDENTIFIED BY "Dameng123";
GRANT CREATE SESSION TO USER001;    --登录会话权限
GRANT RESOURCE TO USER001;          --允许在自己模式创建业务对象
GRANT SELECT ON V$DM_INI TO USER001;

image.png
image.png

  • PUBLIC 角色新建用户默认自带,无需手动授予。
  • 不需要给 DBA、VTI、SOI,业务应用不需要访问系统视图。
  • 需赋予查询V$DM_INI权限,否则在登录manager时会报错。

(2)如果业务账号只做查询、增删改,不需要建任何对象: 不要授予 RESOURCE;只授予对应表的对象权限,或者模式权限。

CREATE USER USER002 IDENTIFIED BY "Dameng123";
GRANT CREATE SESSION TO USER002;
--按需授予对象权限
GRANT SELECT,INSERT,UPDATE,DELETE ON biz_user.t1 TO USER002;

image.png

  • 生产严禁:给业务账号授予DBA、SELECT ANY TABLE、ALTER ANY TABLE等高风险权限。

2:数据库迁移,如何获取源端原有用户权限,在目标端复现相同权限

迁移时需要导出源库用户、角色、系统权限、对象权限、模式权限,再在目标端执行。

  • 方式 1:达梦 dexp 逻辑导出
    使用 dexp 工具,只导出用户权限、角色,不导出业务数据对象。
# 导出所有用户、角色、权限元数据
dexp USERID=SYSDBA/SYSDBA FILE=user_priv.dmp LOG=user_priv.log FULL=N OWNER=ALL ROLES=Y PERMISSION=Y
# 在目标端 dimp 导入,就会重建用户、角色、授予对应系统权限与角色。
  • 方式 2:查询系统视图手工提取权限 SQL
    (1)查询用户拥有的系统权限
SELECT 'GRANT '||PRIVILEGE||' TO '||USERNAME||';' FROM USER_SYS_PRIVS;

image.png

(2)查询用户拥有的角色

SELECT 'GRANT '||GRANTED_ROLE||' TO '||USERNAME||';' FROM USER_ROLE_PRIVS;

image.png

(3)查询用户拥有的对象权限

SELECT 'GRANT '||PRIVILEGE||' ON '||OWNER||'.'||TABLE_NAME||' TO '||GRANTEE||';' 
FROM USER_TAB_PRIVS;

image.png

  • 注意:视图查询只会查询当前登录用户可见权限;建议使用 SYSDBA 账号查询DBA_SYS_PRIVS、DBA_ROLE_PRIVS、DBA_TAB_PRIVS全量视图,拿到完整权限脚本。
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服