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
,则需要适当调整逻辑。是的!非常感谢它的工作,我花了一整天的时间在这上面,你这么快就解决了,非常感谢!!