ITPub博客

首页 > 数据库 > 国内数据库 > DM数据库对象管理总结

DM数据库对象管理总结

原创 国内数据库 作者:liujiujiu 时间:2026-07-29 09:16:11 0 删除 编辑

1.概念

1.1 数据库和实例

数据库:同时出现 DM 数据库和实例时,DM 数据库指的是磁盘上存放在 DM 数据库中的数据的集合,一般包括:数据文件、日志文件、控制文件以及临时数据文件等。

实例:实例一般是由一组正在运行的 DM 后台进程/线程以及一个大型的共享内存组成。

实例就是 操作 DM 数据库的一种 手段,是用来访问数据库的内存结构以及后台进程的集合。

通过运行 DM 实例,可以 操作 DM 数据库中的内容。

  • 存储位置不同:DM 数据库存储在服务器的 磁盘上,而 DM 实例则存储于服务器的 内存中。

  • 实例与数据库的 对应关系(一对一):在 任何时候一个实例只能与一个数据库进行关联,在 大多数情况下一个数据库也只有一个实例对其进行操作。

  • DM 数据共享集群(DMDSC)中(多对一):多个实例可以 同时装载并打开一个数据库。

  • 用户并不能直接对数据库文件进行读取操作,而是通过 实例对 逻辑结构进行操作,进而实现对数据库文件的读写操作。

1.2 表空间

逻辑存储管理单元

  • 逻辑与物理的桥梁:用户可以在表空间层面进行各类操作,并最终映射到对应文件中。

  • 每一个用户都有一个默认的表空间。对于 SYS、SYSSSO、SYSAUDITOR 系统用户,默认的用户表空间是 SYSTEM; SYSDBA 系统用户的默认表空间为 MAIN; 新创建的用户如果没有指定默认表空间,则系统自动指定 MAIN表空间为用户默认的表空间。若新用户指定了表空间A且不是默认表空间,那么表存储在用户指定的表空间 A 中,索引也在A中。

  • 建议用户自己创建一个表空间来存放 业务数据,或者将数据存放在默认的用户表空间 MAIN 中

2. 实践

2.1构建高校图书管理系统数据库后台

实验环境:

  • 数据库版本:DM8
  • 工具:DM管理工具 (Manager) 或 disql (命令行)
  • 默认账号:SYSDBA

实践流程概览:

  1. 地基搭建(非模式对象):创建表空间、创建用户、赋予角色与权限。
  2. 核心构建(模式对象-基础):创建表、定义约束(主键、外键等)、建立索引。
  3. 业务扩展(模式对象-进阶):使用序列生成ID、创建视图简化查询、使用同义词简化对象访问。
  4. 自动化控制(模式对象-高级):使用触发器实现自动数据更新。

地基搭建(非模式对象管理)

场景:为了数据安全和性能隔离,我们不希望把图书数据放在系统默认的表空间中,而是单独规划一个存储区域,并设立专门的管理员。

任务 1:创建表空间
我们需要为图书系统创建一个独立的表空间 TS_BOOK,初始大小 128M。

-- 创建表空间
CREATE TABLESPACE TS_BOOK DATAFILE 'TS_BOOK.DBF' SIZE 128;

任务 2:创建角色与用户

  1. 创建一个角色 ROLE_LIB,用于统一管理权限。
  2. 创建用户 LIB_ADMIN,密码设为 Dameng123,默认表空间设为 TS_BOOK。
  3. 将角色授予用户。
-- 1. 创建角色
CREATE ROLE ROLE_LIB;
-- 2. 创建用户并指定默认表空间
CREATE USER LIB_ADMIN IDENTIFIED BY "Dameng123" DEFAULT TABLESPACE TS_BOOK;
-- 3. 授予角色给用户
GRANT ROLE_LIB TO LIB_ADMIN;
-- 4. 为了让该用户能连库并建表,需要授予基本权限
-- (注意:实际生产中建议按需授权,此处为了练习赋予较宽泛权限)
GRANT CREATE TABLE, CREATE VIEW, CREATE INDEX, CREATE SEQUENCE, CREATE TRIGGER TO LIB_ADMIN;
GRANT PUBLIC TO LIB_ADMIN; -- 允许连接

核心构建(模式对象-基础)

场景:切换到 LIB_ADMIN 用户,开始设计数据库表。我们需要三张表:读者表、图书表、借阅记录表。

前置操作:
在工具中切换用户为 LIB_ADMIN,或者在代码中执行: SET SCHEMA LIB_ADMIN;

任务 3:创建表与约束

  1. 创建读者表 (READERS):包含读者ID、姓名、性别、最大借阅数。
    • 要求:ID为主键,姓名不能为空。
  2. 创建图书表 (BOOKS):包含图书ID、书名、作者、价格、库存量。
    • 要求:ID为主键,价格必须大于0。
  3. 创建借阅记录表 (BORROW Records):记录ID、读者ID、图书ID、借阅日期。
    • 要求:建立外键关联,确保借阅的读者和图书必须存在。
