基础书籍中记录下来的。
--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