2013-05-14 77 views
3

我想插入事件之后创建触发器,但我需要,我才能在PostgreSQL的在PostgreSQL中插入,删除表,如SQL Server?

注册到一个新的表我的触发器在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

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

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

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

所以你可能想看看NEW.codigo,你的情况NEW.codigoconvenioNEW.codigopresentacionNEW.vigencia。您可能会用IF i.vigencia = 1条件替换WHERE子句的i.vigencia = 1部分。

1

定义为for each row的触发器在Postgres中的每一行被触发 - 很好 - 。 SQL Server不支持行级触发器,只支持语句级触发器。

里面一个行级触发器,你总是处理正好一行与新旧值接近(很大致相当于“插入”和“删除”,在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; 
+0

技术上(这是鸡蛋里挑骨头),你有两排,新旧;-) – 2013-06-04 12:13:52

+0

@ChrisTravers:你是对的;) – 2013-06-04 12:17:25