Gibt der SQL-Standard die Reihenfolge der Einschränkungsüberprüfung an und löst das Auslösen aus?

  • Ich bin gespannt, ob ich mich auf eine bestimmte Reihenfolge der Validierung von NOT NULL, FOREIGN KEY, UNIQUE, CHECK -Einschränkungen und BEFORE -Triggern verlassen kann.

    Aus Erfahrung weiß ich, dass MySQL zuerst NOT NULL überprüft, dann den BEFORE -Trigger startet und dann die UNIQUE -Einschränkungen überprüft. Oracle überprüft NOT NULL nach dem BEFORE -Trigger (ich glaube, dass SQLServer dasselbe tut, sich aber nicht daran erinnert). Sagt der Standard etwas über die Bestellung oder ist es völlig dem DB-Anbieter überlassen?

    23 November 2011
    Sam Saffron
1 answer
  • Dieses Verhalten scheint ein Fehler in MySQL zu sein. und es betrifft nur BEFORE INSERT -Trigger, während sich BEFORE UPDATE -Trigger korrekt verhalten.

    Die standard (wie in den fraglichen Kommentaren verlinkt) schreibt dies zwar nicht explizit aus, aber es ist definitiv impliziert:

    Für jede Zustandsänderung SCi, j in TECi werden die von SCi, j aktivierten BEFORE-Auslöser ausgeführt, bevor eines der auslösenden Ereignisse wirksam wird. Wenn diese auslösenden Ereignisse wirksam wurden, werden alle AFTER-Auslöser ausgeführt, die durch die Zustandsänderungen von TECi aktiviert werden.

    Ein NOT NULL -Fehler sollte angezeigt werden Teil eines INSERT oder UPDATE sein (dh das auslösende Ereignis). Der Standard sollte dies nicht angeben müssen. Es gibt absolut keinen Sinn, die Einschränkungen einer Reihe von Änderungen vorab zu überprüfen, was nicht endgültig ist, da Ihr BEFORE -Trigger sowohl die Lösung von Fehlern als auch von in der Lage ist, neue einzuführen .

    ZUSAMMENFASSUNG: Es ist wirklich nicht Sache des DB-Anbieters, da das Prüfen von Einschränkungen nach einem Vorher-Auslöser immer erforderlich ist.

    24 November 2011
    Kevin Stricker