12.5.4 トリガの管理
- 〈この項の構成〉
(1) トリガの定義
トリガを定義すると,トリガを定義する表を使用する関数,手続き及びトリガのSQLオブジェクトは無効になるため,再作成する必要があります。トリガを定義する前にディクショナリ表のSQL_ROUTINE_RESOURCES表を参照すると,SQLオブジェクトが無効になる関数,手続き及びトリガを確認できます。無効になるSQLオブジェクトを確認して,再作成してください。
(a) トリガの定義によってSQLオブジェクトが無効になる関数,手続き及びトリガの確認
トリガの定義によってSQLオブジェクトが無効になる関数,手続き及びトリガを確認するSQLの例を次に示します。なお,無効になるのがトリガの場合はTRIGGER_NAMEとしてそのトリガ識別子が得られます。関数及び手続きの場合はTRIGGER_NAMEがNULLになります。
SELECT DISTINCT B.ROUTINE_SCHEMA, B.ROUTINE_NAME, B.SPECIFIC_NAME, A.TRIGGER_NAME FROM MASTER.SQL_ROUTINE_RESOURCES B LEFT JOIN MASTER.SQL_TRIGGERS A ON B.ROUTINE_SCHEMA=A.TRIGGER_SCHEMA AND B.SPECIFIC_NAME=A.SPECIFIC_NAME WHERE B.BASE_TYPE='R' AND B.BASE_OWNER='トリガを定義する表の所有者の認可識別子' AND B.BASE_NAME='トリガを定義する表の識別子' AND (B.列名※ ='Y' OR ( B.INSERT_OPERATION IS NULL AND B.UPDATE_OPERATION IS NULL AND B.DELETE_OPERATION IS NULL))
- 注※
-
INSERTを契機とするトリガを定義すると無効になるSQLオブジェクトを検索する場合には,列名にINSERT_OPERATIONを,UPDATEを契機とするトリガの場合はUPDATE_OPERATIONを,DELETEを契機とするトリガの場合はDELETE_OPERATIONを指定します。
(2) トリガのSQLオブジェクトの再作成
トリガが使用している表,インデクスなどのリソースが定義,定義変更,又は削除されるとトリガのSQLオブジェクトは無効になります。また,トリガが使用している表にインデクスを定義したり,又はトリガが使用している表のインデクスを削除したりすると,トリガのSQLオブジェクトのインデクス情報が無効になります。
トリガのSQLオブジェクトが無効又はSQLオブジェクトのインデクス情報が無効の場合,トリガ契機となるSQLは実行できません。トリガのSQLオブジェクトの無効又はSQLオブジェクトのインデクス情報の無効を解除するには,定義系SQLのALTER TRIGGER又はALTER ROUTINEでトリガのSQLオブジェクトを再作成する必要があります。
(a) トリガが使用しているリソースを確認する方法
ディクショナリ表のSQL_ROUTINE_RESOURCES,SQL_TRIGGER_USAGE,及びSQL_ROUTINE_PARAMSを参照すると,トリガが使用しているリソースの情報を得ることができます。
-
トリガ動作条件で使用するリソースを確認するSQLの例
SELECT B.* FROM MASTER.SQL_TRIGGERS A, MASTER.SQL_TRIGGER_USAGE B WHERE A.TRIGGER_SCHEMA='スキーマ名' AND A.TRIGGER_NAME='トリガ識別子' AND A.TRIGGER_SCHEMA=B.TRIGGER_SCHEMA AND A.TRIGGER_NAME=B.TRIGGER_NAME
-
新旧値別名を指定したトリガSQL中で使用する列リソースを確認するSQLの例
SELECT B.* FROM MASTER.SQL_TRIGGERS A, MASTER.SQL_ROUTINE_PARAMS B WHERE A.TRIGGER_SCHEMA='スキーマ名' AND A.TRIGGER_NAME='トリガ識別子' AND A.TRIGGER_SCHEMA=B.ROUTINE_SCHEMA AND A.SPECIFIC_NAME=B.SPECIFIC_NAME
-
上記以外でトリガが使用するリソースを確認するSQLの例
SELECT B. * FROM MASTER.SQL_TRIGGERS A, MASTER.SQL_ROUTINE_RESOURCES B WHERE A.TRIGGER_SCHEMA='スキーマ名' AND A.TRIGGER_NAME='トリガ識別子' AND A.TRIGGER_SCHEMA=B.ROUTINE_SCHEMA AND A.SPECIFIC_NAME=B.SPECIFIC_NAME
(b) 表の列削除の前に,削除されるトリガを確認する方法
トリガ契機で指定されている列がすべて削除された場合,そのトリガは削除されます。表の列が削除される前に,削除されるトリガを確認するSQLの例を次に示します。
SELECT A.TRIGGER_SCHEMA, A.TRIGGER_NAME FROM MASTER.SQL_TRIGGERS A WHERE A.N_UPDATE_COLUMNS>0 AND A.TABLE_SCHEMA='列削除する表の所有者の認可識別子' AND A.TABLE_NAME='列削除する表の表識別子' AND NOT EXISTS(SELECT * FROM MASTER.SQL_TRIGGER_COLUMNS B WHERE B.TRIGGER_SCHEMA=A.TRIGGER_SCHEMA AND B.TRIGGER_NAME=A.TRIGGER_NAME AND B.TABLE_SCHEMA=A.TABLE_SCHEMA AND B.TABLE_NAME=A.TABLE_NAME AND B.COLUMN_NAME NOT IN('削除する列名',…))
(c) 表,インデクスなどの定義,定義変更,削除の前にSQLオブジェクトが無効又はSQLオブジェクトのインデクス情報が無効になる関数,手続き及びトリガを確認する方法
表,インデクスなどを定義,定義変更,又は削除する前に,SQLオブジェクトが無効又はSQLオブジェクトのインデクス情報が無効になる関数,手続き及びトリガを確認するSQLの例を次に示します。なお,無効になるのがトリガの場合はTRIGGER_NAMEとしてそのトリガ識別子が得られます。関数及び手続きの場合はTRIGGER_NAMEがNULLになります。
-
表(ビュー表も含む)の定義変更及び削除,又はインデクス定義(インデクスを定義する表のスキーマ名と表識別子を指定)の場合
SELECT DISTINCT B.ROUTINE_SCHEMA, B.ROUTINE_NAME, B.SPECIFIC_NAME, A.TRIGGER_NAME FROM MASTER.SQL_ROUTINE_RESOURCES B LEFT JOIN MASTER.SQL_TRIGGERS A ON B.ROUTINE_SCHEMA=A.TRIGGER_SCHEMA AND B.SPECIFIC_NAME=A.SPECIFIC_NAME WHERE B.BASE_TYPE IN('R','V') AND B.BASE_OWNER='表(ビュー)の所有者の認可識別子' AND B.BASE_NAME='表(ビュー)の表識別子'
-
インデクス削除の場合
SELECT DISTINCT B.ROUTINE_SCHEMA, B.ROUTINE_NAME, B.SPECIFIC_NAME, A.TRIGGER_NAME FROM MASTER.SQL_ROUTINE_RESOURCES B LEFT JOIN MASTER.SQL_TRIGGERS A ON B.ROUTINE_SCHEMA=A.TRIGGER_SCHEMA AND B.SPECIFIC_NAME=A.SPECIFIC_NAME WHERE B.BASE_TYPE ='I' AND B.BASE_OWNER='インデクスの所有者の認可識別子' AND B.BASE_NAME='インデクスの識別子'
-
関数,又は手続き削除の場合
SELECT DISTINCT B.ROUTINE_SCHEMA, B.ROUTINE_NAME, B.SPECIFIC_NAME, A.TRIGGER_NAME FROM MASTER.SQL_ROUTINE_RESOURCES B LEFT JOIN MASTER.SQL_TRIGGERS A ON B.ROUTINE_SCHEMA=A.TRIGGER_SCHEMA AND B.SPECIFIC_NAME=A.SPECIFIC_NAME WHERE B.BASE_TYPE ='P' AND B.BASE_OWNER='関数又は手続きの所有者の認可識別子' AND B.BASE_NAME='ルーチン識別子'
-
トリガ削除の場合
SELECT DISTINCT B.ROUTINE_SCHEMA, B.ROUTINE_NAME, B.SPECIFIC_NAME, A.TRIGGER_NAME FROM MASTER.SQL_ROUTINE_RESOURCES B LEFT JOIN MASTER.SQL_TRIGGERS A ON B.ROUTINE_SCHEMA=A.TRIGGER_SCHEMA AND B.SPECIFIC_NAME=A.SPECIFIC_NAME WHERE B.BASE_TYPE ='T' AND B.BASE_OWNER='トリガの所有者の認可識別子' AND B.BASE_NAME='トリガ識別子'
-
スキーマ削除の場合
SELECT DISTINCT B.ROUTINE_SCHEMA, B.ROUTINE_NAME, B.SPECIFIC_NAME, A.TRIGGER_NAME FROM MASTER.SQL_ROUTINE_RESOURCES B LEFT JOIN MASTER.SQL_TRIGGERS A ON B.ROUTINE_SCHEMA=A.TRIGGER_SCHEMA AND B.SPECIFIC_NAME=A.SPECIFIC_NAME WHERE B.BASE_OWNER='スキーマ名'
-
ユーザ定義型削除の場合
SELECT B.ROUTINE_SCHEMA, B.ROUTINE_NAME, B.SPECIFIC_NAME, A.TRIGGER_NAME FROM MASTER.SQL_ROUTINE_RESOURCES B LEFT JOIN MASTER.SQL_TRIGGERS A ON B.ROUTINE_SCHEMA=A.TRIGGER_SCHEMA AND B.SPECIFIC_NAME=A.SPECIFIC_NAME WHERE B.BASE_NAME='削除するデータ型識別子' AND B.BASE_TYPE='D' UNION SELECT B.ROUTINE_SCHEMA, B.ROUTINE_NAME, B.SPECIFIC_NAME, A.TRIGGER_NAME FROM MASTER.SQL_ROUTINES C INNER JOIN MASTER.SQL_ROUTINE_RESOURCES B ON C.SPECIFIC_NAME=B.BASE_NAME LEFT JOIN MASTER.SQL_TRIGGERS A ON B.ROUTINE_SCHEMA=A.TRIGGER_SCHEMA AND B.SPECIFIC_NAME=A.SPECIFIC_NAME WHERE C.ROUTINE_ADT_OWNER='削除するユーザ定義型の所有者の認可識別子' AND C.ROUTINE_ADT_NAME='削除するデータ型識別子' AND B.BASE_TYPE='P'
(d) 表,インデクスなどの定義,定義変更,削除の後にSQLオブジェクトが無効又はSQLオブジェクトのインデクス情報が無効になった関数,手続き及びトリガを確認する方法
表,インデクスなどを定義,定義変更,又は削除した後に,SQLオブジェクトが無効又はSQLオブジェクトのインデクス情報が無効になったトリガを確認するには,それぞれディクショナリ表のSQL_TRIGGER表のTRIGGER_VALID列,INDEX_VALID列を参照します。TRIGGER_VALID列の内容が'N'の場合,そのトリガのSQLオブジェクトは無効になっています。また,INDEX_VALID列の内容が'N'の場合,そのトリガのSQLオブジェクトのインデクス情報は無効になっています。
表,インデクスなどを定義,定義変更,又は削除した後に,SQLオブジェクトが無効又はSQLオブジェクトのインデクス情報が無効になった関数,手続き及びトリガを確認するSQLの例を次に示します。なお,無効になるのがトリガの場合はTRIGGER_NAMEとしてそのトリガ識別子が得られます。関数及び手続きの場合はTRIGGER_NAMEがNULLになります。
SELECT 'TRIGGER', TRIGGER_SCHEMA AS "SCHEMA", TRIGGER_NAME AS "NAME", TRIGGER_VALID AS "OBJECT_VALID", INDEX_VALID FROM MASTER.SQL_TRIGGERS WHERE TRIGGER_VALID='N' OR INDEX_VALID='N' UNION SELECT 'ROUTINE', ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_VALID, INDEX_VALID FROM MASTER.SQL_ROUTINES WHERE ROUTINE_VALID='N' OR INDEX_VALID='N'