Hitachi

ノンストップデータベース HiRDB Version 10 システム導入・設計ガイド(UNIX(R)用)


11.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'