注册
DM8数据库用户与权限管理
技术分享/ 文章详情 /

DM8数据库用户与权限管理

BigQ 2026/08/07 222 0 0

一 数据库用户与模式

1.1 数据库用户(User)

1.1.1 用户基本概念

DM8中的用户是数据库实例级的身份认证主体,核心作用是完成登录鉴权、资源配额限制、权限主体绑定,不具备任何数据对象存储能力。用户仅承载连接身份、会话限制、密码策略、锁定状态等属性,所有业务对象均不归属用户本身。

DM8内置三类系统管理员账号,实现三权分立安全机制,严格权限隔离:

  • SYSDBA:数据库管理员,拥有实例全部权限,负责日常运维、用户创建、权限分配、资源管理;
  • SYSSSO:数据库安全员,专职负责安全策略、密码规则、权限审计配置;
  • SYSAUDITOR:数据库审计员,负责数据库日志审计、操作记录核查;

DM8默认为三权分立模式,包含数据库管理员、数据库安全员、数据库审计员三类角色,满足常规安全管控需求;在更高安全合规场景下,可启用四权分立安全机制,新增独立的数据库对象操作员(SYSDBO)角色。四权分立时数据库管理员只能进行系统管理和维护工作,不能对数据内容进行增删查改操作。数据库操作员可进行增删改查操作,但不能管理和维护系统。

1.1.2 数据库用户管理

  1. 创建数据库用户
--数据库用户创建后,会自动创建与其同名的模式 SQL> CREATE USER APP_USER IDENTIFIED BY "Dameng123" DEFAULT TABLESPACE DMDATA;
  1. 删除数据库用户
  • 删除空用户,用户下无业务对象;
SQL> DROP USER APP_USER; 操作已执行
  • 级联删除用户,该操作会连带删除该用户下所有模式
SQL> DROP USER APP_USER CASCADE ; 操作已执行
  • 异常情况:该用户下存在业务对象,不进行级联删除会报错;
--如果该用户下存在业务对象,会提示:错误[-2639]:试图删除被依赖对象[APP_USER] SQL> DROP USER APP_USER ; DROP USER APP_USER ; 第1 行附近出现错误[-2639]:试图删除被依赖对象[APP_USER]
  1. 修改数据库用户
-- 重置用户密码 SQL> ALTER USER APP_USER IDENTIFIED BY "Dm@654321"; -- 解锁锁定用户 SQL> ALTER USER APP_USER ACCOUNT UNLOCK;

1.2 数据库模式(Schema)

1.2.1 模式基本概念

模式是数据库对象的逻辑存储容器,是表、视图、索引、序列、存储过程、函数等所有业务对象的唯一归属单元。所有业务数据均存储在指定模式下,模式本身无登录能力,必须依托用户完成访问授权。

模式具备两大核心特性:

  1. 默认绑定机制:新建用户时,系统自动创建一个同名模式,该模式默认归属当前用户;
  2. 解绑复用机制:支持用户与模式解耦,单个用户可绑定多个不同模式,单个模式只能归属一个用户,完美适配多业务、多模块数据隔离场景。

1.2.2 数据库模式管理

  1. 创建数据库模式
--命令行创建模式时,需要指定 / 进行执行 SQL> CREATE SCHEMA APPINFO AUTHORIZATION APP_USER; 2 / 操作已执行
  1. 删除数据库模式
  • 删除空模式,模式下无业务对象;
SQL> drop schema appinfo; 操作已执行
  • 级联删除模式及对象
SQL> drop schema appinfo cascade; 操作已执行
  • 异常情况:
    • 当前会话正在连接被删除的模式
SQL> SELECT SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') AS CURR_SCHEMA FROM DUAL; 行号 CURR_SCHEMA ---------- ----------- 1 APPINFO SQL> drop schema appinfo; drop schema appinfo; 第1 行附近出现错误[-6509]:当前对象被占用.
  • 模式下存在业务对象,删除异常,需要进行级联删除
SQL> drop schema appinfo; drop schema appinfo; 第1 行附近出现错误[-5001]:模式[APPINFO]不为空.
  1. 查询用户下有哪些模式
SQL> SELECT A.NAME AS 模式名, B.USERNAME AS 所有者 FROM SYSOBJECTS A JOIN DBA_USERS B ON A.PID=B.USER_ID WHERE A.TYPE$='SCH' and B.USERNAME='APP_USER'; 行号 模式名 所有者 ---------- --------- --------- 1 APP_USER APP_USER 2 APPINFO APP_USER
  1. 切换数据库模式

