1、触发器不能显式的调用
触发器有三部分组成:
(1)触发器语句(事件),定义激活触发器的DML事件和DDL事件
(2)触发器限制,执行触发器的条件,该条件必须为真才能激活触发器
(3)触发器操作(主体) ,包含一些sql语句和代码,他们在发生触发器语句且触发限制的值为真时运行。
create or replace trigger trig_sal
after update of empsal on salary_records ---为salary_records表创建trig_sal触发器,在更新empsal列时激活
...........
when (new.empsal>old.empsal)
declare
sul_diff number
..........
begin
sul_diff:=:new.empsal-:old.empsal
dbms_output.put_line(‘工资差是:'sal_diff);
end; ---when子句中的条件满足,将执行being块中的代码。
2、创建触发器
create or replace trigger aiu_itemfile
after insert on itemfile
for each row
begin
if (:NEW.qty_hand=0) then
dbms_output.put_line('警告:已插入纪录,但数量为零');
else
dbms_output.put_line('已插入纪录');
end if;
end;
3 、触发器类型
模式(DDL)触发器-->在模式中执行DDL语句时执行
数据库级触发器----> 在发生打开、关闭、登陆和退出数据库等系统事件时执行
DML触发器 --〉 在对表和视图执行DML语句时执行
(
行级触发器---〉对DML语句修改的每个执行一次
语句级触发器---〉无论受影响的行数是多少,都只执行一次
instead of触发器---〉用于用户不能直接使用DML语句修改的视图
)
行级触发器:
create table test_trg
(id number, name varchar2(20));
create sequence seq_test;
create or replace trigger bi_test_trg
before insert or update of id on test_trg
for each row
begin
if inserting then
select seq_test .nextval into :new.id from dual;
else
raise_application_error(-20020,'不允许更新ID值!');
end if;
end;
语句级触发器
create or replace trigger trgdemo
after insert or update or delete on order_master
begin
if updating then
dbms_output.put_line('已更新order_master中的数据');
elsif deleting then
dbms_output.put_line('已删除oreder_master中的数据');
elsif inserting then
dbms_output.put_line('已在order_master中插入数据');
end if;
end;
3、触发器的限制
SELECT 语句必须是SELECT INTO语句或内部游标声明
不允许DDL声明或事务控制语句
如果由触发器调用,则存储子程序不能包括事务控制语句
:old 和:new值得类型不能事LONG和LONG RAW
4、触发器 触发顺序
Before语句级
Before行级
DML
After行级
After语句级
5、INSTEAD OF 触发器
CREATE OR REPLACE TRIGGER upd_ord_view
instead of update on ord_view
FOR EACH ROW
BEGIN
UPDATE order_master
SET vencode=:NEW.vencode
WHERE orderno=:NEW.orderno;
dbms_outpu.put_line('已激活触发器');
END;
6、模式触发器
CREATE TABLE dropped_obj(
obj_name varchar2(30),
obj_type varchar2(20),
drop_type DATE);
CREATE OR REPLACE TRIGGER log_drop_obj
AFTER DROP ON SCHEMA
BEGIN
INSERT INTO dropped_obj
VALUES( ORA_DICT_OBJ_NAME,ORA_DICT_OBJ_TYPE,SYSDATE);
END;
7、启用、禁用和删除触发器
ALTER TRIGGER aju_itemfile DISABLE;
ALTER TRIGGER aju_itemfile ENABLE;
DROP TRIGGER aju_itemfile;
8、查看有关触发器的信息
SELECT TRIGGER_NAME FROM USER_TRIGGERS
WHERE TABLE_NAME='EMP';
SELECT TRIGGER_TYPE,TRIGGERING_EVENT,WHEN_CLAUSE FROM USER_TRIGGERS
WHERE TRIGGER_NAME='BIU_EMP_DEPTNO';