首页 > 数据库 > 国内数据库 > DM数据库对象管理总结
1.概念
数据库:同时出现 DM 数据库和实例时,DM 数据库指的是磁盘上存放在 DM 数据库中的数据的集合,一般包括:数据文件、日志文件、控制文件以及临时数据文件等。
实例:实例一般是由一组正在运行的 DM 后台进程/线程以及一个大型的共享内存组成。
实例就是 操作 DM 数据库的一种 手段,是用来访问数据库的内存结构以及后台进程的集合。
通过运行 DM 实例,可以 操作 DM 数据库中的内容。
存储位置不同:DM 数据库存储在服务器的 磁盘上,而 DM 实例则存储于服务器的 内存中。
实例与数据库的 对应关系(一对一):在 任何时候一个实例只能与一个数据库进行关联,在 大多数情况下一个数据库也只有一个实例对其进行操作。
DM 数据共享集群(DMDSC)中(多对一):多个实例可以 同时装载并打开一个数据库。
用户并不能直接对数据库文件进行读取操作,而是通过 实例对 逻辑结构进行操作,进而实现对数据库文件的读写操作。
逻辑存储管理单元
逻辑与物理的桥梁:用户可以在表空间层面进行各类操作,并最终映射到对应文件中。
每一个用户都有一个默认的表空间。对于 SYS、SYSSSO、SYSAUDITOR 系统用户,默认的用户表空间是 SYSTEM; SYSDBA 系统用户的默认表空间为 MAIN; 新创建的用户如果没有指定默认表空间,则系统自动指定 MAIN表空间为用户默认的表空间。若新用户指定了表空间A且不是默认表空间,那么表存储在用户指定的表空间 A 中,索引也在A中。
建议用户自己创建一个表空间来存放 业务数据,或者将数据存放在默认的用户表空间 MAIN 中
实验环境:
实践流程概览:
场景:为了数据安全和性能隔离,我们不希望把图书数据放在系统默认的表空间中,而是单独规划一个存储区域,并设立专门的管理员。
任务 1:创建表空间
我们需要为图书系统创建一个独立的表空间
TS_BOOK,初始大小 128M。
-- 创建表空间 CREATE TABLESPACE TS_BOOK DATAFILE 'TS_BOOK.DBF' SIZE 128;
任务 2:创建角色与用户
ROLE_LIB,用于统一管理权限。LIB_ADMIN,密码设为
Dameng123,默认表空间设为
TS_BOOK。-- 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. 创建读者表
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/ ,如需转载,请注明出处,否则将追究法律责任。