DM8中的用户是数据库实例级的身份认证主体,核心作用是完成登录鉴权、资源配额限制、权限主体绑定,不具备任何数据对象存储能力。用户仅承载连接身份、会话限制、密码策略、锁定状态等属性,所有业务对象均不归属用户本身。
DM8内置三类系统管理员账号,实现三权分立安全机制,严格权限隔离:
DM8默认为三权分立模式,包含数据库管理员、数据库安全员、数据库审计员三类角色,满足常规安全管控需求;在更高安全合规场景下,可启用四权分立安全机制,新增独立的数据库对象操作员(SYSDBO)角色。四权分立时数据库管理员只能进行系统管理和维护工作,不能对数据内容进行增删查改操作。数据库操作员可进行增删改查操作,但不能管理和维护系统。
--数据库用户创建后,会自动创建与其同名的模式
SQL> CREATE USER APP_USER IDENTIFIED BY "Dameng123" DEFAULT TABLESPACE DMDATA;
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]
-- 重置用户密码
SQL> ALTER USER APP_USER IDENTIFIED BY "Dm@654321";
-- 解锁锁定用户
SQL> ALTER USER APP_USER ACCOUNT UNLOCK;
模式是数据库对象的逻辑存储容器,是表、视图、索引、序列、存储过程、函数等所有业务对象的唯一归属单元。所有业务数据均存储在指定模式下,模式本身无登录能力,必须依托用户完成访问授权。
模式具备两大核心特性:
--命令行创建模式时,需要指定 / 进行执行
SQL> CREATE SCHEMA APPINFO AUTHORIZATION APP_USER;
2 /
操作已执行
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]不为空.
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
通过用户连接到数据库进行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采用基于角色的访问控制权限,通过「系统权限+对象权限+内置角色」组合,实现全局资源管控与精细化对象权限隔离,适配生产最小权限安全规范。
作用于数据库实例全局,用于授权用户创建、修改、删除数据库资源的能力,涵盖用户、表空间、模式、表、视图、会话等全局对象,未授权用户无法进行资源创建类操作。常见核心系统权限:CREATE SESSION、CREATE TABLE、CREATE VIEW、CREATE SEQUENCE、CREATE USER 等。
--查询用户/角色拥有哪些系统权限
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
SQL> GRANT CREATE TABLE TO APP_USER;
操作已执行
--如果指定 with admin option 代表授权用户可把该权限授权给其他用户
SQL> grant CREATE TABLE to APP_USER with admin option;
注意:grant 使用 with admin option 授权给A用户,A用户把该权限授权给B用户,回收A用户权限,B用户权限不会被级联回收。
SQL> REVOKE CREATE TABLE from APP_USER;
操作已执行
作用于指定模式下的具体业务对象,仅对授权对象生效,用于管控数据读写、程序执行等操作,是生产环境权限精细化管控的核心。常见对象权限:SELECT、INSERT、UPDATE、DELETE、EXECUTE、ALTER 等。
SQL> SELECT GRANTEE,TABLE_NAME,PRIVILEGE FROM DBA_TAB_PRIVS WHERE GRANTEE='APP_USER';
行号 GRANTEE TABLE_NAME PRIVILEGE
---------- -------- ---------- ---------
1 APP_USER CITY SELECT
-- 授予指定表查询、插入权限
SQL> GRANT SELECT,INSERT ON DMHR.CITY TO APP_USER;
操作已执行
-- 授予指定表全部操作权限
SQL> GRANT ALL ON DMHR.CITY TO APP_USER;
操作已执行
--回收对象权限
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');
未选定行
达梦数据库中,角色(Role)本质上是一组权限的集合容器,用来把零散的系统权限、对象权限、以及审计/安全策略权限打包起来,再整体授予用户或其他角色,避免逐条赋权。DM8预置标准化角色,封装权限合集,避免零散授权导致的权限冗余或缺失,适配标准化运维场景。
常见的数据库内置角色如下:
V$ 开头动态性能视图(等待事件、会话、内存、IO、锁、执行计划等监控视图);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
......省略输出
SQL> SELECT GRANTEE,GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE='APP_USER';
行号 GRANTEE GRANTED_ROLE
---------- -------- ------------
1 APP_USER RESOURCE
2 APP_USER PUBLIC
--创建角色
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;
SQL> grant ROLE_APP to APP_USER;
操作已执行
SQL> REVOKE ROLE_APP FROM APP_USER;
操作已执行
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
文章
阅读量
获赞
