我想在插入的事件之后创建一个触发器,但是我需要插入的数据才能在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;
答案 0 :(得分:2)
我不知道触发器在SQL Server中如何工作,但在PostgreSQL中,您使用OLD
and NEW
special variables:
NEW
数据类型RECORD
;变量在行级触发器中保存INSERT
/UPDATE
个操作的新数据库行。此变量在语句级触发器和NULL
操作中为DELETE
。
OLD
数据类型RECORD
;变量保存行级触发器中UPDATE
/DELETE
操作的旧数据库行。此变量在语句级触发器和NULL
操作中为INSERT
。
因此,您可能希望在案例中查看NEW.codigo
,NEW.codigoconvenio
,NEW.codigopresentacion
和NEW.vigencia
。您可能也会用简单的i.vigencia = 1
条件替换WHERE子句的IF i.vigencia = 1
部分。
答案 1 :(得分:1)
对于Postgres中的每一行,都会触发定义为for each row
的触发器。 SQL Server不支持行级触发器,仅支持语句级触发器。
在行级别触发器中,您始终可以处理完全一行,并且可以访问旧值和新值(非常类似于"插入""已删除&#34 ; SQL Server中的虚拟表)
您可以指定要引用这些记录的名称,默认值为new
和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;