web-dev-qa-db-ja.com

トリガーから複数の関数を呼び出しますか?

PostgreSQL-9.2.4を実行します

トリガーから2つの関数を呼び出すことは可能ですか?

次のトリガーが起動した場合に実行される2つの異なるテーブルに対して2つの関数があるとします。

トリガー:

CREATE TRIGGER start ON system_status FOR EACH ROW
WHEN ((new.event = start_task))
EXECUTE PROCEDURE ...()

機能1:(タスクの開始時=>このシステムに以前割り当てられた次のタスクを削除)

CREATE FUNCTION void_next_task() RETURNS trigger AS $$

BEGIN
  DELETE FROM tasks_status ts
  WHERE ts.system = NEW.system
  AND ts.event = 'next_task';
  RETURN NEW;
  END;

$$

LANGUAGE plpgsql

関数2:tasksystemの組み合わせを挿入した場合、すでにテーブルに表示されている=>以前のレコードにこれをマークしますdeleted)としての組み合わせ

CREATE FUNCTION void_dup_task() RETURNS trigger AS $$

BEGIN
  UPDATE system_status ss
  SET deleted = 'TRUE'
  WHERE ss.system = NEW.system
  AND ss.task = NEW.task
  AND ss.deleted IS FALSE;
  RETURN NEW;
  END;

$$

LANGUAGE plpgsql

だから私はそれを解決するために次の方法で終わった:

  1. 2つの関数を呼び出すトリガーを設定するには、
  2. あるテーブルで更新を実行し、別のテーブルで削除する機能を持つこと。
  3. 2つのまったく同じトリガーと2つの異なる関数を使用するには、

先に進み、ソリューションを実装する前に3解決策があれば教えてください1または2はまったく可能ですか?

8
VL-80

trigger は、onetigger関数のみを呼び出すことができるため、noをitem1。

好ましい形式はitem2。IMOです。単一のplpgsql関数に必要なだけSQLステートメントを入れることができます。

アイテム3。も可能です。まあ、まったく同じ同じトリガーではなく、名前は異なる必要があります。同じイベントのトリガーは、アルファベット順に起動します。しかし、私は2つの別々の関数に利益が見られません。より多くのコードとオーバーヘッド、および2つの関数呼び出しがあり、コストが高くなります。

2。は誰もが認める勝利者です。

10

完全を期すために、番号4もあります。トリガー関数ではなく通常の関数を作成し、トリガー関数から両方(または条件によっては1つだけ)を呼び出します。これにはいくつかの欠点があります。通常の関数ではNEWとOLDを使用できず、データを関数に渡す必要があるため、ケース3よりもオーバーヘッドが大きくなります。この場合、大きなメリットはありません。私が想像できる唯一の利点は、非常に複雑なトリガー関数のコードの可読性です。

私はこれを大きな分岐関数に対して実行しました(テーブルAでいくつかのチェックと更新を実行し、列A.1に応じてテーブルB、C、またはDで他のいくつかの更新を実行した後、Bの更新がFまたはGなど);それでも、分割しておくか、単一の関数に戻す必要があるのか​​と思います。

編集:これが役立つ別のケースは、コードの一部が複数のトリガー関数によって共有されている場合です。次に、コード全体を再度書き込む代わりに、コードを1回だけ記述して関数を呼び出すと便利です。繰り返しになりますが、あなたの場合のように、数行のコードではそれは価値がありません。

2
Pavel V.