5

我想在插入事件后创建触发器,但我需要插入的数据才能在 PostgreSQL 中为我的触发器注册到新表中

在 SQL Server 中,我从Inserteddeleted伪表中捕获这些值,但这些表是否也存在于 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 中,您使用OLDNEW特殊变量

NEW
数据类型RECORD;为行级触发器中的INSERT/操作保存新数据库行的变量。UPDATE这个变量NULL在语句级触发器和DELETE操作中。

OLD
数据类型RECORD;在行级触发器中为UPDATE/操作保存旧数据库行的变量。DELETE这个变量NULL在语句级触发器和INSERT操作中。

所以你可能想看看NEW.codigo, NEW.codigoconvenio, NEW.codigopresentacion, 和NEW.vigencia你的情况。您可能也会用一个简单的条件替换i.vigencia = 1WHERE 子句的一部分。IF i.vigencia = 1

于 2013-05-14T01:37:51.510 回答
3

for each row对于 Postgres 中的每一行,都会触发定义为的触发器。SQL Server 不支持行级触发器,只支持语句级触发器。

在行级触发器中,您始终只处理一行可以访问的旧值和新值(与 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 回答