oracle触发器

用途: 可以用来自动生成日志表记录 ,自动生成主键id sequence

基本语法 :

create [or replace] trigger tri_name
[before | after | instead of ] tri_event
on table_name | view_name |user_name |db_name
[for each row][when tri_condition]
 begin
plsql_sentences
eg1:

trigger:触发器的关键字
[before | after | instead of ]:before 在dml操作之前完成  after 在dml操作之后完成 instead of 表示触发器为替代触发器
on :要操作的对象 表视图 用户模式  数据库等
for each row :当dml语句对每一行操作时引起触发器运行 如果未指定 则表示创建语句级触发器无论数据库操作多少行
触发器 只会执行一次
tri_name: 自定义的触发器名字
or replace 替换
tri_evvent:触发的事件 比如常用的insert update delete create alter drop
table_name | view_name | user_name |db_name:分别表示操作的数据表、视图、用户模式和数据库,对它们的某些操作将引起触发器的运行。

tri_condition:表示触发器条件表达式,只有当该表达式的值为true时,遇到触发事件才会自动执行触发器,使其执行触发操作,否则即便是遇到触发事件也不会执行触发器。

plsql_sentences:PL/SQL语句,它是触发器功能实现的主体。
Oracle所支持的触发器分为以下5类:

行级触发器:当DML语句对每一行数据进行操作时都会引起该触发器的运行。
语句级触发器:无论DML语句影响多少行数据,其所引起的触发器仅执行一次。
替换触发器:该触发器是定义在视图上的,而不是定义在表上,它是用来替换所使用实际语句的触发器。

用户事件触发器:是指与DDL操作或用户登录、退出数据库等事件相关的触发器。如,用户登录到数据库或使用ALTER语句修改表结构等。

系统事件触发器:是指在Oracle数据库系统的事件中进行触发的触发器,如Oracle实例的启动与关闭。


1,语句级触发器,是针对一条DML语句而引起的触发器执行。在语句级触发器中,不使用for each row子句,也就是说无论数据操作影响多少行,触发器都只会执行一次。

eg1:两张表: emp(eid,ename,esal)   emp_log(操作类型,操作时间);    效果:当对 emp表进行 增加 删除 修改操作的
create or replace trigger tri_emp
before insert or update or delete
on emp
declare 
 var_tar varchar2(10);
 begin
   if inserting then 
​     var_tar:='插入';
​      elsif updating then 
​     var_tar:='修改';
​       elsif deleting then 
​     var_tar:='删除';end if;insert into emp_log values(var_tar,sysdate);
 end tri_emp; 

2,行级触发器会针对DML操作所影响的每一行数据都执行一次触发器。创建这种触发器时,必须在语法中使用for each row。使用行级触发器的一个典型应用就是给数据表生成主键值
 --行级触发器
 create or replace trigger tri_insert_good
 before insert on goods  for each row
 begin
   select seq_id.nextval into :new.id from dual;
 end;

3,替换触发器 替换触发器-instead of触发器,它的“触发时机”关键字是instead of,而不是before或after。
与其他类型触发器不同是,替换触发器定义在视图(一种数据库对象),而不是定义在表上。
create or replace trigger tri_insert_view
 instead of insert
 on view_emp_dept
 for each row
   declare
   row_dept dept%rowtype;
   beginselect * into row_dept from dept where deptno=:new.deptno;
 if sql%notfound theninsert into dept(deptno,dname)values(:new.deptno,:new.dname);end if;insert into emp(empno,ename,deptno,job,hiredate)values(:new.empno,:new.ename,:new.deptno,:new.job,:new.hiredate);
   end tri_insert_view;

4,用户事件触发器是因进行DDL操作或用户登录、退出等操作而引起运行的触发器,引起该类型触发器运行的
常见用户事件包括:CREATEALTERDROPANALYZECOMMENTGRANTREVOKERENAMETRUNCATE、SUSPEND、LOGON和LOGOFF等。
--用户触发器
create or replace trigger tri_ddl_oper
before create or alter or drop on scott.schema
begin
  insert into ddl_oper_log values(
  ora_dict_obj_name,
  ora_dict_obj_type,
  ora_sysevent,
  ora_login_user,
  sysdate
  );
end;

create table ddl_oper_log
(
db_obj_name varchar2(20)
,db_obj_type varchar2(20)
,oper_action varchar2(20)
,oper_user varchar2(20)
,oper_date  date
);

select * from ddl_oper_log;

create table cyll
(
id number,
childens varchar2(30),
sSal varchar2(20)
);

create view view_cyll as select * from cyll;
alter table cyll add(sAge number);

drop view view_cyll;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值