1.视图管理
一个视图(view)是由一个或多个表(或其他视图)中的数据的一种定制的表示,是用一个查询定义,所以可认为是一个存储的查询(stored query)或是一个虚表(virtual table)。视图可在使用表的许多地方使用。
由于视图是由表导出的,视图和表存在许多类似,视图象表最多可定义254列。视图可以被查询,而在修改、插入或删除时具有一定的限制,在视图上执行的全部操作真正地影响视图的基本表中的数据,受到基本表的完整性约束和触发器的限制。
视图与表不同,一个视图不分配任何存储空间,视图不真正地包含数据。由查询定义的视图相应于视图引用表中的数据、视图只在数据字典中存储其定义。
引入视图有下列好处:
。通过限制对表的行预定义集合的存取,为表提供附加的安全性
。隐藏数据复杂性。
。为用户简化命令
。为基本表的数据提供另一种观点。
。可将应用隔离基本表定义的修改
。用于不用视图无法表示的查询。
。可用于保存复杂查询
创建视图的语法
CREATE [OR REPLACE] [[NO] FORCE] VIEW [方案.]视图名
AS查询语句
[WITH READ ONLY] | [CHECK OPTION [CONSTRAINT约束语句]]
AS:视图的查询SQL语句,这是一个SELECT语句
OR REPLACE:如果视图存在,就覆盖这个已存在的视图
FORCE:创建视图时,不论这个视图所访问的表或视图是否存在,都创建视图
READ ONLY:设置视图为只读,不能对其进行插入、删除或更新操作
CHECK OPTION:向视图插入新行或者更新行时,如果行插入或行更新后,
视图访问不到这条记录,CHECK OPTION子句将不允许插入这行或更新这行
CONSTRAINT:指定CHECK OPTION子句的约束名称,默认名称为
SYS_Cn,n是数据库自动赋予的一个用于标识这个约束的独一无二的整数
示例:CREATE OR REPLACE FORCE VIEW DEMO_VIEW3
AS
SELECT ID,NAME ,USERID FROM LIU.DEMO_TAB1 WHERE USERID=2
WITH CHECK OPTION CONSTRAINT DEMO_VIEW3_CNST
2.索引管理
索引是一个与表相关的可选结构
使用索引能提高访问表的速度,可以在不影响基表情况下创建或删除索引
对基表实行插入、更新和删除时,Oracle会自动维护索引
索引在逻辑上和物理上都独立于基表,索引有多中类型
创建索引
使用CREATE INDEX命令创建索引时,如果用户在自己的模式下创建索引,必须考虑以下条件是否满足:
被索引的表必须在用户自己的模式中
用户必须具有被索引表上的INDEX权限
用户必须具有CREATE ANDY INDEX系统权限
CREATE [UNIQUE | BITMAP] INDEX [方案名.]索引名
ON表名(列名1,列名2,…)
3. 序列管理
用户要在自己的模式下创建序列,必须具有CREATE SEQUENCE系统权限,在其它用户模式下创建序列必须具有CREATE ANY SEQUENCE系统权限
模式:
CREATE SEQUENCE [方案.]序列
[INCREMENT BY整数]|
[START WITH整数]|
[MAXVALUE整数| NOMAXVALUE]|
[MINVALUE整数| NOMINVALUE]|
[CYCLE整数| NOCYCLE]|
如何把建好的序列导入表中作为自增长列:
示例:
建立一个序列---
create sequence my_seq increment by 1 start with 1 nomaxvalue nominvalue nocycle
已存在一张表---student有三列(stu_Id自增长列,stu_Name,stu_Age)-----
insert into student values(my_seq.nextval,’**’,’**’)
CURRVAL为列返回序列的当前值,NEXTVAL伪列返回序列的下一个值
注意:在使用CURRVAL的时候必须先使用NEXTVAL不然会报错。
4. 触发器
触发器(Trigger)是存储在数据库中的过程,当数据库中的某个事件发生后,这个过程就会被触发执行,一般发生在表或视图的插入、删除或者修改处理中。
功能:
1、允许/限制对表的修改
2、自动生成派生列,比如自增字段
3、强制数据一致性
4、提供审计和日志记录
5、防止无效的事务处理
6、启用复杂的业务逻辑
模式:
CREATE [OR REPLACE] TRIGGER [方案.]触发器名
触发时间
触发事件
ON表名
[FOR EACH ROW]
Pl/sql语句
注:
触发器名:触发器名称
触发时间:指明触发器何时执行,该值可取before和after,before表示在数据库动作之前触发器执行after表示在数据库动作之后触发器执行
FOR EACH ROW:对表的每一行触发器执行一次,如果没有这一行,对整个表执行一次
示例:
create or replace trigger my_trigger
before insert or update
of stu_age on student
for each row
when (new.stu_age<18)
begin
:new.stu_age := 18;
end my_trigger;