Sql 触发后删除

Sql 触发后删除,sql,postgresql,function,triggers,sql-function,Sql,Postgresql,Function,Triggers,Sql Function,我的扳机有问题。这是我的扳机: CREATE TRIGGER calcul_auto_ht AFTER INSERT OR UPDATE OR DELETE ON ligne_commande FOR EACH ROW EXECUTE PROCEDURE f_montantht(); CREATE FUNCTION f_montantht() RETURNS TRIGGER AS $montantht$ declare montant numeric(7,2) := 0; montant_p

我的扳机有问题。这是我的扳机:

CREATE TRIGGER calcul_auto_ht AFTER INSERT OR UPDATE OR DELETE ON ligne_commande
FOR EACH ROW EXECUTE PROCEDURE f_montantht();
CREATE FUNCTION f_montantht() RETURNS TRIGGER AS $montantht$
declare
montant numeric(7,2) := 0; 
montant_par_ligne record; 
remise integer;

begin

for montant_par_ligne
in (select (quantite * prixpdt) as "montant_ligne" from commande c
left join ligne_commande lc
on lc.codecommande = c.codecommande
join produit pd
on pd.codepdt = lc.codepdt
where c.codecommande = NEW.codecommande)

loop
montant := montant + montant_par_ligne.montant_ligne;
end loop;

select into remise coderemise
from commande
where codecommande = NEW.codecommande;
if remise is not null then
montant := montant * (1-remise/100.);
end if;

UPDATE commande
SET montantht = montant
WHERE NEW.codecommande = codecommande;

return NULL;
END;
$montantht$ LANGUAGE 'plpgsql';
下面是触发器中提到的函数:

CREATE TRIGGER calcul_auto_ht AFTER INSERT OR UPDATE OR DELETE ON ligne_commande
FOR EACH ROW EXECUTE PROCEDURE f_montantht();
CREATE FUNCTION f_montantht() RETURNS TRIGGER AS $montantht$
declare
montant numeric(7,2) := 0; 
montant_par_ligne record; 
remise integer;

begin

for montant_par_ligne
in (select (quantite * prixpdt) as "montant_ligne" from commande c
left join ligne_commande lc
on lc.codecommande = c.codecommande
join produit pd
on pd.codepdt = lc.codepdt
where c.codecommande = NEW.codecommande)

loop
montant := montant + montant_par_ligne.montant_ligne;
end loop;

select into remise coderemise
from commande
where codecommande = NEW.codecommande;
if remise is not null then
montant := montant * (1-remise/100.);
end if;

UPDATE commande
SET montantht = montant
WHERE NEW.codecommande = codecommande;

return NULL;
END;
$montantht$ LANGUAGE 'plpgsql';
当我在ligne_命令中更新或添加值时,触发器正常工作,但当我要删除ligne_命令中的一行时,触发器不工作。事实上,我看不到任何更改,但如果我在删除后立即进行插入或更新,我将能够看到删除的结果(但我不希望总是需要这样做..)

我真的不知道为什么,你知道吗


谢谢:)

关于删除的
触发器没有新的
对象。在这种情况下,必须使用
OLD.codecommande
引用值。更多信息:

尝试将
NEW.codecommande
的用法替换为以下内容:

当TG_OP='DELETE'然后是OLD.codecomande ELSE NEW.codecomande END时的情况

如果这样做有效,您可以将此逻辑移动到在
开始之前声明的变量,使其成为一个更好的触发函数,如下所示(尽管我不确定您的数据类型):


如果您还需要支持
TRUNCATE
,则需要适当调整逻辑。

是的!非常感谢它的工作,我花了一整天的时间在这上面,你这么快就解决了,非常感谢!!