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

猜你喜欢

转载自kely39.iteye.com/blog/1830497