Neste caso específico estou usando um banco de dados SQLite, mas acredito que seja mais uma questão conceitual com implicações práticas.
Eu tenho um modelo de conjunto aninhado no meu banco de dados e gostaria de garantir que, quando um nó pai for excluído de alguma forma, todos os seus filhos também serão excluídos.
Da documentação do SQLite , os gatilhos permitem várias instruções, então eu tenho algo assim:
CREATE TABLE "tbl_nsm" (
"lft" INTEGER,
"rgt" INTEGER
);
CREATE TRIGGER IF NOT EXISTS "delete_entire_leaf" AFTER DELETE ON tbl_nsm
BEGIN
DELETE FROM tbl_nsm
WHERE 1=1
AND lft > OLD.lft
AND lft < OLD.rgt;
UPDATE tbl_nsm SET rgt = rgt - (OLD.rgt - OLD.lft + 1) WHERE rgt > OLD.rgt;
UPDATE tbl_nsm SET lft = lft - (OLD.rgt - OLD.lft + 1) WHERE lft > OLD.rgt;
END
;
No entanto, ao preencher a tabela com valores consistentes, sempre que apago um registro, o gatilho parece não fazer nada: todos os outros valores permanecem e não há um único aviso. Em vez de um AFTER DELETE
, mudei para um BEFORE DELETE
gatilho, mas sem sucesso.
Isso me fez pensar: você pode usar DELETE
gatilhos para excluir outros valores da sua tabela? Ou o SQL simplesmente ignora quaisquer alterações na tabela de destino de tal gatilho?