注册
达梦数据库DM8对象管理
专栏/技术分享/ 文章详情 /

达梦数据库DM8对象管理

夏雨雨雨雨雨 2026/08/21 281 0 0
摘要

达梦数据库(DM8)对象管理

在数据库中,我们可以把对象分为两类:模式对象(Schema Objects)非模式对象(Non-Schema Objects)

模式对象:属于某个特定用户(Schema)的,比如表、视图、索引。

非模式对象:全局的,不属于某一个特定用户,比如表空间、用户、角色。

一、模式对象 (Schema Objects)

1.1 表 (Table)

原理:表是数据库中最基础的存储单元,由行(记录)和列(字段)组成。

1.1.1 分类

按用途分为:用户表(用户创建和维护)和系统表(Dm Server创建和维护,不能丢)

按类型分为:索引组织表、堆表、分区表、外部表、临时表,达梦默认索引组织表,orcale默认堆表

DCA考试需要会建表、导入SQL

1.1.2 DM数据类型

数据类型是可表示的集。

字符类型:CHAR类型、CHARACTER类型(与CHAR相同,为了兼容性好)、VARCHAR类型(变长字符串,用多少分多少字节,用法类似CHAR,节省空间)、VRACHAR2类型(与VRACHAR类型)

数值类型:NUMERIC类型、DECIMAL类型、DEC类型(达梦常用)、NUMBER类型(这些数据类型相似)

# 在dmuser创建表t2,里面的数值精度为1,也就是小数位占1位,总长度为3位,整数位只能为1位 CREATE TABLE dmuser.t2(c1 dec(3,1));# 记得写;这样才是一个完整的SQL语句,而且为英文状态的; # 得提交事务,不然会锁超时 commit;

位串数据类型、日期时间数据类型、大字段数据类型

1.1.3 图形化创建表(SYSDBA用户下)

在模式下或在用户下创建表

在某个模式下创建表,即按照题目要求的模式来创建表;

在某个用户下创建表,即在这个用户自动创建的模式下床建表;

在SQL语句中,不带模式名建表,默认建在SYSDBA下,因为当前在SYSDBA用户下。

如下图,在U_DMSALM模式下新建表

image.png

填写表名、列名、数据类型、精度、标度、是否为空、是否为主键、唯一性约束、外键约束

image.png

image.png

建好表后列的顺序是无法更改的,之后添加列会在最后添加,不会在中间插入

1.1.4 往表中导入数据

单行或多行插入数据均可以,也可以指定列插入数据,不指定列插入数据时,需要注意插入的个数与列的个数一致,否则会失败。

下面用DDL语句演示:

多行插入数据:

INSERT INTO DMSALM.EMP(EMPNO, ENAME, HIREDATE, COMM, DEPTNO) VALUES ('1001', '马学铭','2008-05-30',NULL,'101'), ('1002', '程擎武','2012-03-27',NULL,'101'), ('1003', '郑吉群','2010-12-27',NULL,'101'), ('2001', '李慧军','2010-05-15',NULL,'201'), ('2002', '常鹏程','2011-08-06',NULL,'201'); Commit;

补充说明:建表时,主键(Primary Key)用于唯一标识一行,外键(Foreign Key)用于连接两张表,Check 约束用于限制字段的取值(比如成绩必须 0-100)。

ID自增:可以用 IDENTITY(1,1) 实现类似 MySQL 的自增。

表名大小写:不加双引号建的表,查询时不区分大小写;加双引号建的表,查询时必须带双引号且严格区分大小写。

修改数据:

UPDATE dmuser.t_userinfo SET email='hengxin@dameng.com',username = 'hengxin12' WHERE userid = 2;

删除数据:

# DELETE 删除数据时一定要带WHERE条件,不然会删除整张表 DELETE FROM dmuser.t_userinfo WHERE userid = 1;

图形化可直接操作,不过多演示,别忘记点保存。

当多表往里导入时,注意导入顺序,因为有外键,否则会失败。

可以用执行脚本的方式导入插入数据

点击执行脚本图标:

image.png

考试时的SQL脚本存放在/opt/soft目录下,具体视题目而定,直接点击里面的SQL执行即可

image.png

如果导入的数据导错了,怎么清空表,只保留表结构:

# 清空U_DMSALM模式下的SALARY表 TRUNCATE TABLE U_DMSALM.SALARY;

1.1.5 数据库约束

为了保证数据的完整性和一致性。分为:列级和表级。

常见的约束类型:

**主键约束:**唯一标识符、不能为空,会自动勾选非空,建主键时会自动有唯一索引

**外键约束:**跨表引用完整性、可以为空,一个表的外键一定是另一张表的主键,在导表的时候,有外键时先导外键的那张表,注意导入SQL顺序

**唯一约束:**字段值唯一、可以为空

image.png

image.png

**检查约束:**限制值范围或逻辑、可以为空

image.png

image.png

**默认值约束:**自动填充未指定值、可以为空

**非空约束:**禁止为NULL、不能为空

创建表的时候可以添加约束

1.2 视图 (View)

原理:视图本质上是一段被保存下来的 SQL 查询语句。它不占物理存储空间,每次查询视图时,底层数据库都会动态执行那段 SQL。
作用:一是简化复杂的查询(把多表 JOIN 隐藏起来);二是提高安全性(可以只给用户看某些字段,隐藏工资、密码等敏感字段)。

1.2.1 简单视图

基于单表的查询,不含聚合或复杂逻辑

1.2.2 复杂视图

包含多表连接、子查询、聚合函数(如 JOIN、SUM())

1.2.3 物化视图

物化视图本质是预先计算并存储查询结果的物理表,并通过定期或实时刷新来保持与基表的数据同步。

包含物化视图表(MTAB开头)和物化视图,物化视图存储数据,系统在创建物化视图时,会自动创建物化视图和物化视图表。

提升复杂查询性能、降低实时计算开销、支持离线数据分析。

应用于数仓环境,相当于把数据查询好放入,下次直接调用

物化视图刷新:

增量刷新(FAST):根据表上数据更改记录增量刷新

完全刷新(COMPLETE):会删除表中所有记录,根据物化视图定义,重新生成物化视图数据

默认(FORCE):当快速刷新可用时用快速刷新,否则用完全刷新

刷新时机:

定时刷新:START WITH…NEXT,start with指定首次刷新时间,next指定自动刷新的间隔

手工刷新(默认):ON DEMAND,分为 REFRESH、DBMS_MVIEW

自动刷新:ON COMMIT,提交时自动刷新

从不刷新:NEVER REFRESH

创建物化视图的语法:

CREATE MATERIALIZED VIEW 模式名.物化视图名 build immediate refresh on demand force AS SQL;

1.2.4 动态性能视图

动态性能视图是以 V$ 或 G$ 开头的视图,是数据库运行时生成的虚拟表,用于实时监控数据库实例的状态、性能和资源使用情况。

数据存储在内存中,由数据库实例动态更新。

# 系统中所有动态性能视图 SELECT * FROM v$dynamic_table; #数据缓冲池,记录缓冲池页结构的信息 SELECT * FROM v$buffer; #数据文件信息 SELECT * FROM v$datafile; #sql缓冲区中执行计划 SELECT * FROM v$cachepln; #会话信息 SELECT * FROM v$sessions; #阻塞情况 SELECT * FROM v$trxwait;

1.2.5 创建视图

基本语法:

CREATE VIEW 视图名 AS SQL;

**视图有效性:**视图依赖于基表,视图有效性可通过SF_VIEW_EXPIRED函数来检查

视图删除:

drop view if exists v_empnum;

视图更新:

image.png

1.3. 索引 (Index)

1.3.1 概念

类似于书籍的目录,一种数据库对象,通过指针加速查询速度,为有序序列。

索引与表相互独立,且占用存储空间。索引能大幅提升 SELECT 查询速度,但是会拖慢 INSERTUPDATE 的速度(因为每次写数据,不仅要写表,还要重新维护索引)。所以不要什么字段都建索引。

1.3.2 分类

聚簇索引(CLUSTER):一个表只有一个聚簇索引,不会在索引那栏显示出来

非聚簇索引(NOT PARTIAL):唯一/非唯一(普通二级索引)索引、函数索引、组合索引、全局索引和分区索引

1.3.3 创建索引

自动创建索引:定义主键或唯一约束时,数据库会自动在相应列上创建唯一索引

手动创建索引:使用CREATE INDEX语句可以手动在指定列创建索引

-- 创建单列索引 CREATE INDEX IDX_SCORE ON SCORES(SCORE); -- 创建复合索引 (多用这个,效率更高) CREATE INDEX IDX_STU_NAME_CLASS ON STUDENTS(STUDENT_NAME, CLASS_NAME);

1.3.4 属性

失效/有效:默认为有效,无效的索引需要重建

可见/不可见:默认为可见,对执行计划可见;不可见的索引则执行计划不会选择该索引

1.4 序列 (Sequence)