-- 1. 创建读者表
CREATE TABLE READERS (
    READER_ID INT PRIMARY KEY,
    READER_NAME VARCHAR(50) NOT NULL,
    GENDER CHAR(1) CHECK (GENDER IN ('M', 'F')),
    MAX_BOOKS INT DEFAULT 5
);
-- 添加表注释
COMMENT ON TABLE READERS IS '读者表';
-- 2. 创建图书表
CREATE TABLE BOOKS (
    BOOK_ID INT PRIMARY KEY,
    BOOK_TITLE VARCHAR(100) NOT NULL,
    AUTHOR VARCHAR(50),
    PRICE DECIMAL(10,2) CHECK (PRICE > 0),
    STOCK INT DEFAULT 0
);
-- 添加表注释
COMMENT ON TABLE BOOKS IS '图书表';
-- 3. 创建借阅记录表
CREATE TABLE BORROW_RECORDS (
    RECORD_ID INT PRIMARY KEY,
    READER_ID INT,
    BOOK_ID INT,
    BORROW_DATE DATE DEFAULT CURRENT_DATE,
    -- 定义外键约束
    CONSTRAINT FK_READER FOREIGN KEY (READER_ID) REFERENCES READERS(READER_ID),
    CONSTRAINT FK_BOOK FOREIGN KEY (BOOK_ID) REFERENCES BOOKS(BOOK_ID)
);
-- 添加表注释
COMMENT ON TABLE BORROW_RECORDS IS '借阅记录表';

任务 4:创建索引
场景:由于经常需要按“书名”来查找图书,为了加快查询速度,我们需要在书名列上建立索引。

-- 在图书表的标题列创建普通索引
CREATE INDEX IDX_BOOK_TITLE ON BOOKS(BOOK_TITLE);

第三阶段:业务扩展(模式对象-进阶)

场景:为了方便开发,不想每次都手动输入ID,希望ID能自动增长;为了查询方便,我们希望把“读者借了什么书”整合在一个视图里显示。

任务 5:使用序列
创建一个序列 SEQ_READER_ID,用于自动生成读者ID。

-- 创建序列,起始从1001开始,每次增1
CREATE SEQUENCE SEQ_READER_ID START WITH 1001 INCREMENT BY 1;
-- 测试序列:插入一条读者数据,使用序列的下一个值
INSERT INTO READERS (READER_ID, READER_NAME, GENDER) VALUES (SEQ_READER_ID.NEXTVAL, '张三', 'M');
-- 再插入一条,验证ID是否自增
INSERT INTO READERS (READER_ID, READER_NAME, GENDER) VALUES (SEQ_READER_ID.NEXTVAL, '李四', 'F');
-- 查看结果
SELECT * FROM READERS;

任务 6:创建视图
创建一个视图 V_READER_BORROW_INFO,显示读者的姓名和借阅的图书名称。

CREATE OR REPLACE VIEW V_READER_BORROW_INFO AS
SELECT 
    r.READER_NAME,
    b.BOOK_TITLE,
    br.BORROW_DATE
FROM 
    BORROW_RECORDS br
JOIN 
    READERS r ON br.READER_ID = r.READER_ID
JOIN 
    BOOKS b ON br.BOOK_ID = b.BOOK_ID;
-- 查询视图(就像查表一样)
SELECT * FROM V_READER_BORROW_INFO;

任务 7:创建同义词
场景:表名 BORROW_RECORDS 太长了,程序员想用 RECS 这个简单的名字来访问它。

-- 创建同义词
CREATE SYNONYM RECS FOR BORROW_RECORDS;
-- 使用同义词查询
SELECT * FROM RECS;

序列解决了主键生成问题;视图封装了复杂的SQL逻辑;同义词简化了对象访问。这些都是为了提升开发效率和数据库易用性。

第四阶段:自动化控制(模式对象-高级)

场景:为了防止库存超卖,当我们在 BORROW_RECORDS 表插入一条借阅记录时,希望自动将 BOOKS 表中对应图书的库存数减 1。这就需要 触发器。

任务 8:创建触发器
创建一个行级触发器 TRIG_UPDATE_STOCK。

CREATE OR REPLACE TRIGGER TRIG_UPDATE_STOCK
AFTER INSERT ON BORROW_RECORDS
FOR EACH ROW
BEGIN
    -- :NEW 代表新插入的数据行
    UPDATE BOOKS 
    SET STOCK = STOCK - 1 
    WHERE BOOK_ID = :NEW.BOOK_ID;
END;
/
-- 测试触发器
-- 1. 先插入一本图书,库存设为 10
INSERT INTO BOOKS (BOOK_ID, BOOK_TITLE, AUTHOR, PRICE, STOCK) VALUES (101, '数据库系统导论', '王教授', 59.9, 10);
-- 2. 插入一条借阅记录(假设张三借了这本书)
INSERT INTO BORROW_RECORDS (RECORD_ID, READER_ID, BOOK_ID) VALUES (1, 1001, 101);
-- 3. 查询图书库存,看是否自动变成了 9
SELECT BOOK_TITLE, STOCK FROM BOOKS WHERE BOOK_ID = 101;

触发器是在特定事件(如INSERT、UPDATE、DELETE)发生时自动执行的隐式代码块。常用于数据审计、自动计算和复杂业务逻辑的强制执行。

达梦在线社区: https://eco.dameng.com

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70050873/viewspace-3176986/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2026-07-13

  • 博文量
    3
  • 访问量
    2149