SCHEMA用户模式:指的是用户账号拥有的对象集,在概念上可将其看做是包含表、视图、索引和权限定义的对象。
在DM中,一个用户可以创建多个模式,一个模式中的对象可以被多个用户使用。模式不是严格分离的,一个用户可以访问他所连接的数据库中有权限访问的任意模式中的对象。
系统为每一个用户自动建立了一个与用户名同名的模式作为其默认模式,用户可以建立其他模式。
使用模式的原因:
允许多个用户使用一个数据库而不会干扰其它用户;把数据库对象组织成逻辑组,更便于管理;第三方应用可以放在不同的模式中,可以避免和其它对象的名字冲突。
模式对象:
表;视图;索引;触发器;存储过程/函数;序列;全文索引;包;同义词;类;外部链接。
模式对象引用:[模式名].对象名 ,在当前模式与要引用的对象所属模式相同时,可省略模式名。
非模式对象:模式对象之外的其它对象,包括用户;角色;权限;表空间
- 模式定义语法格式:
<模式定义子句 1> | <模式定义子句 2>
<模式定义子句 1> ::= CREATE SCHEMA <模式名> [AUTHORIZATION <用户名>][<DDL_GRANT子句> {< DDL_GRANT 子句>}];
<模式定义子句 2> ::= CREATE SCHEMA AUTHORIZATION <用户名> [<DDL_GRANT 子句> {<DDL_GRANT 子句>}];
<DDL_GRANT 子句> ::= <基表定义> | <域定义>| <基表修改> | <索引定义> | <视图定义> |
<序列定义> | <存储过程定义> | <存储函数定义> | <触发器定义> | <特权定义> | <全文索引定义>
| <同义词定义> | <包定义> | <包体定义> | <类定义> | <类体定义> | <外部链接定义>] | <物化视图定义> | <物化视图日志定义> | <注释定义>
--定义模式时,可用单条语句同时创建多个表、视图,同时进行多项授权;
模式一旦定义,该用户所建基表、视图等均属该模式,其它用户访问该用户所建立的基表、视图等均需在表名、视图名前冠以模式名;建表者访问当前模式对象时模式名可省,若没有指定当前模式,系统自动以当前用户名作为模式名
模式定义语句中的基表修改子句只允许添加表约束,索引定义子句不能定义聚集索引。
模式未定义之前,其它用户访问该用户所建的基表、视图等均需在表名前冠以建表 者名; --模式定义语句不允许与其它 SQL 语句一起执行;
--在 DIsql 中使用该语句必须以”/ ”结束
--删除模式
DROP SCHEMA [IF EXISTS]<模式名>[RESTRICT | CASCADE];
--RESTRICT:当模式为空时删除成功(默认);CASCADE删除整个模式、模式中的对象,以及该模式相关的依赖关系都删除。
--创建sysdba的模式schema1
CREATE SCHEMA SCHEMA1 AUTHORIZATION SYSDBA;
--设置当前模式
SET SCHEMA SCHEMA1;
--删除模式
DROP SCHEMA SCHEMA1;
创建模式,同时创建属于模式的一个序列和一张表
CREATE SCHEMA SCHEMA1 AUTHORIZATION SYSDBA
CREATE SEQUENCE TEST_SEQ INCREMENT BY 1
CREATE TABLE TEST_TAB(C1 INT NOT NULL,C2 VARCHAR2(50));
模式创建后可查看
--测试表插入数据
INSERT INTO SCHEMA1.TEST_TAB(C1,C2)
SELECT SCHEMA1.TEST_SEQ.NEXTVAL,'TEST1' FROM DUAL;
COMMIT;
--查询表数据:
SELECT * FROM SCHEMA1.TEST_TAB;
2、重命名模式对象:
a、删除原有的模式对象,重新创建
b、ALTER … RENAME TO …
--重命名模式對象
ALTER TABLE SCHEMA1.TEST_TAB RENAME TO TEST_TAB1;
3、启用/停用触发器:
触发器有两种状态:
a、启用enable:启用状态,在触发条件满足时,执行触发体。默认启用
b、停用disable:禁止状态触发条件满足也不会触发。
设置触发器状态:
--启用
ALTER TRIGGER [SCHEMA.]TRI_NAME ENABLE;
--禁用
ALTER TRIGGER [SCHEMA.]TRI_NAME DISABLE;
--刪除
DROP TRIGGER [IF EXISTS] [<模式名>.]<触发器名>;
--重編譯
ALTER TRIGGER [<模式名>.]<触发器名> COMPILE [DEBUG];
创建两个触发器 默认enable
--元組級
CREATE OR REPLACE TRIGGER TRG_TEST_TAB1_1 AFTER
INSERT ON SCHEMA1.TEST_TAB1 FOR EACH ROW
BEGIN INSERT INTO SCHEMA1.TEST_TAB2 VALUES( 'TEST_TAB1插入了一筆數據');
END;
--語句級
CREATE OR REPLACE TRIGGER TRG_TEST_TAB1_2 AFTER
INSERT ON SCHEMA1.TEST_TAB1 FOR EACH STATEMENT
BEGIN INSERT INTO SCHEMA1.TEST_TAB2 VALUES( 'TEST_TAB1插入了數據');
END;
执行查询SQL
INSERT INTO SCHEMA1.TEST_TAB1(C1,C2) VALUES
(SCHEMA1.TEST_SEQ.NEXTVAL,'TEST1'),
(SCHEMA1.TEST_SEQ.NEXTVAL,'TEST1'),
(SCHEMA1.TEST_SEQ.NEXTVAL,'TEST1'),
(SCHEMA1.TEST_SEQ.NEXTVAL,'TEST1');
commit;
查询显示语句级触发器触发了一次,元组级插入了多少笔数据就触发了几次:
--查詢表test_tab2
select * from SCHEMA1.TEST_TAB2;
4、完整性约束
完整性约束规则,限制表中的一个或者多个列的值。用户可以在系统表SYSOBJECTS和SYSCONS中查询约束的信息。
当创建unique/primary key约束时,系统会创建对应的索引,当这个约束被删除,索引也被删除
--禁用约束,不能禁用unique & primary key约束
ALTER TABLE TABLE_NAME DISABLE CONSTRAINT CON_NAME;
--启用约束
ALTER TABLE TABLE_NAME ENABLE CONSTRAINT CON_NAME;
--删除约束
ALTER TABLE TABLE_NAME DROP CONSTRAINT CON_NAME;
5、模式对象信息记录
模式对象的信息主要记录在SYSOBJECTS 系统表中
查看模式:
SELECT * FROM SYSOBJECTS WHERE TYPE$='SCH';
可查到创建的表: