前言

达梦数据库(DM)作为国产数据库的代表产品,在信创领域应用越来越广泛。本文将从实操角度出发,系统介绍达梦数据库中模式对象的创建与使用方法,以及非模式对象中的用户、角色、权限管理体系。全文基于disql命令行工具进行验证,涵盖序列、表与约束、索引、视图、同义词、触发器、表空间、用户管理、角色权限等核心知识点,适合达梦数据库初学者参考学习。

一、序列(SEQUENCE)

1.1 什么是序列

序列是达梦数据库中用于生成连续整数的数据库对象,常用于自动生成主键值。与MySQL的自增主键不同,达梦数据库通过序列对象来实现自增功能,一个序列可以被多个表共享使用。

1.2 创建序列

使用CREATE SEQUENCE语句创建序列,可以指定起始值、步长、最大值、最小值、是否循环、缓存大小等参数。

CREATE SEQUENCE SEQ_USER_ID START WITH 1 INCREMENT BY 1 CACHE 20; CREATE SEQUENCE SEQ_LOG_ID START WITH 1 INCREMENT BY 1 CACHE 20;

参数说明:

  • START WITH:序列起始值,默认1

  • INCREMENT BY:步长,每次增长的数值,默认1

  • CACHE:缓存大小,预分配的序列值数量,提高性能

  • MAXVALUE / NOMAXVALUE:最大值

  • MINVALUE / NOMINVALUE:最小值

  • CYCLE / NOCYCLE:达到最大值后是否循环

注意:如果重复创建同名序列,会报错[-2223]:序列已存在。

1.3 查询序列

通过数据字典视图USER_SEQUENCES可以查询当前用户下的所有序列信息。

SELECT SEQUENCE_NAME, MIN_VALUE, MAX_VALUE, INCREMENT_BY, CACHE_SIZE FROM USER_SEQUENCES;

1.4 使用序列

使用NEXTVAL获取下一个序列值,CURRVAL获取当前序列值。

-- 获取下一个序列值 SELECT SEQ_USER_ID.NEXTVAL FROM DUAL;

-- 获取当前序列值 SELECT SEQ_USER_ID.CURRVAL FROM DUAL;

二、表与约束(TABLE & CONSTRAINT)

2.1 创建表

表是数据库中最基本的存储对象,用于存储结构化数据。达梦数据库支持多种约束来保证数据完整性。

创建部门表(主表)

CREATE TABLE DEPT( DEPT_ID INT PRIMARY KEY, DEPT_NAME VARCHAR(50) NOT NULL UNIQUE, CREATE_TIME DATETIME DEFAULT SYSDATE );

创建用户表(从表,含外键)

CREATE TABLE USER_INFO( USER_ID BIGINT, USERNAME VARCHAR(50) NOT NULL, REAL_NAME VARCHAR(50) NOT NULL, PHONE VARCHAR(20), DEPT_ID INT, TATUS CHAR(1) DEFAULT '1' NOT NULL,CREATE_TIME DATETIME DEFAULT SYSDATE NOT NULL, CONSTRAINT PK_USER_INFO PRIMARY KEY(USER_ID), CONSTRAINT UK_USER_USERNAME UNIQUE(USERNAME), CONSTRAINT UK_USER_PHONE UNIQUE(PHONE), CONSTRAINT CK_USER_STATUS CHECK(STATUS IN ('0','1')), CONSTRAINT FK_USER_DEPT FOREIGN KEY(DEPT_ID) REFERENCES DEPT(DEPT_ID) );

2.2 约束类型详解

约束类型

说明

PRIMARY KEY

主键约束,保证列值唯一且非空

UNIQUE

唯一约束,保证列值唯一,允许为空

NOT NULL

非空约束,列值不允许为空

DEFAULT

默认值约束,插入数据时未指定则使用默认值

CHECK

检查约束,限制列值的取值范围

FOREIGN KEY

外键约束,保证引用完整性

注意:创建外键约束时,必须先创建主表(被引用的表),再创建从表,否则会创建失败。

2.3 插入数据

结合序列自动生成主键值插入数据:

INSERT INTO DEPT(DEPT_ID, DEPT_NAME) VALUES(SEQ_DEPT_ID.NEXTVAL, '技术部'); INSERT INTO DEPT(DEPT_ID, DEPT_NAME) VALUES(SEQ_DEPT_ID.NEXTVAL, '市场部'); INSERT INTO USER_INFO(USER_ID, USERNAME, REAL_NAME, PHONE, DEPT_ID) VALUES(SEQ_USER_ID.NEXTVAL, 'admin', '管理员', '13800138000', 1); INSERT INTO USER_INFO(USER_ID, USERNAME, REAL_NAME, PHONE, DEPT_ID) VALUES(SEQ_USER_ID.NEXTVAL, 'zhangsan', '张三', '13800138001', 1); COMMIT;

三、索引(INDEX)

3.1 索引的作用

索引是用于加速数据查询的数据库对象,类似于书籍的目录。通过在经常查询的列上创建索引,可以显著提高查询效率。但索引也会增加数据插入、更新、删除的开销,需要合理设计。

3.2 创建索引

单列索引

CREATE INDEX IDX_USER_REALNAME ON USER_INFO(REAL_NAME);

复合索引

CREATE INDEX IDX_USER_DEPT_STATUS ON USER_INFO(DEPT_ID, STATUS);

索引设计原则:

  • 经常出现在WHERE条件中的列适合建索引

  • 区分度高的列(如主键、唯一键)索引效果好

  • 复合索引遵循最左前缀原则

  • 不要在频繁更新的表上建过多索引

四、视图(VIEW)

4.1 什么是视图

视图是基于SQL查询结果的虚拟表,本身不存储数据,数据来自于底层的基表。视图可以简化复杂查询、提供数据安全保护(只暴露部分字段)、以及统一数据访问接口。

4.2 创建视图

CREATE OR REPLACE VIEW V_USER_DEPT AS SELECT u.USER_ID, u.USERNAME, u.REAL_NAME, u.PHONE, d.DEPT_NAME, u.STATUS, u.CREATE_TIME FROM USER_INFO u LEFT JOIN DEPT d ON u.DEPT_ID = d.DEPT_ID;

创建完成后,可以像查询普通表一样查询视图:

SELECT * FROM V_USER_DEPT;

五、同义词(SYNONYM)

5.1 同义词的作用

同义词是数据库对象的别名,主要作用有:

  • 简化对象访问路径,不用写完整的模式名.对象名

  • 提高安全性,隐藏真实的对象所有者和名称

  • 方便应用迁移,修改同义词指向即可切换数据源

5.2 创建同义词

CREATE SYNONYM SYN_USER FOR USER_INFO;

创建后可以直接通过同义词访问表:

SELECT * FROM SYN_USER;

六、触发器(TRIGGER)

6.1 什么是触发器

触发器是一种特殊的存储过程,当特定事件(如INSERT、UPDATE、DELETE)发生在指定的表上时,会自动执行。常用于数据审计、数据校验、级联更新等场景。

6.2 创建审计触发器

下面创建一个用户表操作审计触发器,记录所有增删改操作:

第一步:创建日志表

CREATE TABLE USER_OP_LOG( LOG_ID BIGINT PRIMARY KEY, OP_TIME DATETIME, OP_TYPE VARCHAR(10), USER_ID BIGINT, USERNAME VARCHAR(50) );

第二步:创建触发器

CREATE OR REPLACE TRIGGER TRG_USER_AUDIT AFTER INSERT OR UPDATE OR DELETE ON USER_INFO FOR EACH ROW BEGIN IF INSERTING THEN INSERT INTO USER_OP_LOG VALUES(SEQ_LOG_ID.NEXTVAL, SYSDATE, 'INSERT', :NEW.USER_ID, :NEW.USERNAME); ELSIF UPDATING THEN INSERT INTO USER_OP_LOG VALUES(SEQ_LOG_ID.NEXTVAL, SYSDATE, 'UPDATE', :NEW.USER_ID, :NEW.USERNAME); ELSIF DELETING THEN INSERT INTO USER_OP_LOG VALUES(SEQ_LOG_ID.NEXTVAL, SYSDATE, 'DELETE', :OLD.USER_ID, :OLD.USERNAME); END IF; END;

