トリガーボディにトリガーの親スキーマを指定します
-
29-10-2019 - |
質問
の IBMシステム用のDB2 i このトリガーを作成するためのトリガーを作成します MYLOGTABLE
すべての挿入操作が作成されました MYCHECKEDTABLE
:
SET SCHEMA MYSCHEMA;
CREATE TRIGGER MYTRIGGER AFTER INSERT ON MYCHECKEDTABLE
REFERENCING NEW AS ROWREF
FOR EACH ROW BEGIN ATOMIC
INSERT INTO MYLOGTABLE -- after creation becomes MYSCHEMA.MYLOGTABLE
(MMACOD, OPTYPE, OPDATE)
VALUES (ROWREF.ID, 'I', CURRENT TIMESTAMP);
END;
DBMSはトリガー本体を保存します MYSCHEMA.MYLOGTABLE
ハードコード。
ここで、スキーマ全体を新しいスキーマとしてコピーすることを想像してみてください NEWSCHEMA
. 。にレコードを挿入するとき NEWSCHEMA.MYCHECKEDTABLE
ログレコードが追加されます MYSCHEMA.MYLOGTABLE
それ以外の NEWSCHEMA.MYLOGTABLE
, 、つまり、トリガーとそのテーブルが生きているスキーマで。これは大きな問題の原因です!!また、多くのユーザーが私の制御せずにスキーマをコピーできるからです...
そう、 トリガー本体で、トリガーが生きるスキーマを指定する方法はありますか? このようにして、ログレコードを正しいものに書きます MYLOGTABLE
. 。何かのようなもの PARENT SCHEMA
...またはaがあります 回避策?どうもありがとう!
解決 2
残念ながら、私はトリガーが生きているスキーマに気付きました 検出できません 内側のトリガーの体から。
しかし、いくつかの回避策があります(おかげで @krmilligan それも):
- ユーザーの権限を奪って実行します
CPYLIB
そして、それらにユーティリティを使用させます。 - 同期が外れているトリガーを探して、周囲を動作させるシステム上にバックグラウンドエージェントを作成します。
- コマンド用
CPYLIB
デフォルトを設定しますTRG
のオプション*NO
. 。このようにして、ユーザーが明示的に指定した場合を除き、トリガーはコピーされることはありません。
トリガーコピーが必要なコンテキストがある場合でも、最後のものを選択します。そのような場合、私は最初の回避策を講じます。
他のヒント
HLLで定義された外部トリガーは、トリガーを発射したテーブルのライブラリ名を含むトリガーバッファーにアクセスできます。これは、 MYLOGTABLE
.
IBM Redbookの第11.2章「トリガープログラム構造」を参照してください ISERIES用のDB2ユニバーサルデータベース上のストアドプロシージャ、トリガー、およびユーザー定義関数 詳細については。
または、使用できる場合があります CURRENT SCHEMA
特別登録または GET DESCRIPTOR
トリガーやテーブルが現在どこにあるかを調べるための声明。