Foreign Keys in MySQL lösen keine Triggers aus

Es kann einen Entwickler schon manchmal an den Rand der Verzweiflung bringen, wenn Triggers bzw. Stored Procedures nicht funktionieren und dann noch die Ursache nicht im eigenen Code zu finden ist. Das beste Beispiel ist das Problem, dass wenn ein Foreign Key sich per Constraint ändert, kein Trigger ausgelöst wird.

Eine Constraint könnte folgendermassen aussehen:

ALTER TABLE `contact`
	ADD CONSTRAINT `constraint_contact_contact_salutation` 
	FOREIGN KEY (`contact_salutation`) 
	REFERENCES `salutation` (`salutation_id`) 
	ON DELETE SET NULL ON UPDATE CASCADE;

Die Constraint besagt, wenn eine Anrede in der Tabelle “salutation” gelöscht wird, dass alle Verknüpfungen in “salutation_id” in der Tabelle “contact” auf NULL zurückgesetzt werden sollen, um die referentielle Integrität zu wahren. Wurde jedoch auf die Tabelle “contact” folgender Trigger definiert

CREATE TRIGGER `contact_delete` AFTER DELETE ON `contact`
	FOR EACH ROW BEGIN
		-- some Code
	END;
//

wird dieser nicht ausgeführt. Das Problem ist den Entwicklern bei MySQL bereits seit über 6 Jahren bekannt, aber eine Lösung oder ein Fix ist nicht in Sicht.

http://bugs.mysql.com/bug.php?id=11472

Eine Workaround wäre ein Trigger in der Tabelle “salutation” anzulegen, was die Aufgaben selbst durchführt. In diesem Beispiel kein größeres Problem, aber es gibt weitaus kompliziertere Verstrickungen von Tabellen, wo ein Workaround geradezu unmöglich ist. Wird bspw. eine Spalte einer Tabelle in 10 weiteren referenziert, steht man vor einem unlösbaren Problem, deren Lösung vielleicht nur in einem Wechsel zu einer anderen Datenbank zu finden wäre.

Kategorie: