Code:
CREATE OR REPLACE FUNCTION delete_patrol(patrol_id integer)
RETURNS void AS
$BODY$
BEGIN
UPDATE "Contacts" SET "ChangedTS" = now(), "ID_Patrol" = NULL WHERE "ID_Patrol" = patrol_id;
IF FOUND THEN
NOTIFY contacts_update;
END IF;
UPDATE "Patrols" SET
"Active" = False,
"ID_Status" = NULL,
"StatusTS" = NULL,
"ContactTS" = NULL,
"GroupTSI" = NULL,
"GroupName" = NULL,
"ChangedTS" = NULL,
"Comment" = NULL,
"MemberCount" = 0,
"ActualMemberCount" = 0
WHERE
"ID_Patrol" = patrol_id AND
"Active" = True;
IF FOUND THEN
NOTIFY patrols_update;
END IF;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
CREATE OR REPLACE FUNCTION delete_patrol(patrol_id integer)
RETURNS void AS
$BODY$
BEGIN
UPDATE "Contacts" SET "ChangedTS" = now(), "ID_Patrol" = NULL WHERE "ID_Patrol" = patrol_id;
IF FOUND THEN
NOTIFY contacts_update;
END IF;
UPDATE "Patrols" SET
"Active" = False,
"ID_Status" = NULL,
"StatusTS" = NULL,
"ContactTS" = NULL,
"GroupTSI" = NULL,
"GroupName" = NULL,
"ChangedTS" = NULL,
"Comment" = NULL,
"MemberCount" = 0,
"ActualMemberCount" = 0
WHERE
"ID_Patrol" = patrol_id AND
"Active" = True;
IF FOUND THEN
NOTIFY patrols_update;
END IF;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
Funkcija se poziva iz Delphi GUI programa i radi normalno kada se pozove jednom ili par puta zaredom. Medjutim kada se funkcija pozove iz programskog loop-a u GUI-ju, npr. 40-50x zaredom, dodje do pucanja konekcije svim trenutno povezanim korisnicima (connection refused). Lako bih promenio funkciju da prima set ID-jeva za brisanje (deaktivaciju) i koristio UPDATE WHERE IN (), ali me zanima zasto se ovo desava jer koristim stored funkcije za sve moguce akcije na bazi i zato moraju biti stabilne. Da li ima neko neku ideju? Postoje li neki logovi (i gde) na postgresu koji bi mozda rekli zato se ovo desava?
Posto mi je ovo prvi projekat na postgresu zanima me jos jedna stvar: U dokumentaciji sam procitao da na postgresu sve stored funkcije rade pod implicitnom transakcijom. Da li to znaci da ako imam funkciju koja radi prvo DELETE pa UPDATE, ako DELETE prodje a dodje do runtime greske pri UPDATE-u, da ce se stanje automatski rollback-ovati, tj. da se prethodni DELETE nece izvrsiti?
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
impersonation.