スケーラブルデータベースサーバ HiRDB Version 8 システム導入・設計ガイド(UNIX(R)用)
トリガを定義すると,トリガを定義する表を使用する関数,手続き及びトリガのSQLオブジェクトは無効になるため,再作成する必要があります。トリガを定義する前にディクショナリ表のSQL_ROUTINE_RESOURCES表を参照すると,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='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))
トリガが使用している表,インデクスなどのリソースが定義,定義変更,又は削除されるとトリガのSQLオブジェクトは無効になります。また,トリガが使用している表にインデクスを定義したり,又はトリガが使用している表のインデクスを削除したりすると,トリガのSQLオブジェクトのインデクス情報が無効になります。
トリガのSQLオブジェクトが無効又はSQLオブジェクトのインデクス情報が無効の場合,トリガ契機となるSQLは実行できません。トリガのSQLオブジェクトの無効又はSQLオブジェクトのインデクス情報の無効を解除するには,定義系SQLのALTER TRIGGER又はALTER ROUTINEでトリガのSQLオブジェクトを再作成する必要があります。
ディクショナリ表のSQL_ROUTINE_RESOURCES,SQL_TRIGGER_USAGE,及びSQL_ROUTINE_PARAMSを参照すると,トリガが使用しているリソースの情報を得ることができます。
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
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
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
トリガ契機で指定されている列がすべて削除された場合,そのトリガは削除されます。表の列が削除される前に,削除されるトリガを確認する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('削除する列名',…))
表,インデクスなどを定義,定義変更,又は削除する前に,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'
表,インデクスなどを定義,定義変更,又は削除した後に,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'
All Rights Reserved. Copyright (C) 2006, 2016, Hitachi, Ltd.