【DM】ドリーム・データベースのトリガの例


テストデータセットの作成
DROP TABLE IF EXISTS TEST;
CREATE TABLE TEST(
	ID INT IDENTITY(1,1),
	NAME VARCHAR(50),
	CITY VARCHAR(50)
);
INSERT INTO TEST(NAME,CITY) VALUES(' ',' '),(' ',' '),(' ',' ');

例1:変更操作によるヒント
プログラム
CREATE OR REPLACE TRIGGER TRG
AFTER UPDATE OF NAME ON TEST
BEGIN
	PRINT ' ';
END;

結果
SQL> CREATE OR REPLACE TRIGGER TRG
2   AFTER UPDATE OF NAME ON TEST
3   BEGIN
4       PRINT ' ';
5   END;
6   /
 
 : 5.871( ).  :2006.
SQL> UPDATE TEST SET NAME=' ' WHERE ID='3';
 

  1

 : 0.851( ).  :2007.

テーブルの定義とトリガの定義の順序に注意してください.トリガが確立された後にターゲットテーブルが再構築されると、トリガは有効になりません.
インスタンス2:メタグループレベルトリガと文レベルトリガ、古い値と新しい値の印刷
プログラム
CREATE OR REPLACE TRIGGER TRG
AFTER UPDATE OF NAME ON TEST
FOR EACH ROW							-- 
BEGIN
	PRINT ' , '||:OLD.NAME||', '||:NEW.NAME;	
END;

-- :':OLD' ,':NEW' 。 , "FOR EACH STATEMENT" , 。

結果
SQL> CREATE OR REPLACE TRIGGER TRG
2   AFTER UPDATE OF NAME ON TEST
3   FOR EACH ROW						
4   BEGIN
5       PRINT ' , '||:OLD.NAME||', '||:NEW.NAME;  
6   END;
7   /
 
 : 55.198( ).  :2008.
SQL> UPDATE TEST SET NAME=' ' WHERE ID='3';
 , , 

  1

 : 14.871( ).  :2009.

例3:INSTAD OF型トリガ、置換動作
データセット構築:V 1ビュー
DROP TABLE IF EXISTS TEST;
CREATE TABLE TEST(
	ID INT IDENTITY(1,1),
	NAME VARCHAR(50),
	CITY VARCHAR(50)
);
INSERT INTO TEST(NAME,CITY) VALUES(' ',' '),(' ',' '),(' ',' ');
CREATE VIEW V1 AS SELECT * FROM TEST;

フリップフロップを作成
CREATE OR REPLACE TRIGGER TRI
INSTEAD OF UPDATE ON V1
BEGIN
	INSERT INTO TEST(NAME,CITY) VALUES(' ',' ');
END;

効果
SQL> UPDATE V1 SET CITY =' ' WHERE ID=1;
  1

 : 33.769( ).  :2019.
SQL> SELECT * FROM V1;

        ID          NAME CITY
---------- ----------- ---- ----
1          1              
2          2              
3          3              
4          4              

 : 0.548( ).  :2020.

INSTEAD OFトリガはビューに対してのみ有効であり、ベーステーブルは変更されません
例4:行レベルトリガと文レベルトリガの比較
上のテストデータに続く
プログラム
-- 
CREATE OR REPLACE TRIGGER TRI_1
AFTER UPDATE ON TEST
FOR EACH STATEMENT
BEGIN
	PRINT ' ';
END;
-- 
CREATE OR REPLACE TRIGGER TRI_2
AFTER UPDATE ON TEST
FOR EACH ROW					-- 
BEGIN
	PRINT ' ';
END;

効果
SQL> UPDATE TEST SET CITY=' ' WHERE ID IN (1,2,3,4,5);
 
 
 
 
 
 

  5

 : 1.339( ).  :2029.

AFTER/BEFORE型フリップフロップはビューでの作成はサポートされていません
INSTAD型トリガは行レベルのみで、変換も無効です
実行効果から見ると、文レベルのトリガは1回しかトリガーされず、行数に影響を与える回数によって異なります.