模式介绍:
用户的模式(SCHEMA)指的是用户账号拥有的对象集,在概念上可将其看作是包含表、 视图、索引和权限定义的对象。在 DM 中,一个用户可以创建多个模式,一个模式中的对象 (表、视图等)可以被多个用户使用。模式不是严格分离的,一个用户可以访问他所连接的 数据库中有权限访问的任意模式中的对象。 系统为每一个用户自动建立了一个与用户名同名的模式作为其默认模式,用户还可以用模式定义语句建立其它模式。
采用模式的原因有几点:
1. 允许多个用户使用一个数据库而不会干扰其它用户;
2. 把数据库对象组织成逻辑组,让它们更便于管理;
3. 第三方的应用可以放在不同的模式中,这样可以避免和其它对象的名字冲突。
模式类似于操作系统层次的目录,只不过模式不能嵌套。DM 模式可以通过 SQL 语句进行操作。DM 模式主要包含以下的模式对象:
表、视图、索引、触发器、存储过程/函数、序列、全文索引、包、同义词、
类、外部链接。在引用模式对象的时候,一般要在模式对象名前面加上模式名。具体格式如下:
[模式名].对象名
当然,在当前模式和要引用的模式对象所属的模式相同时,可以省略模式名。如果我们访问一个表时,没有指明该表属于哪一个模式,系统就会自动给我们在表前加上缺省的模式名。类似地,如果我们在创建对象时不指定该对象的模式,则该对象的模式为用户的缺省模式。
模式对象之外的其他对象统一称为非模式对象,非模式对象主要包括用户、角色、权限、表空间。
模式与用户之间的关系:
模式定义:模式是一个特定的对象集合,在概念上可将其看作是包含表、视图、索引等若干对象的对象集。
模式对象: 表、视图、约束、索引、序列、触发器、存储过程/函数、包、同义词、类、域。
模式与用户之间的关系:
当系统建立一个用户时,会自动生成一个对应的模式。用户还可以建立其他模式,DM 中用户和模式是一对多的关系,一个用户可以拥有多个模式,一个模式仅能归属于一个用户。Oracle 中用户和模式是一对一的关系。
配置登录默认模式、模式切换,都是某一个用户自己建立的多个模式之间切换,模式和用户不存在授权的概念,也不能授权,只有属于和不属于;同时,我们所有的模式切换,是不能跨到其他用户下面去的;
查看当前数据库中存在的模式:
select * from SYSOBJECTS t where t."TYPE$" ='SCH';
查看当前数据库中存在的用户:
select * from SYSOBJECTS t where t."SUBTYPE$" ='USER';
查询模式和用户的对应关系(一对多的关系):
SQL> select b.id userid, b.name username,a.id scheid, a.name schename
from SYS.SYSOBJECTS a, SYS.SYSOBJECTS b
where a."TYPE$" = 'SCH' and a.pid = b.id;
行号 USERID USERNAME SCHEID SCHENAME
---------- ----------- ---------- ----------- ----------
1 50331648 SYS 150994944 SYS
2 50331648 SYS 150994948 CTISYS
3 50331649 SYSDBA 150994945 SYSDBA
4 50331650 SYSAUDITOR 150994946 SYSAUDITOR
5 50331651 SYSSSO 150994947 SYSSSO
6 50331748 DEM 150995944 DEM
6 rows got
模式管理:
--创建模式
create schema dmhr_test AUTHORIZATION dmhr;
create table dmhr_test.test(id int, name varchar(20));
查看创建的模式:
SQL> select b.id userid, b.name username,a.id scheid, a.name schename
from SYS.SYSOBJECTS a, SYS.SYSOBJECTS b
where a."TYPE$" = 'SCH' and a.pid = b.id;
行号 USERID USERNAME SCHEID SCHENAME
---------- ----------- ---------- ----------- ----------
1 50331648 SYS 150994944 SYS
2 50331648 SYS 150994948 CTISYS
3 50331649 SYSDBA 150994945 SYSDBA
4 50331650 SYSAUDITOR 150994946 SYSAUDITOR
5 50331651 SYSSSO 150994947 SYSSSO
6 50331748 DEM 150995944 DEM
7 50331749 DMHR 150995945 DMHR
8 50331749 DMHR 150995946 DMHR_TEST
8 rows got
--查看当前模式和当前用户
SQL> select sys_context('USERENV','CURRENT_SCHEMA');
行号 SYS_CONTEXT('USERENV','CURRENT_SCHEMA')
---------- ---------------------------------------
1 DMHR
已用时间: 0.950(毫秒). 执行号:1173.
SQL> select sys_context('USERENV','CURRENT_USER');
行号 SYS_CONTEXT('USERENV','CURRENT_USER')
---------- -------------------------------------
1 DMHR
已用时间: 0.586(毫秒). 执行号:1174.
SQL> desc test
[-20001]:无效的对象名.
DMHR模式中无test表,需加上dmhr_test模式名访问test表
SQL> desc dmhr_test.test
行号 NAME TYPE$ NULLABLE
---------- ---- ----------- --------
1 ID INTEGER Y
2 NAME VARCHAR(20) Y
已用时间: 4.708(毫秒). 执行号:1183.
SQL>
--切换模式(仅对当前会话生效)
SQL> set SCHEMA dmhr_test;
操作已执行
已用时间: 0.295(毫秒). 执行号:0.
SQL> select sys_context('USERENV','CURRENT_SCHEMA');
行号 SYS_CONTEXT('USERENV','CURRENT_SCHEMA')
---------- ---------------------------------------
1 DMHR_TEST
已经切换到了dmhr_test模式
SQL> select sys_context('USERENV','CURRENT_USER');
行号 SYS_CONTEXT('USERENV','CURRENT_USER')
---------- -------------------------------------
1 DMHR
已用时间: 0.420(毫秒). 执行号:1177.
SQL>
切换到了dmhr_test模式后,操作test表不用加模式名前缀.
SQL> desc test
行号 NAME TYPE$ NULLABLE
---------- ---- ----------- --------
1 ID INTEGER Y
2 NAME VARCHAR(20) Y
已用时间: 6.261(毫秒). 执行号:1178.
SQL> insert into test values(1,'test01');
影响行数 1
已用时间: 1.525(毫秒). 执行号:1179.
SQL> commit;
操作已执行
已用时间: 1.418(毫秒). 执行号:1180.
SQL> select * from test;
行号 ID NAME
---------- ----------- ------
1 1 test01
已用时间: 0.387(毫秒). 执行号:1181.
查询当前模式下的表:
SELECT
*
FROM
(
SELECT
SCH.NAME SCHEMA_NAME,
OBJ.NAME TABLE_NAME ,
OBJ.CRTDATE CREATE_TIME
FROM
SYSOBJECTS SCH,
SYSOBJECTS OBJ
WHERE
SCH.ID =OBJ.SCHID
AND OBJ.SUBTYPE$ IN ('UTAB', 'VIEW')
AND SCH.NAME =SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID)
)
WHERE
TABLE_NAME = 'TEST';
删除模式:
drop SCHEMA IF EXISTS dmhr_test;
drop SCHEMA IF EXISTS dmhr_test CASCADE; --级联删除模式下对象,生产环境慎
用
达梦在线服务平台:https://eco.dameng.com