我以前做的一個(gè)例子,你參考下吧 第八章 觸發(fā)器(Trigger) --格式: create or replace trigger 名稱 [after|before][delete|update|insert] [on 表 | on schema] [referencing new as 別名 old as 別名] [for each row] declare .... begin ... exception .... end; --創(chuàng)建一個(gè)delete類型行級(jí)觸發(fā)器 --刪除的一行數(shù)據(jù)保存在:old create or replace trigger emp_delete_row_trigger after delete on emp referencing new as n old as o for each row begin dbms_output.put_line('emp_delete_row_trigger called.'); dbms_output.put_line('刪除員工:' || :o.empno || ' ' || :o.ename); end; delete from emp where empno=7499; delete from emp; --創(chuàng)建一個(gè)insert類型行級(jí)觸發(fā)器 --插入的一行新數(shù)據(jù)保存在:new create or replace trigger emp_insert_row_trigger after insert on emp for each row begin dbms_output.put_line('emp_insert_row_trigger called.'); dbms_output.put_line('添加員工:' || :new.empno || ' ' || :new.ename); end; insert into emp(empno,ename) values(1,'empxxx'); --創(chuàng)建一個(gè)update類型行級(jí)觸發(fā)器 --修改前的數(shù)據(jù)保存在:old --修改后的數(shù)據(jù)保存在:new create or replace trigger emp_update_row_trigger after update on emp for each row begin dbms_output.put_line('emp_update_row_trigger called.'); dbms_output.put_line('修改前:' || :old.empno || ' ' || :old.ename); dbms_output.put_line('修改后:' || :new.empno || ' ' || :new.ename); end; update emp set ename='xxxx' where empno=7499; --語句級(jí)觸發(fā)器(update,delete,insert) create or replace trigger delete_stmt_trigger after delete on emp begin dbms_output.put_line('delete_stmt_trigger called.'); end; delete from emp; --判斷觸發(fā)器類型 ---------------------------------------------------------- --每進(jìn)行一次交易,就要調(diào)用觸發(fā)器,自動(dòng)扣除或增加賬戶金額 ---------------------------------------------------------- create table account ( customerName varchar2(30) primary key, cardID varchar2(8), currentMoney number ); insert into account values('Daivd','10010001',5000); insert into account values('Jason','10010002',3000); create table trans ( transDate date, cardID varchar2(8), transType varchar2(10), transMoney number ); insert into trans values(sysdate,'10010001','取款',1000); create or replace trigger trans_trigger before insert on trans for each row declare v_currentMoney account.currentMoney%type; begin --判斷類型 if :new.transType='取款' then --取款 select currentMoney into v_currentMoney from account where cardID=:new.cardID;
if v_currentMoney < :new.transMoney then raise_application_error(-20001,'余額不足'); end if;
update account set currentMoney=currentMoney-:new.transMoney where cardID=:new.cardID; else --存款 update account set currentMoney=currentMoney+:new.transMoney where cardID=:new.cardID; end if; exception when no_data_found then raise_application_error(-20002,'無效的帳戶'); end; --模式(schema)級(jí)觸發(fā)器 create or replace trigger schema_trigger before drop on schema begin dbms_output.put_line('schema_trigger called'); dbms_output.put_line(ora_dict_obj_name); dbms_output.put_line(ora_dict_obj_type);
if ora_dict_obj_name='ACCOUNT' then raise_application_error(-20003,'ACCOUNT表不能被刪除'); end if; end; drop table account; --ora_dict_obj_name 操作對(duì)象名稱 --ora_dict_obj_type 操作對(duì)象類型 --啟用觸發(fā)器 alter trigger schema_trigger enable; --禁用觸發(fā)器 alter trigger schema_trigger disable;