5

Desidero aggiungere una convalida a livello di campo su una tabella. C'è un campo chiamato "numero_ccount" e questo campo deve sempre passare un controllo "luhn". Ho trovato una funzione chiamata "luhn_verify" che sembra funzionare correttamente (google per esso se sei interessato). Restituisce un booleano. La mia domanda è:Vincolo di trigger e controllo

Ci sono importanti vantaggi di prestazioni in PostgreSQL per l'utilizzo di un trigger per questa convalida rispetto a un vincolo di controllo.

Ulteriori informazioni:

  • PostgreSQL 9.1
  • tabella non dispone attualmente di un trigger di inserimento, ma ha un aggiornamento.

Avvertenze:

Mi sento come questo è probabilmente già stato risposto, ma non riesco a trovare una risposta diversa. In tal caso, contrassegnare come duplicato e fare riferimento alla domanda/risposta originale.

Potrebbe essere una domanda migliore per la scheda dba.

+0

non mi aspetto alcuna differenza significativa. È banale da testare ed è sempre una buona idea testare nel proprio ambiente esatto. – maniek

risposta

8

La regola generale è utilizzare il vincolo CHECK prima di ricorrere ai trigger.

A CHECK constraint è più veloce, più semplice, più portatile, ha bisogno di meno codice ed è meno soggetto a errori. I trigger possono essere facilmente aggirati da altri trigger, ad esempio.

Triggers are much more complicated. Usali quando hai per, per requisiti più complessi.

Se un vincolo CHECK è troppo restrittivo per il caso o causa problemi nel ricaricare un dump, è possibile utilizzare il modificatore NOT VALID come terreno di mezzo (pg 9.2+). Dettagli:

+0

@Erwin quale pensi sia che il carico utile abbia o meno un controllo vincolo, come non vuoto, in PostgreSQL 9.x? –

+0

@ErwinBrandstetter ha sempre ragione! http://stackoverflow.com/questions/19137811/how-much-cost-check-constraints-in-postgres-9-x –

+1

@Erwin nella mia esperienza postgres tratta vincoli di controllo e trigger in modo diverso quando si ripristina il database, vale a dire i trigger possono essere ignorati ma i vincoli di controllo non possono essere, quindi, in base al vincolo, è possibile affrontare un ripristino più complicato quando si utilizzano i vincoli di controllo. – rapvelopment