ksaitoの日記

日々試したことの覚え書き

Oracleのトリガー

データベースに更新があったときに確実にやっておきたいことを実装する仕組みです。
どこを見ても難しい説明とサンプルしかないので簡単なサンプルを動かしてみました。
T1テーブルへのINSERT/UPDATE/DELETEをT2テーブルに適用するトリガーです。
これで、いろいろと試すことができます。

サンプル

$ cat sample.sql
COLUMN f1 FORMAT a10;
COLUMN f2 FORMAT a10;
DROP TABLE T1;
DROP TABLE T2;
CREATE TABLE T1 ( f1 VARCHAR2(255), f2 VARCHAR2(255));
ALTER TABLE T1 ADD PRIMARY KEY (f1);
CREATE TABLE T2 ( f1 VARCHAR2(255), f2 VARCHAR2(255));
ALTER TABLE T2 ADD PRIMARY KEY (f1);

CREATE OR REPLACE TRIGGER TRIG_T1
 BEFORE INSERT OR UPDATE OR DELETE
 ON T1
 FOR EACH ROW
DECLARE
BEGIN
  dbms_output.put_line('old.f1:' || :OLD.f1);
  dbms_output.put_line('new.f1:' || :NEW.f1);
  dbms_output.put_line('old.f2:' || :OLD.f2);
  dbms_output.put_line('new.f2:' || :NEW.f2);
  IF INSERTING THEN
    dbms_output.put_line('Insert!');
    INSERT INTO T2 VALUES(:NEW.f1, :NEW.F2);
  ELSIF UPDATING THEN
    dbms_output.put_line('Update!');
    UPDATE T2 SET f1 = :NEW.f1, f2 = :NEW.f2 WHERE f1 = :OLD.f1;
  ELSIF DELETING THEN
    dbms_output.put_line('Delete!');
    DELETE FROM T2 WHERE f1 = :OLD.f1;
  END IF;
END;
/

set serveroutput on
/
insert into T1 values('key', 'value');
select * from T2;
update T1 set f1 = 'key2', f2 = 'value2';
select * from T2;
delete from T1;
select count(*) from T2;
$

実行結果

$ sqlplus scott/tiger@XE @sample.sql

SQL*Plus: Release 10.2.0.1.0 - Production on Sat Feb 13 23:20:50 2010

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


Connected to:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production


Table dropped.


Table dropped.


Table created.


Table altered.


Table created.


Table altered.


Trigger created.


Trigger created.

old.f1:
new.f1:key
old.f2:
new.f2:value
Insert!

1 row created.


F1	   F2
---------- ----------
key	   value

old.f1:key
new.f1:key2
old.f2:value
new.f2:value2
Update!

1 row updated.


F1	   F2
---------- ----------
key2	   value2

old.f1:key2
new.f1:
old.f2:value2
new.f2:
Delete!

1 row deleted.


  COUNT(*)
----------
	 0

SQL>