原理:序列是一个计数器,专门用来生成不重复的数字。它不受事务回滚的影响(即使你插数据失败回滚了,序列的数值也会继续往下走,不会回退)。

序列是数据库中生成唯一、有序数字序列的对象,通常用于为表的主键列自动提供唯一值。

满足唯一性、有序性(递增或递减)、高效性

可以自动生成数值,无需手动插入。

CREATE SEQUENCE 模式名.序列名 INCREMENT BY 增量 START WITH 起始值 MAXVALUE 最大值 MINVALUE 最小值;

也可以直接在图形化工具中创建,更简洁。

应用场景:通常用来生成表的主键 ID。

CREATE SEQUENCE SEQ_SCORE_ID START WITH 1 INCREMENT BY 1; INSERT INTO SCORES (SCORE_ID, STUDENT_ID) VALUES (SEQ_SCORE_ID.NEXTVAL, 1001);

1.5 触发器 (Trigger)

原理:触发器是一段在特定事件(插入/更新/删除)发生时自动执行的 PL/SQL 代码
作用:常用于审计日志(谁什么时候改了表)、或者复杂的业务约束(比如更新分数时,自动更新总成绩)

CREATE OR REPLACE TRIGGER TRG_BEFORE_INSERT BEFORE INSERT ON SCORES -- 插入数据前触发 FOR EACH ROW BEGIN DBMS_OUTPUT.PUT_LINE('即将插入一条新成绩'); END;

慎用触发器!因为触发器容易产生“级联触发”(A表触发了B表,B表又触发了C表),导致排查死锁和性能问题非常困难。

1.6 同义词 (Synonym)

原理:给数据库对象起一个别名。
作用屏蔽对象的真实位置。比如你是普通用户,你想查别的用户的一张表,如果不建同义词,你必须写 模式名.表名;建了公有同义词后,你直接写 表名 就可以查到了。

CREATE PUBLIC SYNONYM SYN_SCORES FOR EXAM.SCORES; SELECT * FROM SYN_SCORES;

同义词分为公共同义词(所有用户都能用)和私有同义词(只能自己用)。一般开发环境使用私有同义词隔离风险。

1.7 图形化操作

在图形化中新建模式:

image.png

创建用户会自动生成同名的模式,如下图所示,创建U_DMSALM用户会自动生成U_DMSALM模式

image.png

一个模式只能属于一个用户,一个用户下可以有多个模式

如下图:我创建了DMSALM模式,可以将模式拥有者选择为U_DMSALM,U_DMSALM本身已有U_DMSALM模式,它目前拥有2个模式

image.png

在模式属性中可以看到模式名和模式拥有者

image.png

1.8 DDL语句

点开U_DMSALM模式查看属性,可以看到DDL语句,使用DDL语句创建模式与图形化创建方式的效果一致

image.png

CREATE SCHEMA DMSALM AUTHORIZATION "U_DMSALM";

1.9 角色

一组权限的集合,用于简化权限管理;通过角色,批量回收和分配权限。

可以赋予角色权限、系统权限、对象权限。

grant授予权限 revoke取消权限

系统权限:控制数据库级操作,创建/删除表等DDL语句

对象权限:控制对特定对象的操作,SELECT、INSERT

点击角色右键新建角色,赋予角色系统权限:创建表、视图、存储过程、索引的权限

image.png

CREATE PROCEDURE/SEQUENCE/TRIGGER/SCHEMA/ROLE/SYNONYM/MATERIALIZED VIEW,分别为创建存储过程、创建序列、创建触发器、创建模式、创建角色、创建同义词、创建物化视图

1.10 资源限制

常用资源设置项含义:

**口令有效期:**密码多少天后过期

**口令等待期:**密码修改后,多少天内不能再次修改

**口令宽限期:**密码过期后,用户在多少天内仍可登录

**口令变更次数:**密码必须修改过N次后,才能使用过去用过的旧密码

**口令锁定期:**登录失败达到上限后,账号会被锁定多少分钟

**非活跃用户锁定期:**用户连续多少天没有登录,账号被自动锁定

**登录失败次数:**连续登录失败多少次后,账号被锁定

例题:为用户创建默认的资源配置文件PRO_SALM,要求密码必须修改过 3 次后,才能使用过去用过的密码;并且如果用户超过90天未登录或是登录失败超过5次,则锁定该账号。

image.png

可以在用户这里统一修改资源限制,不用一个个修改,便于管理

image.png

命令行方式用disql登录时,当密码中带有@这个特殊字符时,登录失败该怎么办:

1、可以加上“ ”,比如可以写为"Dameng@123"

2、可以加上‘“ ”’,比如可以写为“‘Dameng@123’”;这里’ '表示转义符

3、可以加上\“ \”,比如可以写为\“Dameng@123\”;这里\表示转义符

1.11 用户

赋予用户创建表、视图、索引的权限

image.png

二、非模式对象 (Non-Schema Objects)

这些对象和具体的某个用户/表无关,属于数据库层面全局控制的。

2.1 表空间 (Tablespace)

2.1.1 DM逻辑存储结构

**物理存储:**由多个数据文件组成

一个表空间可以包括一个或多个数据库文件

一个数据文件只能归属于一个表空间

**逻辑存储结构:**由多个表空间组成,表空间由一个或多个数据文件组成

页(操作系统块)—>簇(不可以跨数据文件)—>段(可以跨数据文件)—>表空间(多个数据文件组成)—>数据库

2.1.2 表空间

原理:表空间是达梦数据库中逻辑存储的最高层。一个数据库可以有多个表空间,一个表空间对应一个或多个操作系统上的.DBF数据文件。
作用:数据库管理员(DBA)可以通过表空间来控制数据存放在哪个磁盘分区,或者控制磁盘空间的使用上限。

建表时,如果你不指定表空间,表会默认放在 MAINSYSTEM 表空间中。在金融/大企业生产环境中,必须区分开:系统表放 SYSTEM,业务数据表放 TS_DATA,索引单独放 TS_INDEX(为了提高IO读写效率)。

作为逻辑容器,用于组织和管理数据库对象的物理存储

1、预定表空间

SYSTEM表空间、ROLL表空间、TEMP表空间、MAIN表空间,由数据库系统自动管理,SYSTEM表空间、ROLL表空间、TEMP表空间不允许脱机。

2、新建表空间

通过图形化界面创建

右键 新建表空间

image.png

添加数据文件,1个表空间最多有256个数据文件

image.png

image.png

写入数据文件的名字,根据考试要求添加数据文件个数,修改文件大小,是否打开自动扩充,扩充尺寸大小,扩充上限大小,注意单位为M,考试如果给G,记得换算单位,1G=1024M

在生产中,所有数据文件的属性最好保持一致

image.png

表空间能容纳的数据量为所有数据文件的上限值之和,最大为20G

2.1.3 表空间的脱机与连接

对MAIN表空间进行脱机,无法查询到他下面的表,但并不影响访问其他的表空间

image.png

不影响对别的表的查询

image.png

查看表空间属性里有DDL语句,这是用命令行方式可以创建表空间

CACHE表示放入普通内存中

create tablespace TSAL datafile '/home/dmdba/dmdbms/data/DMSALM/TSAL_02.DBF' size 512 autoextend on next 32 maxsize 10240, '/home/dmdba/dmdbms/data/DMSALM/TSAL_01.DBF' size 512 autoextend on next 32 maxsize 10240 CACHE = NOMAL;

image.png

2.2 用户 (User)

原理:用户是登录数据库的凭证。在达梦(及 Oracle)中,用户 = 模式(Schema)。你创建一个用户,系统就自动给你生成了一个同名的模式,你建的表默认就在你的模式里。

CREATE USER EXAM IDENTIFIED BY "Exam123456" DEFAULT TABLESPACE TS_EXAM_DATA;

达梦有 SYSDBA(系统管理员,权限最高)和 SYSAUDITOR(审计员,专门看日志,不能改数据)。这体现了职责分离的安全标准。

2.3 权限 (Privileges)

原理:创建了用户不给他赋权限,他什么都做不了(连 SELECT 都查不了)。

权限分为:系统权限(能不能建表、能不能建视图)和对象权限(能不能查某张表、能不能改某张表)。

-- 系统权限 GRANT CREATE TABLE TO EXAM; -- 对象权限 GRANT SELECT, UPDATE ON STUDENTS TO EXAM;

普通用户连登录数据库的权限都没有,必须由管理员(SYSDBA)执行 GRANT CONNECT TO 用户名 赋予登录权限。

2.4 角色 (Role)

原理:假如公司有 10 个开发人员,每个开发人员都需要这 10 个权限。如果你去一个个赋权,会疯掉。
角色就是权限的集合。你先建一个“开发者角色”,把 10 个权限给角色,然后把角色一次性赋予 10 个开发人员。以后权限有变动,只需改角色,10 个人的权限自动一起变动。

