5

挿入されたイベントの後にトリガーを作成したいのですが、PostgreSQL でトリガー用の新しいテーブルに登録するために挿入したデータが必要です

SQL Server では、Insertedまたはdeleted疑似テーブルからこれらの値をキャプチャしますが、これらのテーブルは PostgreSQL にも存在しますか? または、どうすればよいですか?

これは私のトリガーコードです

CREATE TRIGGER tri_compago
  AFTER INSERT
  ON matricula
  FOR EACH ROW
  EXECUTE PROCEDURE fn_insCompPago();

CREATE OR REPLACE FUNCTION fn_insCompPago()
  RETURNS trigger AS
$BODY$
  DECLARE
  BEGIN

   insert into compromisopago(codigotasa,descripcion,precio,fechavencimiento,codigomatricula)
   select codigotasa,descripcion,precio,fechavencimiento,i.codigo
   from programacionpago pp join inserted i on isnull(i.codigoconvenio,0) = isnull (pp.codigoconvenio,0)
   and pp.codigopresentacion = i.codigopresentacion
   where pp.vigencia = 1 and i.vigencia = 1;

   RETURN NULL;
  END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION fn_insCompPago()
  OWNER TO postgres;
4

2 に答える 2

4

SQL Server でトリガーがどのように機能するかはわかりませんが、PostgreSQL では、OLDおよびNEW特殊変数を使用します。

NEW
データ型RECORD; INSERT/UPDATE行レベル トリガーでの操作の新しいデータベース行を保持する変数。この変数はNULL、ステートメント レベルのトリガーとDELETE操作用です。

OLD
データ型RECORD; UPDATE/DELETE行レベル トリガーの操作用の古いデータベース行を保持する変数。この変数はNULL、ステートメント レベルのトリガーとINSERT操作用です。

したがって、あなたのケースでNEW.codigoは、 、NEW.codigoconvenioNEW.codigopresentacion、およびを見たいと思うでしょう。おそらく、WHERE 句の部分も単純な条件にNEW.vigencia置き換えるでしょう。i.vigencia = 1IF i.vigencia = 1

于 2013-05-14T01:37:51.510 に答える
3

として定義されたトリガーfor each rowは、Postgres の各行に対して起動されます。SQL Server は行レベルのトリガーをサポートせず、ステートメント レベルのトリガーのみをサポートします。

行レベル トリガー内では、古い値と新しい値にアクセス可能な 1 つの行を常に処理します(SQL Server の "挿入" および "削除" 仮想テーブルに非常に大まかに匹敵します)。

これらのレコードを参照する名前を指定できます。デフォルトはnewandですold(mu が短すぎるため、既に説明しました)。

関心のある値は「スカラー」値として利用できるため、挿入を行うために結合する必要はありません。

insert into compromisopago
  (codigotasa,descripcion,precio,fechavencimiento,codigomatricula)
select codigotasa,
       descripcion,
       precio,
       fechavencimiento,
       new.codigo
from programacionpago pp 
where pp.vigencia = 1 
  and i.vigencia = 1;
  and pp.codigoconvenio = new.codigoconvenio
  and pp.codigopresentacion = new.codigopresentacion;
于 2013-05-14T06:58:34.687 に答える