Domanda

Diciamo che ho una colonna di database che dovrebbe essere sempre in maiuscolo.

Ecco un paio di idee:

1) Crea un vincolo di colonna di: col = UPPER (col)

2) Crea un trigger di riga prima dell'inserimento / aggiornamento che imposta: col = UPPER (col)

Di solito, maggiori sono i vincoli sui dati del database e meglio i trigger possono essere misteriosi e negativi. Supponiamo che gli sviluppatori che scrivono il codice siano nella stessa organizzazione e quindi il codice che scrivono possa essere modificato da noi.

Quale approccio useresti e perché?

Deve essere in maiuscolo perché i dati in questione sono in realtà sempre in maiuscolo (originariamente stampati in quel modo da varie terze parti). Non vi è alcun significato in maiuscolo vs minuscolo per questo particolare campo.

È stato utile?

Soluzione

Dipende dal motivo per cui la colonna deve essere in maiuscolo, ma in generale preferirei il vincolo.

Non mi piacciono le cose che cambiano i miei dati quando li inserisco nel database. Significa che ho una discrepanza tra ciò che ho scritto e ciò che leggerò la prossima volta.

Se un utente ha inserito il testo, considera l'aggiunta di una colonna aggiuntiva che contiene la versione maiuscola. In questo modo visualizzi sempre il testo nel modo in cui l'utente lo ha inserito

Altri suggerimenti

Nella maggior parte dei casi direi (1), perché come hai sottolineato, i trigger possono spesso essere cattivi / strani (anche se non sempre). Ma quando ho a che fare con la distinzione tra maiuscole e minuscole, tendo a trattarlo come un caso speciale e lo risolvo sempre ad ogni passo lungo la strada. Non sono sicuro di avere ragioni concrete per farlo, è solo "sembra". destra. Probabilmente perché nella maggior parte degli ambienti in cui ho lavorato, almeno dal punto di vista della logica aziendale FoO è sempre uguale a foo è sempre uguale a FOO .

Inoltre, in questo caso sembra meno onere per lo sviluppatore dire "FYI, tutte le stringhe sono memorizzate in maiuscolo sul server" che schiaffeggiare il polso ogni volta che dimenticano. Non è come dire " FYI, ogni volta che inserisci un prezzo nel DB, verrà aggiunta l'imposta sulle vendite. & Quot;

Questo è meglio implementato come un vincolo, evita il carico extra e fa quello che vuoi - impone che i dati siano nel formato richiesto.

Penso che sia l'approccio sbagliato per forzare la conversione nel database perché i dati che possono essere convertiti senza perdita di integrità dovrebbero essere gestiti nel livello del database. Se il caso è insignificante, gestiscilo come tale e un vincolo aiuta a rilevare gli errori.

L'aggiunta di un indice senza distinzione tra maiuscole e minuscole potrebbe essere una soluzione migliore (cfr. Indice insensibile ai casi di database )

O aumentare la copertura dei test automatizzati ed evitare il carico aggiuntivo sul server di produzione.

Vorrei prendere in considerazione anche un altro approccio: fornire un'API "tabella" " che consente agli sviluppatori di passare semplicemente i valori a una procedura memorizzata (o qualsiasi altra cosa) che garantisce quindi che i valori siano maiuscoli al momento dell'inserimento (come nel tuo esempio). Lo farei anche con un vincolo (può aiutare l'ottimizzazione delle query per una cosa) e rimuovere i privilegi di modifica diretta sul tavolo - se non ti fidi che gli sviluppatori mettano in maiuscolo tutti gli inserti, non dovresti fidarti di loro usa sempre anche la TAPI.

SE puoi fare qualcosa in un vincolo di colonna sul database vice un trigger è generalmente preferito in quanto è spesso più veloce. Se stai parlando di far rispettare l'applicazione, non lo consiglio. Se la regola deve sempre essere applicata, non dovrebbe mai trovarsi da nessuna parte tranne nel database. Cose diverse dall'applicazione per cui stai scrivendo il codice possono cambiare i dati in un database. L'integrità dei dati è la responsabilità del database, conservare il codice a cui appartiene per evitare problemi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top