CREATE ROLE ROLE_DEV; GRANT CREATE TABLE, CREATE VIEW TO ROLE_DEV; GRANT ROLE_DEV TO EXAM; -- 把角色给用户

角色大大简化了 DBA 管理权限的工作量,考试中常考“为什么需要角色”,答案就是方便统一赋权和统一回收


三、函数/存储过程模板

3.1 DMSQL

3.1.1 DMSQL概念

由关键字BEGIN开始,以关键字EXCEPTION或END结束。

3.1.2 DMSQL执行部分

可执行部分是核心部分,由SQL语句和流程控制语句构成。

1、支持的SQL语句包括:

数据查询语句(SELECT)

数据操纵语句(INSERT / DELETE / UPDATE)

游标定义及操纵语句(DECLARE CURSOR / OPEN / FETCH / CLOSE)

事务控制语句(COMMIT / ROLLBACK / SAVEPOINT)

动态SQL执行语句(EXECUTE IMMEDIATE)

流程控制语句(条件判断(IF THEN)、循环控制(LOOP))

自治事务(PRAGMA AUTONOMOUS_TRANSACTION)

执行部分也可以嵌套匿名块。

2、流程控制语句包括:

条件判断:

IF-THEN-ELSEIF-ELSE、CASE-WHEN、SWITCH

循环控制:

FOR-LOOP

DECLARE a=10 int BEGIN FOR I IN REVERSE 1..a LOOP PRINT I; a:=I-1; END LOOP; END; /

LOOP+EXIT WHEN、WHILE-LOOP、REPEAT-UNTIL、FORALL、CONTINUE

顺序控制:

GOTO、NULL

3.1.3 异常处理

是一种预定义的错误控制机制,当程序遇到错误时,转向特定处理逻辑。使用户遇到错误时弹出的错误解释更清晰。

以EXCEPTION关键字开始,WHEN THEN子句用于处理未被显示捕获的异常.

异常处理语法:

DECLARE --声明部分 BEGIN --执行部分 EXCEPTION --异常处理部分开始 WHEN exception_name1 THEN --处理exception_name1的代码 WHEN exception_name2 THEN --处理exception_name2的代码 ... END;

3.2 存储过程

创建存储过程的语法:

-- 目标:创建一个函数,根据传入的课程名,返回该课程的最高分,并处理异常。 CREATE OR REPLACE FUNCTION FUNC_GET_MAX_SCORE ( p_course_name IN VARCHAR2 -- 传入参数:课程名 ) RETURN NUMBER -- 返回值类型:数字 AS -- 变量声明 v_max_score NUMBER(5,2); v_course_id INT; BEGIN -- 1. 先在 COURSES 表里找对应的课程 ID BEGIN SELECT COURSE_ID INTO v_course_id FROM COURSES WHERE COURSE_NAME = p_course_name; EXCEPTION -- 如果没有找到该课程,直接抛出自定义错误 WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20001, '错误:系统中不存在名为 ' || p_course_name || ' 的课程!'); END; -- 2. 根据找到的课程 ID,查询最高分 SELECT MAX(SCORE) INTO v_max_score FROM SCORES WHERE COURSE_ID = v_course_id; -- 3. 返回值 RETURN NVL(v_max_score, 0); -- 如果最高分是空值,返回 0 EXCEPTION -- 通用的兜底异常处理 WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('发生未预料的系统错误:' || SQLERRM); RETURN -1; -- 发生系统错误时返回 -1 作为异常标记 END; / -- 调用测试: SELECT FUNC_GET_MAX_SCORE('高等数学') FROM DUAL;

3.3 函数

CREATE OR REPLACE FUNCTION 模式名.存储过程名 (传入的参数名1 参数类型1 , 传入的参数名2 参数类型2,...) RETURN 返回值类型(DEC()、VARCHAR) AS --变量声明 变量名1 变量类型1; 变量名2 变量类型2; BEGIN --代码块 [ SELECT 表名1.字段名1,表名2.字段名2,... INTO 变量名1,变量名2, --将查询的结果分别存入变量中 FROM 模式名.表名 JOIN 模式名.表名 ON 主键和外键相同 WHERE 字段值1 = 传入的参数名1 AND 字段值2 = 传入的参数名2; IF 返回需要满足的条件 RETURN 值; ELSE RETURN 值; ENDIF; --异常处理部分 EXCEPTION WHEN OTHRES THEN PRINT(); RETURN ...; --最好替换为:DBMS_OUTPUT.PUT_LINE(); ] END; / #调用函数 select 模式名.存储过程名(输入参数值,输入参数值,...);
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服