2011-11-21 9 views
8

Sono curioso di poter fare affidamento su qualsiasi ordine particolare di convalida dei limiti NOT NULL, FOREIGN KEY, UNIQUE, CHECK e dei trigger BEFORE.Lo standard SQL specifica l'ordine di convalida dei vincoli e attivazione del trigger?

Per esperienza so che MySQL controlla prima NOT NULL, quindi avvia il trigger BEFORE e quindi controlla i vincoli UNIQUE. Oracle controlla NOT NULL dopo il trigger BEFORE (credo che SQLServer faccia lo stesso, ma non ricordo). Lo standard dice qualcosa sull'ordine o dipende completamente dal fornitore di DB?

+0

Oracle fa ** non ** check NOT NULL fino a dopo 'trigger before'. Ciò consente al trigger 'before' di modificare i valori in modo tale che non siano più nulli. –

+0

@Shannon Severance: Sì, mi dispiace, stavo pensando a mysql ... Fisso – a1ex07

+1

Si potrebbe scaricare un [progetto] (http://www.wiscorp.com/sql200n.zip) (Link tratto da Wikipedia) dei più recente normativa e guardare attraverso di esso da soli (non riesco a trovare tali definizioni) –

risposta

2

Questo particolare comportamento sembra essere un bug in MySQL e riguarda solo i trigger BEFORE INSERT, mentre i trigger BEFORE UPDATE si comportano correttamente.

Il standard (come legato nei commenti questione) certamente non scriverlo esplicitamente, ma è sicuramente implicita:

Per ogni cambiamento di stato SCi, j nel Teci, la PRIMA trigger attivato da SCi, j vengono eseguiti prima che uno qualsiasi dei loro eventi di attivazione abbia effetto. Quando gli eventi di attivazione hanno avuto effetto, tutti i trigger AFTER attivati ​​da vengono eseguiti i cambiamenti di stato di TECi.

Un errore NOT NULL dovrebbe essere parte di un (cioè l'evento di attivazione) INSERT o UPDATE. Lo standard non dovrebbe aver bisogno di specificarlo. Non c'è assolutamente nessun punto al preventivamente verificando i vincoli su un insieme di modifiche che non è definitiva perché il vostro BEFORE trigger è in grado di entrambi gli errori risolvere e quelli nuovi che introducono.

SOMMARIO: In realtà non è fino al fornitore DB a causa di controllo vincoli dopo una prima attivazione è sempre necessario.