質問

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 トリガーやテーブルが現在どこにあるかを調べるための声明。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top