达梦数据库作为国产大型关系型数据库,其操作逻辑与 Oracle 等传统数据库类似,但又有其自身特点。本文将引导您完成角色权限管理、用户管理、数据操作等核心任务,并阐明关键概念。
一、 核心概念辨析:模式、实例与数据库
在开始操作前,理解以下几个概念至关重要:
数据库实例 (Instance):
- 指的是操作系统中一系列的后台进程(在达梦中表现为
dmserver
进程)以及为这些进程分配的大量共享内存。 - 简单理解:它是运行中的数据库软件和服务。一台服务器上可以安装并同时运行多个达梦实例,每个实例相互独立,通过不同的端口号区分。我们常说的“启动数据库”,其实就是启动一个数据库实例。
数据库 (Database):
- 在达梦数据库中,一个实例通常只关联一个物理数据库。这个数据库由数据文件、日志文件、控制文件等组成,存储在硬盘上。
- 实例与数据库的关系:实例是动态的,是访问数据库的“通道”和“工作区”;数据库是静态的,是数据的物理存储。实例启动后,才能加载和操作数据库。通常,“连接到一个实例”就等同于“连接到一个数据库”。
模式 (Schema):
- 模式是数据库下的一个逻辑对象容器,它隶属于某个用户。
- 一个用户有一个同名的默认模式。例如,创建用户
ZHANGSAN
后,会自动生成一个名为ZHANGSAN
的模式。 - 作用:模式用于对数据库对象(如表、视图、索引、存储过程)进行逻辑分组和权限管理。用户要创建表,必须在自己的模式中创建(如
ZHANGSAN.EMPLOYEE
),或者通过授权在其他用户的模式中创建。 - 类比:可以把数据库看作一个大仓库,模式是仓库里划分给不同租户(用户)的私人房间。每个租户只能在自己的房间里摆放家具(表、视图等),除非获得进入其他房间的许可。
二、 实际操作篇
以下操作均在 达梦管理工具 (DM Management Console) 或 disql 命令行工具中执行。假设您已使用 SYSDBA
等特权用户连接至数据库。
1. 创建角色并授予权限
角色是权限的集合,便于批量管理用户权限。
-- 1.1 创建一个角色,名为 'MIDDLE_ROLE'
CREATE ROLE MIDDLE_ROLE;
-- 1.2 给角色授予权限
-- 授予对模式 DMUSER 下所有表的 SELECT 权限
GRANT SELECT ON SCHEMA DMUSER TO MIDDLE_ROLE;
-- 授予对特定表 DMUSER.EMPLOYEE 的 INSERT, UPDATE 权限
GRANT INSERT, UPDATE ON DMUSER.EMPLOYEE TO MIDDLE_ROLE;
-- 授予创建表的系统权限
GRANT CREATE TABLE TO MIDDLE_ROLE;
-- 查询当前数据库中的所有角色
SELECT * FROM SYSOBJECTS WHERE TYPE$='ROLE';
2. 创建用户并授予角色
-- 2.1 创建一个用户,默认使用标准密码策略
CREATE USER DAMENG IDENTIFIED BY "Dameng123"
DEFAULT TABLESPACE MAIN -- 指定默认表空间
DEFAULT INDEX TABLESPACE MAIN;
-- 2.2 授予用户基本的 `CONNECT` 权限(无此权限无法登录)
GRANT CONNECT TO DAMENG;
-- 2.3 将之前创建的角色授予给新用户
GRANT MIDDLE_ROLE TO DAMENG;
-- 2.4 (可选)也可以直接授予权限给用户
GRANT SELECT ON DMUSER.DEPARTMENT TO DAMENG;
3. 回收角色/用户权限
权限管理的重要一环,确保权限最小化原则。
-- 3.1 从用户身上回收角色
REVOKE MIDDLE_ROLE FROM DAMENG;
-- 3.2 从角色身上回收对某张表的权限
REVOKE UPDATE ON DMUSER.EMPLOYEE FROM MIDDLE_ROLE;
-- 3.3 直接回收用户本身的特定权限
REVOKE SELECT ON DMUSER.DEPARTMENT FROM DAMENG;
4. 基本增删改查 (DML) 操作
切换至 DAMENG
用户进行操作。
-- 4.1 创建一张测试表
CREATE TABLE COMPANY (
ID INT PRIMARY KEY,
NAME VARCHAR(100),
ADDRESS VARCHAR(200)
);
-- 4.2 增 (INSERT) - 插入数据
INSERT INTO COMPANY (ID, NAME, ADDRESS) VALUES (1, '达梦', '北京市');
INSERT INTO COMPANY (ID, NAME, ADDRESS) VALUES (2, '华为', '深圳市');
COMMIT; -- 提交事务,使插入生效
-- 4.3 查 (SELECT) - 查询数据
SELECT * FROM COMPANY;
SELECT ID, NAME FROM COMPANY WHERE ID > 1;
-- 4.4 改 (UPDATE) - 更新数据
UPDATE COMPANY SET ADDRESS = '上海市浦东新区' WHERE NAME = '达梦';
COMMIT;
-- 4.5 删 (DELETE) - 删除数据
DELETE FROM COMPANY WHERE ID = 2;
COMMIT;
5. 创建视图 (View)
视图是一个虚拟表,基于一个 SQL 查询结果。
-- 创建一个视图,只显示北京的公司
CREATE VIEW VW_BEIJING_COMPANY AS
SELECT ID, NAME FROM COMPANY WHERE ADDRESS LIKE '%北京%';
-- 像查询普通表一样查询视图
SELECT * FROM VW_BEIJING_COMPANY;
6. 创建存储过程 (Procedure)
存储过程是预编译的 SQL 语句集合。
-- 创建一个简单的存储过程,用于根据ID查询公司名
CREATE OR REPLACE PROCEDURE GET_COMPANY_NAME (
IN C_ID INT, -- 输入参数
OUT C_NAME VARCHAR(100) -- 输出参数
)
AS
BEGIN
SELECT NAME INTO C_NAME FROM COMPANY WHERE ID = C_ID;
END;
/
-- 调用存储过程
DECLARE
V_NAME VARCHAR(100);
BEGIN
GET_COMPANY_NAME(1, V_NAME);
PRINT('公司名称是: ' || V_NAME);
END;
/
三、 总结
通过以上步骤,我们完成了达梦数据库的一系列核心操作:
- 权限管理:通过
CREATE ROLE
和GRANT
/REVOKE
语句,实现了基于角色的精细化权限分配与回收,这是数据库安全的基础。 - 用户管理:使用
CREATE USER
创建用户,并将其与角色关联,实现了用户权限的批量授予。 - 数据操作:使用标准的 SQL DML 语句(
INSERT
,SELECT
,UPDATE
,DELETE
)对表中的数据进行管理。 - 视图:使用
CREATE VIEW
创建了虚拟表,简化了复杂查询并增强了数据安全性。 - 存储过程:使用
CREATE PROCEDURE
创建了可重用的业务逻辑模块,提高了执行效率和代码封装性。 - 概念理解:明确了实例是运行中的服务,数据库是物理存储,而模式是隶属于用户的对象容器,这三者是理解达梦乃至其他大型数据库架构的基石。
这些操作是管理和使用达梦数据库最基本也是最重要的技能,熟练掌握它们将为进行更高级的数据库开发、运维和性能调优打下坚实的基础。