Zatím se to stalo:
- Smazat dítě1.
- Spustí smazání rodiče.
- Smaže
nsourozenci dítěte1 pomocíDELETE CASCADE. - Volá stejný spouštěč
nkrá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ší.