1. 程式人生 > >Oracle觸發器

Oracle觸發器

prim let values err rac null insert tput dbms

-----------------------------觸發器-----------------------
--定義方式:
create or replace trigger 觸發器名稱
before | after 
insert | update [ of 列名] | delete  -- insert or update or delete 
on 表名
[for each row]

[declare]

begin
  
end;

---向emp中插入一條數據,打印一句話“新增一名員工”
create or replace trigger tri_add
after 
delete -- insert or update or delete 
on emp
begin
  dbms_output.put_line(‘新增一名員工‘);
end;

insert into emp(empno) values(12);

---假如今天2017-06-08系統維護,禁止修改emp中的數據
create or replace trigger tri_emp
before
insert or update or delete 
on emp
--for each row
declare
 v_date_str varchar2(20);
begin
  select to_char(sysdate,‘yyyy-mm-dd‘) into v_date_str from dual;

  if v_date_str=‘2017-06-08‘ then
--  判斷當前時間是否是2017-06-08
  --如果是 錯誤的提示窗口
  raise_application_error(-20002,‘今天2017-06-08系統維護,禁止修改emp中的數據‘);
  end if;
end;

insert into emp(empno) values(23);

select * from emp

update emp set ename=‘TOM‘ where empno=11

delete from emp where empno=11


create table t_test(
tid number(6) primary key,
tname varchar2(30)
)
create sequence seq_test;
select * from t_test
insert into t_test(tname) values(‘tom‘);

create or replace trigger tri_test
before
insert
on t_test
for each row  --如果用到:new 或者:old 必須使用for each row
declare

begin
  -- :new   :old  偽記錄
  --對即將插入的數據設置tid
  select seq_test.nextval into :new.tid from dual;
end;


         :new   :old 
update    
delete   null   
insert          null

update emp set ename=‘TOM‘ where empno=11


--------------備份數據
修改員工的工資,把工資數據做備份

創建一個工資備份表
create table sal_backup(
sid number(7) primary key,
empno number(7),
sal0 number(7,2),--修改之前
sal1 number(7,2),--修改之後
sal_date date
)
create sequence  seq_sal_backup

create or replace trigger tri_sal
 before
update of sal --只針對修改sal
on emp
for each row
declare
     --:new  :old
begin
  insert into sal_backup values(seq_sal_backup.nextval,:new.empno,:old.sal,:new.sal,sysdate);
end;

update emp set sal=1000 where empno=11

Oracle觸發器