

本期干货
DM8模式及模式下对象的访问
VOL.188(2020.11.25)

我们在初次接触DM数据库时,总会人有些疑问,什么是模式,如何查看某个模式下的所有对象?模式和用户是什么关系?本章给大家解惑。
本章内容已在如下环境上测试:
①操作系统:中标麒麟7;
②数据库版本:达梦8;
相关关键字:模式、SCHEMA、[-2506]:视图删除用户的默认模式。

模式概述

什么是模式?用户的模式(SCHEMA)指的是用户账号拥有的对象集,在概念上可将其看作是包含表、视图、索引和权限定义的对象。
模式对象包含:
表、视图、约束、索引、序列、触发器、存储过程/函数、包、同义词、类、域等。
使用模式的主要原因:
1.把数据库对象组织成逻辑组,便于管理;
2.允许多个用户使用一个数据库而互不干扰;
3.不同的应用可以放在不同的模式中,这样可以避免和其它同类型对象的名称冲突。
模式类似于操作系统层次的目录,但模式不能嵌套。
可以使用如下语句查询数据库中所有模式:
select t.name, t.id from sysobjects t where t.type$='SCH';
复制
查询结果参考如下:

可以看到,模式DM8数据库包含CTISYS、SYS、SYSAUDITOR、SYSDBA、SYSSSO等模式,在创建数据库时如果勾选了创建DMHR示例库则会创建DMHR模式及其模式下的相关表等信息。
其中,CTISYS模式用户保存全文索引的相关信息,其模式下SYSCONTEXTINDEXES系统表用于记录全文索引相关信息,CTISYS模式归属于SYS用户。
DMHR是DM的人力资源示例库,该模式下存放了员工信息表、部门表等信息;DMHR模式归属于SYSDBA用户。
SYS模式是SYS用户的默认模式,存放SYS开头的系统表和DBA_,ALL_,USER_开头的系统视图,系统相关的系统函数、存储过程、包等;
SYSAUDITOR模式是SYSAUDITOR系统审计管理员的默认模式,用于存放数据库审计相关系统表等信息。
SYSDBA模式是SYSDBA用户的默认模式,存放少部分的系统存储过程对象等;
SYSSSO模式是SYSSSO系统安全管理员的默认模式。
除以上模式外,如果数据库创建了DM代理作业,则会创建SYSJOB模式,该模式下定义了DM作业系统的相关系统表、系统存储过程等信息。
如果安装了DEM DM企业管理器,则会创建DEM模式。

模式和用户的关系

在DM中,一个用户可以拥有多个模式,一个模式仅归属于一个用户;一个模式中的对象(表、视图等)可以被多个用户使用(前提是有访问权限)。
如果要查看数据库中所有模式分别归属于哪个用户,可以使用如下语句查询:
select t.name schname, t.id, t.pid, b.name username
from sysobjects t, sysobjects b
where t.pid = b.id
and t.type$='SCH';
复制
查询结果参考如下:

可以看到,在DM8新版本中,DMHR模式属于SYSDBA用户(新版本已经去除了DMHR用户)。
模式和对象的关系

前面我们介绍过,表、视图、约束、索引、序列、触发器、存储过程/函数等都属于模式下的对象,所以这些对象都是归属于某个模式的,使用如下语句可以查询某模式(这里以TEST模式为名,模式名区分大小写)下的所有数据库对象:
select t.object_id, t.object_name, t.object_type
from dba_objects t
where t.owner='TEST';
复制
查询结果参考如下:

当然,我们也可以查询DBA_TABLES、DBA_VIEWS等数据字典视图并指定OWNER条件来查询某个模式下的所有表、视图等。参考如下命令可以查询DMHR模式下的所有表信息:
select t.table_name, t.owner, t.tablespace_name
from dba_tables t
where t.owner='DMHR';
复制
查询结果参考如下:

也可以在DM管理工具对象导航窗口查看模式下的所有对象,如下图所示。

在DM数据库中,除模式对象之外,还有模式对象之外的其他对象,称为非模式对象,比如:用户、角色、表空间、目录等。

模式管理
创建模式
在创建用户时,系统会为每一个用户自动建立了一个与用户名同名的模式作为其默认模式,用户还可以用模式定义语句建立其它模式。在创建模式时也可以同时创建模式下对象,只有具有CREATE SCHEMA权限的用户才能创建模式。语法参考如下:
CREATE SCHEMA <模式名> [AUTHORIZATION <用户名>]
[<DDL_GRANT子句> {< DDL_GRANT子句>}];
比如,我们创建一个TEST用户:
create user test identified by Dameng123;
复制
查询可以看到新增了TEST模式。

我们在TEST用户下创建TEST01模式,执行如下命令:
create schema test01 authorization test;
复制
创建TEST02模式归属于TEST用户,在创建TEST02模式时,同时创建t_test表,语句参考如下:
create schema test02 authorization test
create table t_test(id int, name varchar(20));
复制
执行结果参考如下:

删除模式
如果我们不再使用某个模式,可以删除该模式;使用如下语句删除模式,默认为RESTRICT方式(如果模式下存在对象则不能直接删除,可以使用CASCADE级联删除模式及模式下的所有对象)。
DROP SCHEMA <模式名> [RESTRICT | CASCADE];
如下,TEST01模式下没有对象,可以直接删除;TEST02模式下创建有T_TEST表,所以可以删除该表,再删除模式;或者直接使用CASCADE级联删除。在生产环境,建议慎用CASCADE关键字。

不能直接删除与用户名同名的模式,否则会报错误“[-2506]:视图删除用户[XX]的默认模式”。要想删除与用户名同名的模式,需删除用户,删除用户时,会同时将用户及用户下模式删除。执行drop user test; 可以删除用户及用户下的模式。


模式下对象的访问
模式一旦定义,该用户所建基表、视图等均属该模式,其它用户访问该用户所建立的基表、视图等均需在表名、视图名前冠以模式名;引用模式对象的格式如下:
[模式名].对象名
在当前模式和要引用的模式对象所属的模式相同时,可以省略模式名。当访问一个表时,没有指明该表属于哪一个模式,系统会自动在表前加上缺省的模式名。类似地,如果我们在创建对象时不指定该对象的模式,则该对象的模式为用户的缺省模式。如果当前模式和要引用的模式对象所属的模式相同,可省略模式名。
我们也可以使用如下语句指定某个模式为当前模式(前提是该模式属于当前登录用户):
如下样例,我们使用SYSDBA查询DMHR模式下的部门信息表,在未设置模式时,默认情况下,当前模式是登录用户的同名模式(即SYSDBA),所以我们访问DMHR模式下的表需要加上模式名;当我们使用如下命令设置了当前模式为DMHR时,则访问DMHR模式下的表可以不必再加上模式名,简化了对象的访问。
set schema dmhr;
复制

好,以上是本次分享内容,希望能给大家带来帮助,感谢大家!
END
往期干货
● 干货分享丨DM8数据库审计
See U