Това, което виждате при проблема с правилото, е, че системата от правила не обработва данните атомарно. Първото изтриване се изпълнява независимо от реда на двата оператора в правилото DO INSTEAD. Вторият оператор никога не се изпълнява, тъй като редът, към който се отнася OLD.id, е премахнат от изгледа. Бихте могли да използвате LEFT JOIN, но това няма да ви помогне поради примерния дизайн на таблицата (може да работи на действителната ви схема на база данни).
Фундаменталният проблем, както го виждам, е, че третирате системата от правила като задействаща.
Най-добрият ви вариант е да използвате външни ключове и ON DELETE CASCADE
вместо правила. С тях вашата примерна схема също ще работи:трябва само да изтриете за родителската таблица, за да се отървете от всички деца.