Oracle 觸發器

查看當前用戶下的觸發器:
desc user_triggers;
select trigger_name,description from user_triggers;

準備數據:

賦予scott創建各種資源的權限。
grant resource to scott;

create table staff (id varchar2(2),name varchar2(10),sex varchar2(2),corpid varchar2(2));
insert into staff(id,name,sex,corpid) values('01','李成','男','01');
insert into staff(id,name,sex,corpid) values('02','趙蘭','女','05');
insert into staff(id,name,sex,corpid) values('03','劉豐','男','03');
insert into staff(id,name,sex,corpid) values('04','錢峯山','男','04');
insert into staff(id,name,sex,corpid) values('05','張凱','男','02');
insert into staff(id,name,sex,corpid) values('07','李想','男','04');
insert into staff(id,name,sex,corpid) values('06','劉麗','女','02');
insert into staff(id,name,sex,corpid) values('09','周恆久','男','04');
insert into staff(id,name,sex) values('08','孫小萍','女');

create table corp (id varchar2(2),name varchar2(10));
insert into corp(id,name) values('01','辦公室');
insert into corp(id,name) values('02','財務科');
insert into corp(id,name) values('03','質量科');
insert into corp(id,name) values('04','生產部');
insert into corp(id,name) values('05','銷售部');
insert into corp(id,name) values('06','後勤科');

DELETE行級觸發器:
create or replace trigger del_corp
    after delete on corp for each row
begin
    delete from staff where corpid=:old.id; --old.id爲corp的id。
end;
/

delete from corp where id='04';
select * from corp;
select * from staff;
rollback;
select * from corp;
select * from staff;
會看到刪除corp編號爲04的行,staff編號爲04的corpid行也會全部刪除。回滾後,又恢復了。

INSERT行級觸發器:
create or replace trigger insert_corp
    after insert on corp for each row
begin
    insert into staff(id,name,sex,corpid) values('09','王大海','男',:new.id)
end;
/

insert into corp(id,name) values('07','三產辦');

UPDATE行級觸發器:
create or replace trigger update_corp
    after update on corp for each row
begin
    update staff set corpid=:new.id where corpid=:old.id;
end;
/

update corp set id='UN' where id='04';
select * from corp;
select * from staff;
rollback;

在觸發器中不可以有commit/rollback;

觸發器中定義異常:
create or replace trigger del_staff
    after delete on staff for each row
begin
    if :old.id='01' then
       raise_application_error(-20000,'禁止刪除01行');
    end if;
end;
/
(自定義錯誤號必須在-20999~-20000之間)

語句級觸發器:
create table emp2_log
(
    uname varchar2(20),
    action varchar2(10),
    atime date
);
create or replace trigger trig_emp2
    after insert or delete or update on emp2 for each row
begin
    if inserting then
        insert into emp2_log values (USER, 'insert', sysdate);
    elsif updating then
        insert into emp2_log values (USER, 'update', sysdate);
    elsif deleting then
        insert into emp2_log values (USER, 'delete', sysdate);
    end if;
end;
/

insert into emp2(empno,ename,job,sal,comm,deptno) values(1345,'LL','AA',1200,23,10);
select empno,ename,job,sal,comm,deptno from emp2;
select * from emp2_log;

create table auto (a number,b varchar2(10));
insert into auto values(myseq.nextval,'TESTING...');
create or replace trigger tr_inc_auto
    before insert on auto for each row
declare
    sn number(5);
begin
    select myseq.nextval into sn from dual;
    :new.a:=sn;
end;
/
insert into auto values(21,'inc');

替換觸發器:
創建多表查詢視圖scview:
create or replace view scview(id,name,sex,corpid,company)
as
    select s.id,s.name,s.sex,c.id,c.name from staff s,corp c where s.corpid=c.id;
更新的替換觸發器,只能創建在表上。

create or replace trigger tr_scview
    instead of insert on scview for each row
begin
    insert into corp values(:new.corpid,:new.corp);
    insert into staff values(:new.id,:new.name,:new.sex,:new.corpid);
end;
/
select * from scview;
insert into scview(id,name,sex,corpid,corp) values('09','小桃子','女','09','信息科');

發佈了44 篇原創文章 · 獲贊 5 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章