postgreSQL中的已插入,已删除的表,如SQL Server?

时间:2013-05-14 00:49:41

标签: postgresql triggers plpgsql

我想在插入的事件之后创建一个触发器,但是我需要插入的数据才能在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;

2 个答案:

答案 0 :(得分:2)

我不知道触发器在SQL Server中如何工作,但在PostgreSQL中,您使用OLD and NEW special variables

  

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

     

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

因此,您可能希望在案例中查看NEW.codigoNEW.codigoconvenioNEW.codigopresentacionNEW.vigencia。您可能也会用简单的i.vigencia = 1条件替换WHERE子句的IF i.vigencia = 1部分。

答案 1 :(得分:1)

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

在行级别触发器中,您始终可以处理完全一行,并且可以访问旧值和新值(非常类似于"插入""已删除&#34 ; SQL Server中的虚拟表)

您可以指定要引用这些记录的名称,默认值为newold(因为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;