触发器的应用

类型:

1.DML触发器:在对表或视图执行DML语句时执行,其中包含语句级触发器(表级触发器),行级触发器,INSTEAD OF触发器(替换触发器)

2.模式(DDL)触发器:在模式中执行 DDL 语句时执行

3.数据库级触发器:在发生打开、关闭、登录和退出数据库等系统事件时执行。

分类:

表级触发器

行级触发器

替换触发器

模式触发器

数据库级触发器

语法:

create [or replace] trigger 触发器名字

before | after trigger_event

on table_name

[for each row]

[when trigger_condition]

trigger_body;

(1)表级触发器:无论受影响的行数是多少,都只执行一次

语法:

create or replace trigger 触发器名称

 before|after

 update or |delete or |insert on 表名

declare

   声名变量;

begin

   触发器代码;

end;

--给dept表创建一个触发器,当dept表中的数据被修改、删除、插入时打印该操作
create trigger t1 before insert or update or delete on dept
begin
   if inserting then
      dbms_output.put_line('插入');
   end if;
   if updating then
      dbms_output.put_line('修改');
   end if;
   if deleting then
      dbms_output.put_line('删除');
   end if;
end;
insert into dept(deptno,dname,loc) values(41,'财务部','上海'); 
update dept set dname='ss';
delete from dept;

(2)行级触发器:对DML语句修改的每个行执行一次,有for each row语句,在

:new --为一个引用最新的列值

:old --为一个引用以前的列值

create or replace trigger trigger2
    before insert or update of loc or delete on DEPT for each row
begin
    DBMS_OUTPUT.PUT_LINE('trigger2触发器执行了');
    if updating then
        DBMS_OUTPUT.PUT_LINE('update 操作逻辑'||:new.LOC||:old.LOC);
    end if;
    if deleting then
        DBMS_OUTPUT.PUT_LINE('delete 操作逻辑'||:new.LOC||','||:old.LOC);
    end if;
    if inserting then
        DBMS_OUTPUT.PUT_LINE('insert 操作逻辑'||:new.LOC||','||:old.LOC);
    end if;
end;
--建一个触发器从序列中取值,作为表的主键
create or replace trigger t2 
before insert on seqtab for each row
begin
  :new.id:=seq.nextval;
end;
insert into seqtab(name) values('张三');
select * from seqtab;
insert into seqtab(name) values('李四');
delete from seqtab where id=3;
insert into seqtab(id) values(10000);

create or replace trigger t2
before update on seqtab for each row
begin
  dbms_output.put_line(:old.id||','||:old.name);
end;
update seqtab set name='王五' where id=5;

(3)替换触发器:替换触发器使用在视图上,而且是行级的触发器

 create or replace trigger t3 
  instead of update on de for each row
declare
   v number;
begin
   select deptno into v from emp where empno = :old.empno;
   update dept set dname=:new.dname where deptno = v;
end;

update de set dname = '财务部' where empno=7369;

(4)模式触发器:

CREATE TABLE dropped_obj (
obj_name VARCHAR2(30),   
obj_type VARCHAR2(20),
   drop_date DATE);
CREATE OR REPLACE TRIGGER log_drop_obj
before ALTER or DROP or CREATE ON SCHEMA
BEGIN
  INSERT INTO dropped_obj   VALUES(ORA_DICT_OBJ_NAME, 
  ORA_DICT_OBJ_TYPE, SYSDATE);
END;

常用系统变量:

Ora_client_ip_address 返回客户端的ip地址

Ora_database_name 返回当前数据库名

Ora_login_user 返回登录用户名

Ora_dict_obj_name 返回ddl操作所对应的数据库对象名

Ora_dict_obj_type 返回ddl操作所对应的数据库对象的类型  

(5)数据库级触发器:在发生打开(startup)、关闭()、登录(logon)和退出登录(logoff)数据库等系统事件时执行。

create table event_table ( event varchar2(30), time  date);

create or replace trigger tr_startup
after startup on database
begin 
   insert into  event_table values( ora_sysevent, sysdate);
end;
--用户登陆触发器
create table log_table(username  varchar2(20), logon_time  date);

create or replace trigger tr_logon
after logon on database
begin 
   insert into log_table(username,logon_time) values(ora_login_user,  sysdate);
end;

启用、禁用和删除触发器

	启用和禁用触发器
		ALTER TRIGGER aiu_itemfile DISABLE; 禁用
		ALTER TRIGGER aiu_itemfile ENABLE; 启用
	删除触发器
		DROP TRIGGER aiu_itemfile;

注:

  1. 触发器不能接受参数,不能被显式调用。
  2. 一个表上触发器最多12个(未验证)
  3. 表上触发器越多,越影响DML操作。
  4. 触发器只能执行DML,不能使用DDL。
  5. 触发器不能包含事务控制语句,如commit,rollback,savepoint。
  6. 触发器主体可以调用procedure和function,同样不能使用事务控制语句。
  7. 触发器中不能声明long和blob的变量,new和old也不能是表中的任何long和blob列。

你可能感兴趣的:(oracle,mysql,mysql,oracle,数据库)