通过用户连接到数据库进行DML时,默认在同名的模式下进行操作,如需要切换到该用户下的其他模式下,需要进行指定模式。一个用户有多个模式时,不同模式之间的对象互相有DML、DDL权限,操作其他模式下的对象时需要指定模式名称。

SQL> SET SCHEMA APPINFO;

示例:

--1. 连接APP_USER用户 SQL> conn app_user/Dameng123; --2. 查询会话当前所处模式 SQL> SELECT SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') AS CURR_SCHEMA FROM DUAL; 行号 CURR_SCHEMA ---------- ----------- 1 APP_USER --3. 创建T100表 SQL> create table t100 as select * from emp; 操作已执行 --4. 查询T100表属性,创建的 T100 表在 APP_USER 模式下 SQL> select T.OWNER,T.TABLE_NAME from DBA_TABLES T where t.TABLE_NAME='T100'; 行号 OWNER TABLE_NAME ---------- -------- ---------- 1 APP_USER T100 --5. 切换数据库模式 SQL> set schema appinfo; 操作已执行 --6. 查询当前会话所属模式 SQL> SELECT SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') AS CURR_SCHEMA FROM DUAL; 行号 CURR_SCHEMA ---------- ----------- 1 APPINFO --7. 创建T100表 SQL> create table t100 as select * from app_user.emp; 操作已执行 --8. 再次查询T100表属性,新创建的 T100 在 APPINFO 模式下 SQL> select T.OWNER,T.TABLE_NAME from DBA_TABLES T where t.TABLE_NAME='T100'; 行号 OWNER TABLE_NAME ---------- -------- ---------- 1 APP_USER T100 2 APPINFO T100 --9. 对 APP_USER 模式下的 T100 进行删除操作 SQL> delete from app_user.t100; 影响行数 14 SQL> drop table app_user.t100; 操作已执行 --10. 再次查询T100表 SQL> select T.OWNER,T.TABLE_NAME from DBA_TABLES T where t.TABLE_NAME='T100'; 行号 OWNER TABLE_NAME ---------- ------- ---------- 1 APPINFO T100

二 主流数据库与达梦概念异构映射

在异构数据库迁移场景中,库、用户、模式的概念混淆是导致表结构导入失败、权限失效、业务访问异常的主要原因。本节对齐 MySQL、SQL Server、Oracle 与 DM8 的逻辑单元,为迁移工作提供标准化适配依据。

数据库类型 Database(数据库) User(用户) Schema(模式) 迁移适配核心规则
MySQL 逻辑与物理合一的容器,Database 即 Schema 仅承担身份认证,不持有任何数据对象 无独立语义,与 Database 完全重合 库转模式:MySQL一库一业务 → DM8一模式一业务,需为每个原库新建独立模式
SQL Server 实例级独立容器,内部承载多个 Schema 实例登录主体 库内的对象命名空间,独立于 User 存在 层级降维:原 database.schema.object 写作法在 DM8 中降维为 schema.object。建议废弃默认的 dbo 命名空间,按业务库拆分映射为 DM8 独立用户。
Oracle 数据库实例,为存储与运行的全局环境 兼具登录与资源持有属性,User 即 Schema 主体 与 User 强绑定,创建用户时自动生成 同源兼容:架构模型与 DM8 完全一致。User 与 Schema 原样保留,权限与对象全限定名无需改写,迁移成本最低。
DM8 全局唯一数据库实例 实例级登录鉴权主体,负责权限继承与资源隔离,一个用户可以同时有多个模式 业务对象的逻辑容器,User 创建即生成 同名Schema,一个模式同时只能属于一个用户 统一收敛:DM8 仅保留一层命名空间。应用侧连接串须去除库名概念,统一使用 模式名.对象名 进行业务访问。

三 数据库权限与角色

DM8采用基于角色的访问控制权限,通过「系统权限+对象权限+内置角色」组合,实现全局资源管控与精细化对象权限隔离,适配生产最小权限安全规范。

3.1 数据库权限分类

3.1.1 系统权限

作用于数据库实例全局,用于授权用户创建、修改、删除数据库资源的能力,涵盖用户、表空间、模式、表、视图、会话等全局对象,未授权用户无法进行资源创建类操作。常见核心系统权限:CREATE SESSION、CREATE TABLE、CREATE VIEW、CREATE SEQUENCE、CREATE USER 等。

  1. 查询用户/角色拥有哪些系统权限
--查询用户/角色拥有哪些系统权限 SQL> SELECT P.GRANTEE,P.PRIVILEGE,P.ADMIN_OPTION FROM DBA_SYS_PRIVS P WHERE P.GRANTEE='APP_USER'; 行号 GRANTEE PRIVILEGE ADMIN_OPTION ---------- -------- -------------- ------------ 1 APP_USER CREATE SESSION NO
  1. 授予用户/角色系统权限
SQL> GRANT CREATE TABLE TO APP_USER; 操作已执行 --如果指定 with admin option 代表授权用户可把该权限授权给其他用户 SQL> grant CREATE TABLE to APP_USER with admin option;
  1. 回收用户/角色系统权限

注意:grant 使用 with admin option 授权给A用户,A用户把该权限授权给B用户,回收A用户权限,B用户权限不会被级联回收。

SQL> REVOKE CREATE TABLE from APP_USER; 操作已执行

3.1.2 对象权限

作用于指定模式下的具体业务对象,仅对授权对象生效,用于管控数据读写、程序执行等操作,是生产环境权限精细化管控的核心。常见对象权限:SELECT、INSERT、UPDATE、DELETE、EXECUTE、ALTER 等。

  1. 查询用户/角色拥有哪些对象权限
SQL> SELECT GRANTEE,TABLE_NAME,PRIVILEGE FROM DBA_TAB_PRIVS WHERE GRANTEE='APP_USER'; 行号 GRANTEE TABLE_NAME PRIVILEGE ---------- -------- ---------- --------- 1 APP_USER CITY SELECT
  1. 授予用户/角色对象权限
-- 授予指定表查询、插入权限 SQL> GRANT SELECT,INSERT ON DMHR.CITY TO APP_USER; 操作已执行 -- 授予指定表全部操作权限 SQL> GRANT ALL ON DMHR.CITY TO APP_USER; 操作已执行
  1. 回收用户/角色对象权限
--回收对象权限 SQL> revoke SELECT on DMHR.CITY FROM TUSER1 ; 操作已执行 --级联回收对象权限 SQL> revoke SELECT on DMHR.CITY FROM TUSER1 cascade; 操作已执行

注意:grant 使用 with grant option 授权给A用户,A用户把该权限授权给B用户,回收A用户权限,会提示误[-5582]:回收权限无效,此时需要进行级联回收权限,对A用户进行级联回收权限时,B用户权限也会进行回收。

示例:

--1. 使用 with grant option 选项,将 DMHR.CITY 的 SELECT 授权给 TUSER1 SQL> GRANT SELECT ON DMHR.CITY TO TUSER1 with grant option; 操作已执行 --2. TUSER1 用户将权限授权给TUSER2 SQL> GRANT SELECT ON DMHR.CITY TO TUSER2; 操作已执行 --3. 查询用户对象权限 SQL> SELECT GRANTEE,TABLE_NAME,PRIVILEGE,GRANTOR,GRANTABLE FROM DBA_TAB_PRIVS WHERE GRANTEE IN ('TUSER1','TUSER2'); 行号 GRANTEE TABLE_NAME PRIVILEGE GRANTOR GRANTABLE ---------- ------- ---------- --------- ------- --------- 1 TUSER1 CITY SELECT SYSDBA YES 2 TUSER2 CITY SELECT TUSER1 NO --4. 回收 TUSER1 权限 SQL> revoke SELECT on DMHR.CITY FROM tuser1; revoke SELECT on DMHR.CITY FROM tuser1; 第1 行附近出现错误[-5582]:回收权限无效. --5. 需要进行级联回收该权限 SQL> revoke SELECT on DMHR.CITY FROM TUSER1 cascade; 操作已执行 --6. 再次查询用户对象权限 SQL> SELECT GRANTEE,TABLE_NAME,PRIVILEGE,GRANTOR,GRANTABLE FROM DBA_TAB_PRIVS WHERE GRANTEE IN ('TUSER1','TUSER2'); 未选定行

3.2 数据库角色

3.2.1 角色基本概念

达梦数据库中,角色(Role)本质上是一组权限的集合容器,用来把零散的系统权限、对象权限、以及审计/安全策略权限打包起来,再整体授予用户或其他角色,避免逐条赋权。DM8预置标准化角色,封装权限合集,避免零散授权导致的权限冗余或缺失,适配标准化运维场景。

