17-Oracle学习_触发器

详细出处参考:http://www.jb51.net/article/18252.htm
触发器

1, 概念

    触发器 是特定事件出现的时候,自动执行的代码块。
    类似于存储过程,但是用户不能直接调用他们。 

2, 例子

(1) 准备
create tabel emp2 as select * from emp;
-- 谁 做了什么操作 在什么时间
create table emp2_log
(
    uname varchar2(20),
    action varchar2(10),
    atime date
);


(2) 创建
create or replace trigger trig
    after insert or delete or update    -- 执行的时机
    on emp2                             -- 操作emp2时
    for each row                        -- 每一行数据的更改, 都触发
declare
    v_action emp2_log.action%type;
begin
    if inserting then
        v_action := 'insert';
    elsif updating then
        v_action := 'update';
    elsif deleting then
        v_action := 'delete';
    end if;


    insert into emp2_log values(USER, v_action, sysdate);
end;


(3) 测试


3, 更新被参考的字段的值

(1) 引出
SQL> update dept set deptno = 99 where deptno = 10;
ORA-02292: 违反完整约束条件 (SCOTT.FK_DEPTNO) - 已找到子记录


(2) 创建触发器
drop trigger trig;
create or replace trigger trig
    after update on dept
    for each row
begin
    update emp set deptno = :NEW.deptno where deptno = :OLD.deptno; 
end;


(3) 更新 dept
成功

(4) 回滚


4. Oracle自增长的简单实现

drop table users;

create table users(   
   id number primary key
  ,username char(40)
  ,password char(40) 
);

create sequence users_id_seq;

CREATE or replace TRIGGER users_id_TRIGGER BEFORE
INSERT ON users FOR EACH ROW
begin
  select users_id_seq.nextval into :new.id from dual;
end;

insert into users(username, password) values('a1','b1');
insert into users(username, password) values('a2','b2');

select * from users;



你可能感兴趣的:(触发器,oracle学习)