Zatím se to stalo:
- Smazat dítě1.
- Spustí smazání rodiče.
- Smaže
n
sourozenci dítěte1 pomocíDELETE CASCADE
. - Volá stejný spouštěč
n
krát. - Už žádní sourozenci nezůstali.
Žádná nekonečná smyčka, ale stále n
vyvolání spouštěče. To by mohlo vysvětlovat, proč byl překročen váš limit hloubky zásobníku, ale můžete to opravit zvýšením limitu. Totéž se může opakovat s větším n
.
Alternativně nahraďte spouštěč:
CREATE OR REPLACE FUNCTION delete_family()
RETURNS TRIGGER AS
$func$
BEGIN
DELETE FROM child WHERE parent_id = OLD.parent_id;
DELETE FROM parent WHERE parent_id = OLD.parent_id; -- done after 1st call
RETURN NULL;
END
$func$ LANGUAGE plpgsql; -- don't quote the language name!
CREATE TRIGGER delete_family
AFTER DELETE ON child
FOR EACH ROW EXECUTE PROCEDURE delete_family();
A nahradit omezení FK verzí bez ON DELETE CASCADE
. Příklad kódu:
Nyní DELETE
celou rodinu, nemůžete smazat rodiče jako dříve (nyní to FK zakázal). Místo toho DELETE
jakékoli dítě.
Měl by být také rychlejší.