U problému s pravidly vidíte, že systém pravidel nezpracovává data atomicky. První odstranění se provede bez ohledu na pořadí dvou příkazů v pravidle DO INSTEAD. Druhý příkaz se nikdy neprovede, protože řádek, na který odkazuje OLD.id, byl odebrán ze zobrazení. Můžete použít LEFT JOIN, ale to vám nepomůže kvůli vzorovému návrhu tabulky (může fungovat na vašem skutečném schématu databáze).
Zásadní problém je podle mého názoru v tom, že se systémem pravidel zacházíte tak, jako by byl spouštěčem.
Nejlepší možností je použít cizí klíče a ON DELETE CASCADE
místo pravidel. S nimi by fungovalo i vaše vzorové schéma:Chcete-li se zbavit všech potomků, stačí pouze odstranit nadřazenou tabulku.