スケーラブルデータベースサーバ HiRDB Version 8 システム導入・設計ガイド(Windows(R)用)

[目次][索引][前へ][次へ]

12.5.4 トリガの管理

<この項の構成>
(1) トリガの定義
(2) トリガのSQLオブジェクトの再作成

(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を参照すると,トリガが使用しているリソースの情報を得ることができます。

(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になります。

(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'