常见的数据库内置角色如下:

  • DBA:超级权限角色,拥有实例所有系统权限与对象权限,仅限运维管理员使用,生产业务用户禁止赋予;
  • RESOURCE:业务开发核心角色,拥有创建表、视图、索引、存储过程等业务对象权限,无用户、表空间等高级管理权限;
  • PUBLIC:默认公共角色,所有新建用户自动继承,仅包含基础会话、基础查询权限,无对象创建权限;
  • SOI:系统基表查询角色;可访问 SYS 模式下底层系统数据字典基表(非视图),底层系统元数据存储表;
  • VTI:动态性能视图查询角色;专门用于查询所有 V$ 开头动态性能视图(等待事件、会话、内存、IO、锁、执行计划等监控视图);
  • SVI:具有基础 V 视图的查询权限;对比 **VTI **,SVI 权限范围更小、权限更收敛,默认自动授予 PUBLIC 全体用户,仅可查询基础、低敏感的 V$ 动态视图;

可通过如下SQL查询数据库内置角色的访问权限:

--1. 查询 SOI 可访问的对象 SQL> SELECT OWNER,TABLE_NAME,PRIVILEGE FROM DBA_TAB_PRIVS WHERE GRANTEE='SOI'; 行号 OWNER TABLE_NAME PRIVILEGE ---------- ----- --------------- --------- 1 SYS SYSOBJECTS SELECT 2 SYS SYSINDEXES SELECT ......省略输出 --2. 查询 SVI 可访问的对象 SQL> SELECT OWNER,TABLE_NAME,PRIVILEGE FROM DBA_TAB_PRIVS WHERE GRANTEE='SVI'; 行号 OWNER TABLE_NAME PRIVILEGE ---------- ----- ------------------ --------- 1 SYS VSYSACCHISTORIES SELECT 2 SYS VSYSDISTABLEINFO SELECT ......省略输出 --3. 查询 VTI 可访问的对象 SQL> SELECT NAME FROM V$DYNAMIC_TABLES ORDER BY NAME; 行号 NAME ---------- ---------------------------- 1 GV$DM_INI 2 GV$DPC_CENTER_COMPRESS_LEVEL 3 GV$ERROR_PAGE ......省略输出

3.2.2 数据库角色维护

  1. 查询用户拥有哪些角色
SQL> SELECT GRANTEE,GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE='APP_USER'; 行号 GRANTEE GRANTED_ROLE ---------- -------- ------------ 1 APP_USER RESOURCE 2 APP_USER PUBLIC
  1. 创建数据库角色
--创建角色 SQL> create role ROLE_APP; --给角色授予权限 SQL> grant CREATE TABLE,CREATE VIEW,CREATE INDEX to ROLE_APP with admin option; SQL> grant SELECT,INSERT on "DMHR"."EMPLOYEE" to ROLE_APP;
  1. 授予用户数据库角色
SQL> grant ROLE_APP to APP_USER; 操作已执行
  1. 回收用户的数据库角色
SQL> REVOKE ROLE_APP FROM APP_USER; 操作已执行
  1. 角色的禁用与启用

DM8 系统内置角色(DBA、RESOURCE、PUBLIC 等)默认永久启用,不支持手动禁用;仅用户自行创建的自定义角色,支持启用、禁用状态切换。角色被禁用后,已授予该角色的用户将临时失去该角色所有权限,无需回收权限,启用后权限自动恢复,适合临时权限管控场景。

--禁用数据库角色 SQL> SP_SET_ROLE('BOOKSHOP_ROLE1', 0); --启用数据库角色 SQL> SP_SET_ROLE('BOOKSHOP_ROLE1', 1);

示例:

--1. 创建角色授予权限 SQL> create role APP_ROLE; SQL> grant SELECT on DMHR.EMPLOYEE to APP_ROLE; --2. 创建用户,授予APP_ROLE角色 SQL> CREATE USER TUSER4 IDENTIFIED BY "Dameng123"; SQL> grant APP_ROLE to TUSER4; --3.登录TUSER4并进行查询业务数据 SQL> conn tuser4/Dameng123; 服务器[LOCALHOST:5236]:处于普通打开状态 登录使用时间 : 3.362(ms) SQL> select count(*) from DMHR.EMPLOYEE; 行号 COUNT(*) ---------- -------------------- 1 856 --4. 临时禁用APP_ROLE角色 SQL> sp_set_role('APP_ROLE',0); DMSQL 过程已成功完成 --5. 查询业务数据 SQL> select count(*) from DMHR.EMPLOYEE; select count(*) from DMHR.EMPLOYEE; [-5504]:没有[DMHR.EMPLOYEE]对象的查询权限. --6. 启用APP_ROLE角色 SQL> sp_set_role('APP_ROLE',1); DMSQL 过程已成功完成 --7. 再次查询业务数据 SQL> select count(*) from DMHR.EMPLOYEE; 行号 COUNT(*) ---------- -------------------- 1 856

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服