基礎書籍中記錄下來的。
--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