oracle

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(*)
----------
0SQL>   
タイトルとURLをコピーしました