触发器
什么是触发器?
触发器是一种过程,与表关系密切,用于保护表中的数据。
当一个基表被修改(INSERT、UPDATE或DELETE)时,触发器自动执行。
触发器可实现多个表之间数据的一致性和完整性。
触发器的类型
触发器的类型有三种:DML触发器,替代触发器,系统触发器。
DML触发器
Oracle可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句或操作上进行触发
替代触发器
由于在Oracle里,不能直接对由两个以上的表简历的视图进行操作。所以给出了替代触发器。它就是Oracle 8 专门为进行视图操作的一种处理方法。
系统触发器
Oracle 从8i开始,提供了第三种类型的触发器叫系统触发器。它可以在ORACLE数据库系统的事件中进行触发,如ORACLE系统的启动与关闭等。
触发器的创建
触发器创建语法
创建DML触发器
DML触发器由DML语句激发,并且由该语句的类型决定DML触发器的类型
可以定义DML触发器进行insert、update、delete操作。
DML触发器可以在上述操作之前或之后激发,也可以在运行或语句操作上激发。
触发器中使用谓词
谓词用来判断用户所执行的DML语句的类型.
- inserting
- updating
- deleting
触发器的修改与删除
--触发器的禁用
alter trigger emp_sal_trigger disable;
--启用触发器
alter trigger emp_sal_trigger enable;
--删除触发器
drop trigger XXXXX;
--查询当前用户的所有触发器
select * from user_triggers;
练习:行级触发器
题目要求:
–当有人的工资发生改变时,需要做记录.
当公司多了雇员的时候,添加记录中只有新的工资
当有人离职时,需要把该员工工资修改记录删除
create or replace trigger emp_sal_trigger
after update or insert or delete on emp1
for each row --行级触发器
begin
if updating
then insert into emp_sal values(:old.empno,:new.sal,:old.sal,sysdate,emp_sal_seq.nextval);
ELSIF inserting
then insert into emp_sal values(:new.empno,:new.sal,0,sysdate,emp_sal_seq.nextval);
else
delete from emp_sal where empno=:old.empno;
end if;
exception
when others then dbms_output.put_line('添加失败!');
end;
练习:要求工资只能增加不能降低
create or replace trigger keep_sal_trigger
before update on emp1
for each row
begin
if :new.sal<:old.sal
then :new.sal:=:old.sal;
end if;
end;
索引
索引:
可以建立类似目录的数据库对象,实现数据快速查询。
索引的分类
按照索引的存储结构分类
B树索引
位图索引
反向键索引
按照索引值是否唯一分类
唯一索引
非唯一索引
按索引分类
单列索引
组合索引
基于函数的索引
索引语法
实例:索引练习
建立索引的特点
- 经常需要搜索的列
- 主键列
- 经常用在连接的列
- 经常需要根据范围搜索的列
- 经常需要排序的列
- 经常出现在where子句的列
不应该建立索引的列
- 查询中很少使用或者参考的列
- 只有很少数据值的列
- 定义为lob类型的列
- 修改性能远远大于检索性能
避免限制索引
- 避免使用不等操作符(<>、!=)
- 避免使用is null is not null
- 避免在where子句中使用函数
- 避免在比较时使用不匹配的数据类型