测试环境
操作系统 | 银河麒麟Linux kylin10 4.19.90-24.4.v2101.ky10.x86_64 |
数据库版本 | DM Database Server 64 V8 |
什么是达梦数据库的用户(USER)
用于登录数据库进行数据访问的用户账号。
什么是达梦数据库的模式(SCHEMA)
用户账号拥有的对象集合(表、视图、索引、触发器等等)。
达梦用户和模式是一对多的关系,一个用户可以创建多个模式,一个模式中的对象可以被多个用户使用。这与oracle不同,Oracle的用户(USER)对应一个SCHEMA,是一对一的关系。
达梦数据库每个创建的用户默认有一个同名的模式,该用户访问自己模式下的对象,不需要加模式名,可直接访问,对于其他模式下的对象,需要有访问权限,访问时需要加上模式名:[模式名].对象名。
1、用户管理
达梦数据库采用“三权分立”或“四权分立”的安全机制,将系统中所有的权限按照类型进行划分。
三权分立包含数据库管理员账号 SYSDBA、数据库安全员账号 SYSSSO 和数据库审计员账号 SYSAUDITOR,其缺省口令都与用户名一致。四权分立在三权分立的基础上增加数据库对象操作员账户 SYSDBO。
1.1、用户创建
DMDBA使用CREATE USER命令创建用户
--语法格式
CREATE USER [IF NOT EXISTS] <用户名> IDENTIFIED <身份验证模式> [PASSWORD_POLICY <口令策略>][<锁定子句>][<存储加密密钥>][<只读标志>][<资源限制子句>][<密码过期子句>][<允许IP子句>][<禁止IP子句>][<允许时间子句>][<禁止时间子句>][<TABLESPACE子句>][<INDEX_TABLESPACE子句>][<表空间配额子句>];
--示例 创建用户testuser,资源限制登陆失败超三次锁定5分钟,默认表空间为test。
SQL> create user testuser identified by dameng123 limit failed_login_attempts 3 password_lock_time 5 default tablespace test;
SQL> select USERNAME,ACCOUNT_STATUS,DEFAULT_TABLESPACE,DEFAULT_INDEX_TABLESPACE,CREATED from dba_users where username='TESTUSER';
行号 USERNAME ACCOUNT_STATUS DEFAULT_TABLESPACE DEFAULT_INDEX_TABLESPACE CREATED
---------- -------- -------------- ------------------ ------------------------ --------------------------
1 TESTUSER OPEN TEST SYSTEM 2024-08-15 09:08:41.727364
用户创建成功之后,数据库同时创建了一个同名的模式
SQL> select a.name schname,b.name username from sysobjects a, sysobjects b where a.pid = b.id and a.type$='SCH' and b.name='TESTUSER';
行号 SCHNAME USERNAME
---------- -------- --------
1 TESTUSER TESTUSER
1.2、用户修改
--语法格式
ALTER USER <用户名> [<修改用户子句>] | [<用户代理功能子句>];
<修改用户子句> ::= [IDENTIFIED <身份验证模式>] [PASSWORD_POLICY <口令策略>] [<锁定子句>] [<存储加密密钥>] [<只读标志>][<资源限制子句>][<密码过期子句>] [<允许IP子句>][<禁止IP子句>][<允许时间子句>][<禁止时间子句>][<TABLESPACE子句>][<INDEX_TABLESPACE子句>][<SCHEMA子句>][<表空间配额子句>]
<SCHEMA子句> ::= ON SCHEMA <模式名>
<用户代理功能子句> ::= <GRANT | REVOKE> CONNECT THROUGH <代理用户名>
--示例 修改testuser用户的index tablespace
SQL> alter user testuser default index tablespace test;
SQL> select USERNAME,ACCOUNT_STATUS,DEFAULT_TABLESPACE,DEFAULT_INDEX_TABLESPACE,CREATED from dba_users where username='TESTUSER';
行号 USERNAME ACCOUNT_STATUS DEFAULT_TABLESPACE DEFAULT_INDEX_TABLESPACE CREATED
---------- -------- -------------- ------------------ ------------------------ --------------------------
1 TESTUSER OPEN TEST TEST 2024-08-15 09:08:41.727364
1.3、权限
1.3.1、权限授予
--语法格式
GRANT <特权> TO <用户或角色>{,<用户或角色>} [WITH ADMIN OPTION];
<特权> ::= <数据库权限>{,<数据库权限>};
<用户或角色>::= <用户名> | <角色名>
--查看用户被授予的权限
SQL> select grantee,granted_role as privilege_role from dba_role_privs where grantee='TESTUSER'
2 union
3 select grantee,privilege as privilege_role from dba_sys_privs where grantee='TESTUSER';
行号 GRANTEE PRIVILEGE_ROLE
---------- -------- --------------
1 TESTUSER PUBLIC
2 TESTUSER CREATE SESSION
--使用testuser用户进行查询
SQL> select * from dmhr.city;
select * from dmhr.city;
[-5504]:没有[DMHR.CITY]对象的查询权限.
SQL>
该用户没有查询此表的权限,需要授予查询权限
--使用sysdba用户授权,testuser用户查询
SQL> grant select on dmhr.city to testuser;
操作已执行
--使用testuser用户查询
SQL> select * from dmhr.city;
行号 CITY_ID CITY_NAME REGION_ID
---------- ------- --------- -----------
1 BJ 北京 1
2 SJZ 石家庄 1
3 SH 上海 2
4 NJ 南京 2
5 GZ 广州 3
6 HK 海口 3
7 WH 武汉 4
8 CS 长沙 4
9 SY 沈阳 5
1.3.2、权限回收
--语法格式
REVOKE [ADMIN OPTION FOR]<特权> FROM <用户或角色>{,<用户或角色>} ;
<特权> ::= <数据库权限>{,<数据库权限>}
<用户或角色>::= <用户名> | <角色名>
--示例 回收testuser用户create session权限
--sysdba用户
SQL> revoke create session from testuser;
操作已执行
--testuser用户尝试登陆数据库
[dmdba@kylin10 ~]$ disql testuser/dameng123
[-5671]:没有CREATE SESSION权限.
disql V8
用户名:
1.4、用户删除
--语法格式
DROP USER [IF EXISTS] <用户名> [RESTRICT | CASCADE];
如果在删除用户时未使用 CASCADE 选项(缺省使用 RESTRICT 选项),若该用户建立了数据库对象,DM 将返回错误信息,而不删除此用户。CASCADE 选项级联删除相关对象。
--示例 删除testuser用户
SQL> drop user testuser;
2、模式管理
采用模式的原因有几点:
- 允许多个用户使用一个数据库而不会打扰其他用于
- 把数据库对象组织成逻辑组,让他们更便于管理
- 不同的应用放在不同的模式中,这样可以避免和其它对象的名字冲突。
达梦数据库中包含模式对象:
- 表(TABLE)
- 视图(VIEW)
- 索引(INDEX)
- 触发器(TRIGGER)
- 存储过程/函数(FUNCTION)
- 序列(SEQUENCE)
- 全文索引(SYNONYM)
- 包(PACKAGE)
- 同义词(SYNONYM)
- 类(CLASS)
- 外部链接(LINK)
2.1、创建模式
在创建用户,数据库为每一个用户自动建立了一个与用户名同名的模式作为其默认模式,用户还可以用模式定义语言创建其他模式。
在创建新模式时,如果此模式所属用户下已存在同名的模式,那么创建模式操作会被跳过。
--语法格式
CREATE SCHEMA <模式名> [AUTHORIZATION <用户名>][<DDL_GRANT 子句> {< DDL_GRANT 子句>}];
--示例 新建模式
--新建用户
SQL> create user sch_user identified by dameng123;
操作已执行
--查看用户和对用模式
SQL> select a.name username,b.name scheman from sysobjects a,sysobjects b where a.id = b.pid and b.type$='SCH' and a.name='SCH_USER';
行号 USERNAME SCHEMAN
---------- -------- --------
1 SCH_USER SCH_USER
--创建模式,新建的模式属于SCH_USER用户
SQL> create schema schuser1 authorization sch_user;
2 /
操作已执行
SQL> select a.name username,b.name scheman from sysobjects a,sysobjects b where a.id = b.pid and b.type$='SCH' and a.name='SCH_USER';
行号 USERNAME SCHEMAN
---------- -------- --------
1 SCH_USER SCHUSER1
2 SCH_USER SCH_USER
说明:
- AUTHORIZATION <用户名> 指定拥有该模式的用户。 缺省为 SYSDBA。 创建者为SYSDBA 用户才可以使用此选项。
- 在 DIsql 中使用该语句必须以“/”结束
2.2、设置当前模式
--语法格式
SET SCHEMA <模式名>;
--示例 在SCHUSER1模式下创建表,插入数据,并设置其他模式进行查询
SQL> set schema SCHUSER1;
操作已执行
SQL> create table t1 (id int);
操作已执行
SQL> insert into t1 values(1);
影响行数 1
SQL> insert into t1 values(2);
影响行数 1
SQL>
SQL> select * from t1;
行号 ID
---------- -----------
1 1
2 2
SQL> select OWNER,TABLE_NAME,TABLESPACE_NAME from dba_tables where table_name='T1';
行号 OWNER TABLE_NAME TABLESPACE_NAME
---------- -------- ---------- ---------------
1 SCHUSER1 T1 MAIN
--切换到sysdba模式,查询
SQL> set schema sysdba;
操作已执行
SQL> select * from t1;
select * from t1;
第1 行附近出现错误[-2106]:无效的表或视图名[T1].
已用时间: 0.296(毫秒). 执行号:0.
--使用[模式名.对象名]进行查询
SQL> select * from SCHUSER1.t1;
行号 ID
---------- -----------
1 1
2 2
2.3、删除模式
--语法格式
DROP SCHEMA [IF EXISTS] <模式名> [RESTRICT | CASCADE];
--删除空对象模式
--创建新模式,属于SCH_USER用户
SQL> create schema aaa authorization sch_user;
2 /
操作已执行
SQL>
SQL> select a.name username,b.name scheman from sysobjects a,sysobjects b where a.id = b.pid and b.type$='SCH' and a.name='SCH_USER';
行号 USERNAME SCHEMAN
---------- -------- --------
1 SCH_USER AAA
2 SCH_USER SCH_USER
3 SCH_USER SCHUSER1
--删除模式AAA
SQL> drop schema aaa;
操作已执行
SQL>
SQL> select a.name username,b.name scheman from sysobjects a,sysobjects b where a.id = b.pid and b.type$='SCH' and a.name='SCH_USER';
行号 USERNAME SCHEMAN
---------- -------- --------
1 SCH_USER SCHUSER1
2 SCH_USER SCH_USER
--删除非空模式
--删除模式SCHUSER1
SQL> drop schema schuser1;
drop schema schuser1;
第1 行附近出现错误[-5001]:模式[SCHUSER1]不为空.
当前模式下存在对象,不能直接删除,需要使用CASCADE 选项,使用该选项会级联删除该模式下的所有对象,以及与该模式相关的依赖关系。
SQL> drop schema schuser1 cascade;
操作已执行
SQL>
3、用户与模式的关系
每个用于有一个默认的同名模式,访问自己模式下的对象不需要加模式名,访问其他模式的对象需要拥有访问权限,访问时还需加上模式名。
如果同一用户不同模式。访问时也需要加上模式名。
--新建测试数据,创建表,插入数据,提交;创建新模式名bbb,在bbb模式下建表插入数据,提交
用户名:SCH_USER
模式名:SCH_USER、BBB
SQL> set schema sch_user;
操作已执行
SQL> create table t2(id int);
操作已执行
SQL>
SQL> insert into t2 values(1);
影响行数 1
SQL>
SQL> insert into t2 values(2);
影响行数 1
SQL>
SQL> insert into t2 values(3);
影响行数 1
SQL> select * from t2;
行号 ID
---------- -----------
1 1
2 2
3 3
SQL> commit;
操作已执行
--sysdba用户,创建bbb模式
SQL> create schema bbb authorization sch_user;
2 /
操作已执行
SQL> set schema bbb;
操作已执行
SQL>
SQL>
SQL> select * from t2;
select * from t2;
第1 行附近出现错误[-2106]:无效的表或视图名[T2].
SQL>
SQL>
SQL> create table t2(id int);
操作已执行
SQL>
SQL> insert into t2 values(4);
影响行数 1
SQL>
SQL> select * from t2;
行号 ID
---------- -----------
1 4
SQL>
SQL> commit;
3.1、查询当前用户模式下的表
--登陆sch_user用户
[dmdba@kylin10 ~]$ disql sch_user/dameng123
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.820(ms)
disql V8
SQL>
SQL> select * from t2;
行号 ID
---------- -----------
1 1
2 2
3 3
可查询数据
--查询sch_user用户bbb模式下的表
SQL> select * from bbb.t2;
行号 ID
---------- -----------
1 4
3.2、查询其他用户模式下的表
--使用SCH_USER用户查询SYSDBA用户DMHR模式下的JOB表
--DMHR模式是示例库,在创建数据库时创建,也可手动创建
--SYSDBA用户查询JOB表
SQL> set pagesize 100;
SQL> select * from dmhr.job;
行号 JOB_ID JOB_TITLE MIN_SALARY MAX_SALARY
---------- ------ --------------------- ----------- -----------
1 11 总经理 8000 50000
2 12 总经理助理 5000 20000
3 13 秘书 3000 6000
4 21 行政部经理 5000 10000
5 22 文员 2500 5000
6 31 开发部经理 8000 20000
7 32 项目经理 6000 20000
8 33 开发工程师 6000 15000
9 41 市场部经理 5000 20000
10 42 市场专员 3000 6000
11 51 技术支持部经理 7000 18000
12 52 技术支持工程师 4000 12000
13 61 测试部经理 8000 20000
14 62 测试工程师 4000 10000
15 71 人力资源部经理 6000 12000
16 72 招聘专员 2500 6000
16 rows got
--sch_user用户查询
[dmdba@kylin10 ~]$ disql sch_user/dameng123
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.194(ms)
disql V8
SQL>
SQL> select * from dmhr.job;
select * from dmhr.job;
[-5504]:没有[DMHR.JOB]对象的查询权限.
SQL>
sch_user用户没有查询dmhr模式的job表,需要进行授权。
--sysdba用户进行授权
SQL> grant select on "DMHR"."JOB" to sch_user;
操作已执行
--sch_user用户查询
SQL> set pagesize 100;
SQL>
SQL> select * from dmhr.job;
行号 JOB_ID JOB_TITLE MIN_SALARY MAX_SALARY
---------- ------ --------------------- ----------- -----------
1 11 总经理 8000 50000
2 12 总经理助理 5000 20000
3 13 秘书 3000 6000
4 21 行政部经理 5000 10000
5 22 文员 2500 5000
6 31 开发部经理 8000 20000
7 32 项目经理 6000 20000
8 33 开发工程师 6000 15000
9 41 市场部经理 5000 20000
10 42 市场专员 3000 6000
11 51 技术支持部经理 7000 18000
12 52 技术支持工程师 4000 12000
13 61 测试部经理 8000 20000
14 62 测试工程师 4000 10000
15 71 人力资源部经理 6000 12000
16 72 招聘专员 2500 6000
16 rows got