关键知识点:

  • AFTER:在操作完成后触发,BEFORE则是操作前触发

  • FOR EACH ROW:行级触发器,每影响一行触发一次

  • :NEW:伪记录,表示新的数据行(INSERT和UPDATE时可用)

  • :OLD:伪记录,表示旧的数据行(UPDATE和DELETE时可用)

  • INSERTING / UPDATING / DELETING:条件谓词,判断当前触发的操作类型

七、表空间(TABLESPACE)

7.1 表空间概述

表空间是达梦数据库的逻辑存储单元,由一个或多个数据文件组成。所有的数据库对象(表、索引等)都存储在表空间中。合理规划表空间是数据库运维的重要工作。

7.2 创建表空间

CREATE TABLESPACE TS_DATA DATAFILE 'C:\dmdbms\data\DAMENG\ts_data01.dbf' SIZE 1024 AUTOEXTEND ON NEXT 100 MAXSIZE 10240;

参数说明:

  • DATAFILE:指定数据文件路径和初始大小

  • AUTOEXTEND ON:开启自动扩展

  • NEXT:每次扩展的大小

  • MAXSIZE:最大文件大小

7.3 修改表空间(扩容)

当表空间不足时,可以添加新的数据文件进行扩容:

ALTER TABLESPACE TS_DATA ADD DATAFILE 'C:\dmdbms\data\DAMENG\ts_data02.dbf' SIZE 1024 AUTOEXTEND ON NEXT 100 MAXSIZE 10240;

八、用户管理(USER)

8.1 创建用户

CREATE USER CHUN IDENTIFIED BY "Chun260711" DEFAULT TABLESPACE TS_DATA TEMPORARY TABLESPACE TEMP;

参数说明:

  • IDENTIFIED BY:指定用户密码

  • DEFAULT TABLESPACE:默认表空间,用户创建对象时的默认存储位置

  • TEMPORARY TABLESPACE:临时表空间,用于排序、临时表等操作

8.2 用户维护操作

-- 锁定账号 ALTER USER CHUN ACCOUNT LOCK;

-- 解锁账号 ALTER USER CHUN ACCOUNT UNLOCK;

-- 分配表空间配额 ALTER USER CHUN QUOTA UNLIMITED ON TS_DATA;

-- 修改密码 ALTER USER CHUN IDENTIFIED BY "NewPassword123";

九、角色与权限管理(ROLE & PRIVILEGE)

9.1 权限体系概述

达梦数据库的权限分为两类:

  • 系统权限:创建表、创建视图、创建会话等数据库级别的权限

  • 对象权限:对某个具体表的SELECT、INSERT、UPDATE、DELETE等权限

角色是权限的集合,可以将多个权限授予角色,再将角色授予用户,实现批量权限管理。

9.2 创建角色

CREATE ROLE biz_admin_role; CREATE ROLE biz_read_role;

9.3 授予系统权限

GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO biz_admin_role;

9.4 授予对象权限

GRANT SELECT, INSERT, UPDATE ON CHUN.EMPLOYEE TO biz_admin_role;

9.5 将角色授予用户

GRANT biz_admin_role TO CHUN;

9.6 权限回收

-- 回收角色 REVOKE biz_admin_role FROM CHUN; -- 回收系统权限 REVOKE CREATE VIEW FROM biz_admin_role; -- 删除角色 DROP ROLE biz_read_role;

十、总结与展望

10.1 本文总结

本文系统介绍了达梦数据库的模式对象和非模式对象的基本操作,包括序列、表与约束、索引、视图、同义词、触发器等模式对象的创建与使用,以及表空间、用户、角色权限等非模式对象的管理方法。这些都是达梦数据库开发和运维的基础技能,需要熟练掌握。

10.2 后续学习方向

掌握了基础对象操作后,可以继续深入学习以下内容:

  • 性能优化:dm.ini参数调优、SQL优化、执行计划分析

  • 备份恢复:dexp/dimp逻辑备份、dmrman物理备份

  • 自动化运维:定时备份作业、监控告警

  • 高可用集群:主备集群、读写分离集群搭建与故障切换

10.3 写在最后

达梦数据库作为国产数据库的佼佼者,语法和Oracle高度兼容,有Oracle基础的同学上手会非常快。建议大家多动手实操,通过实际案例加深理解。

如果本文对你有帮助,欢迎点赞、收藏、关注!有任何问题也可以在评论区交流讨论。

运维指南 | 达梦技术文档

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