达梦数据库入门:模式对象与权限体系完整实操指南
前言
达梦数据库(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基础的同学上手会非常快。建议大家多动手实操,通过实际案例加深理解。
如果本文对你有帮助,欢迎点赞、收藏、关注!有任何问题也可以在评论区交流讨论。
更多推荐




所有评论(0)