2012-02-22 12 views
11

私は(あまりにも)多くのトリガを使用してデータベースを持っています。彼らはカスケードすることができます。クエリを実行したときにトリガされるトリガを知ることは可能ですか?

私は簡単なようで、クエリを、持っている、と決して私はすべてのトリガの影響を覚えています。だから、その単純なクエリは、実際には単純ではないかもしれないし、私が期待していることをしないかもしれません。

トリガーは、クエリを実行する前に解雇なるか知る方法はありますか、それを(まだコミットしていない)を実行した後にどのようなトリガを発射していますか?

SELECT … FROM user_triggers WHERE …のようなクエリには本当に関心がありません。すでに知っているからです。また、トリガーの発生条件がクエリで満たされるかどうかはわからないからです。

おかげ

+0

トリガーの実行をシミュレートする方法はわかりませんが、トリガー本体を変更できる場合は、名前とタイムスタンプを持つ専用テーブルに挿入などのログ文を追加したい場合があります。 ところで:もしあなたが11gを使用していれば、複合トリガを見てください。 – Toby

+0

@Toby、ログステートメントを追加することはアイデアですが、すべてを書き直すことになります。複合トリガーを見ても、まだ9iを使用しているお客様がいます。 – Benoit

答えて

3

"トリガーが多いデータベースがありますが、カスケードすることができます。"

これは、多くの人々がトリガーを分析する理由の1つに過ぎません。

「 クエリを実行する前に解雇だろうかトリガーを知る方法はあります」いいえ、あなたはUPDATEトリガー本体に見つけるかもしれない何かを考えてみましょう:

if :new.sal > :old.sal * 1.2 then 
    insert into big_pay_rises values (:new.empno, :old.sal, :new.sal, sysdate); 
end if; 

BIG_PAY_RISESのトリガが起動するかどうかをどのように判断できますか?アルゴリズムによっては、DML文を解析できない場合もあります。

DBA_TRIGGERSおよびDBA_DEPENDENCIESを再帰的に検索して、がカスケード内のすべてのトリガーを識別できるようにすることをお勧めします。しかし、どんなシナリオでも確実に発射されるものを特定することは不可能です。

"またはそれを実行した後(トリガされたトリガはまだコミットされていません)?

他の人が指摘したように、ロギングは一つの選択肢です。しかし、Oracle 11gを使用している場合、PL/SQL階層プロファイラという別のオプションがあります。これは、トリガーを含むPL/SQLの呼び出し、で触れたすべてのPL/SQLプログラム・ユニットを追跡する非侵入型のツールです。階層型プロファイラの優れた機能の1つは、他のスキーマに属するPUが含まれていることです。これは、カスケードトリガで役立つ可能性があります。

したがって、SQLを無名ブロックにラップし、階層プロファイラで呼び出すだけで済みます。次に、トリガーされたトリガーのみを表示するためにレポートをフィルターに掛けることができます。 Find out more

+0

これはまさに私が欲しかったことです。 10gでは普通の古いログが残っていると思われますが、テストデータベースの一部は11gです。 – Benoit

0

あり、クエリを解析と呼ばれるそのような事はありませんし、Uあなたのクエリに関連するトリガを与えます。それはこれほど簡単になるだろう。実行しているクエリからテーブル名を選択するだけで、クエリごとに次のクエリを使用してトリガを一覧表示するだけです。それは簡単ではないですか?

select trigger_name 
, trigger_type 
, status 
from dba_triggers 
where owner = '&owner' 
and table_name = '&table' 
order by status, trigger_name 
+0

それほど単純ではない、私は恐れている。再帰的です。テーブルAを更新します。これは、テーブルBにレコードを挿入する更新行トリガを起動します(さらに、3つの他のテーブルと、ステートメントトリガで2つ以上のテーブルが変更されます)。テーブルCに何かをさせる火災トリガなど。依存関係をトレースすることによって、少なくとも影響を受ける可能性のあるすべてのトリガーのセットをトレースすることで、より近づくことができます。しかし、実際に発射するものだけではありません。 –

+0

私が言ったのはまさにそのことです。私が与えたクエリは、1つのテーブルだけであり、すべてではありません。 – reddyvaribabu

1

トリガーは、クエリを実行する前に解雇なるか知る方法はあり、かがそれを実行した後にどのようなトリガを発射している(まだコミットされていませんか)?

この問題を解決するには、PL/SQLデバッガを使用して、匿名ブロック内で問合せを実行します。

関連する問題