类型:
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;
注: