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:(task
とsystem
の組み合わせを挿入した場合、すでにテーブルに表示されている=>以前のレコードにこれをマークします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
だから私はそれを解決するために次の方法で終わった:
先に進み、ソリューションを実装する前に3
解決策があれば教えてください1
または2
はまったく可能ですか?
trigger は、onetigger関数のみを呼び出すことができるため、noをitem1。
好ましい形式はitem2。IMOです。単一のplpgsql関数に必要なだけSQLステートメントを入れることができます。
アイテム3。も可能です。まあ、まったく同じ同じトリガーではなく、名前は異なる必要があります。同じイベントのトリガーは、アルファベット順に起動します。しかし、私は2つの別々の関数に利益が見られません。より多くのコードとオーバーヘッド、および2つの関数呼び出しがあり、コストが高くなります。
2。は誰もが認める勝利者です。
完全を期すために、番号4もあります。トリガー関数ではなく通常の関数を作成し、トリガー関数から両方(または条件によっては1つだけ)を呼び出します。これにはいくつかの欠点があります。通常の関数ではNEWとOLDを使用できず、データを関数に渡す必要があるため、ケース3よりもオーバーヘッドが大きくなります。この場合、大きなメリットはありません。私が想像できる唯一の利点は、非常に複雑なトリガー関数のコードの可読性です。
私はこれを大きな分岐関数に対して実行しました(テーブルAでいくつかのチェックと更新を実行し、列A.1に応じてテーブルB、C、またはDで他のいくつかの更新を実行した後、Bの更新がFまたはGなど);それでも、分割しておくか、単一の関数に戻す必要があるのかと思います。
編集:これが役立つ別のケースは、コードの一部が複数のトリガー関数によって共有されている場合です。次に、コード全体を再度書き込む代わりに、コードを1回だけ記述して関数を呼び出すと便利です。繰り返しになりますが、あなたの場合のように、数行のコードではそれは価値がありません。