oracle觸發器基礎

基礎書籍中記錄下來的。

--1、語句觸發器
create or replace trigger tr_insert_test1
before insert
on test1
begin
  if user!='admin' then
    raise_application_error(-20001,'權限不足,不能向數據表中插入數據1');
  end if;
end;
--多個激活動作
create or replace trigger tr_insert_test2
before insert or update or delete
on test1
begin
  if user!='KELY' then--區分大小寫,統一大寫
    raise_application_error(-20001,'權限不足,不能向數據表中插入數據2');
  end if;
end;

--觸發器謂詞:INSERTING、UPDATING、DELETING(類型布爾值)
--記錄數據庫表操作日誌,使用觸發器
create table t_log(
       u_name varchar2(20),
       action varchar2(50),
       log_time date default sysdate
);
create or replace trigger tr_table_log
after insert or update or delete
on test1
begin
  if inserting then
    insert into t_log(u_name,action) values(user,'insert');
  end if;
  if updating then
    insert into t_log(u_name,action) values(user,'update');
  end if;
  if deleting then
    insert into t_log(u_name,action) values(user,'delete');
  end if;
end;
--禁用表的權限校驗觸發器
alter trigger tr_table_log enable;--disable/enable

--總結:作用級別爲表(不支持視圖before/after insert和表before/after select),
--     無論觸發動作影響到多少記錄都執行一次觸發器

--2、行觸發器
       insert      update     delete
:old   不可用       可用        可用   
:new    可用        可用       不可用

--實例
create or replace trigger tr_test1_history
before update or delete
on test1
for each row --行觸發器的標誌
  begin
    insert into test1_history values(:old.tid,:old.tname,:old.tage,:old.remark);
  end;

--變量引用於referencing
create or replace trigger tri_test1_insert
before insert
on test1
referencing new as new_value
for each row 
begin
  declare max_id number;
  begin
    select max(tid) into max_id from test1;
    :new_value.tid := max_id+1;
  end;
end;
--觸發器的條件限制

--3、instead of觸發器(視圖)

--4、系統事件與用戶事件觸發器
--系統事件觸發器
--after startup/before shutdown(系統事件) on database
--用戶事件觸發器
-- on system.schema:指定觸發器的作用對象爲用戶system的所有對象(表名)
--5、觸發器相關操作
--禁用/啓用觸發器:disable(alter trigger tr_name disable/enable)
--數據字典中查看觸發器:user_objects/user_triggers

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章