Validazione dei dati: farla sul database è un MUST

Non mi stancherò mai di ripeterlo anche perchè ogni giorno vedo i risultati di quello che accade se chi sviluppa applicazioni non applica una regola di base ma per qualche stupido motivo mai seguita.

I dati che la vostra applicazione utilizza e che mette in un database devono essere validati dal database. Oggi in molti "consulenti" non la pensano così, perchè il database "è un semplice file binario", aiutando in questo modo i loro clienti ad avere presto o tardi numerosi problemi con i loro dati. Certo nel momento dei problemi questi consulenti non ci sono, probabilmente in giro a rimpirsi la bocca raccontando idiozie sui database, parlando di argomenti di cui sono perfettamente ignoranti.

In questi giorni sono stato da un cliente che ha dovuto re-inviare le fatture e le bolle di un notevole periodo di tempo perchè qualcuno ha inserito nell'applicazione dei dati che non avrebbero mai dovuto essere inseriti in quanto non esistenti nella realtà! Nella fattispecie sono stati inseriti ordini per un prodotto non vendibile in un certa area.

Il database è complesso (e mal fatto) e la logica di business (di validazione dei dati, non logica di business "complessa" che invece deve essere corretamente implementate nelle applicazioni) è stata inserita solamente nell'applicazione di gestione ordini. Secondo tutti i conivolti, quello che è avvenuto avrebbe dovuto essere impossibile perchè effettivamente l'applicazione (piuttosto complessa) preveniva questa possibilità in quanto validava i dati. Ed infatti era vero.

Vero tranne che in un particolare caso, dimenticato da tutti gli sviluppatori ma non dagli utilizzatori che invece lo utilizzavano tutti i giorni!  Il risultato di questa scelta architetturale sono due giorni di lavoro buttati nella spazzatura.

Ora ho obbligato il cliente a mettere una serie di logiche di validazione (che sono logiche di business, le uniche che devono essere implemente obbligatoriamente sul database) che impediscono l'introduzione di dati incoerenti nel database, proteggendolo cosi da errori o dimenticanze applicative.

E la morale è proprio questa: il database è quello che contiene i dati dell'azienda e si si fa un'errore non si può semplicemente fare un undo. Dobbiamo quindi proteggerli, a tutti i costi, altrimenti avremo diversi problemi che prima o poi verranno al pettine. Dopo aver definito corretamente i costraint sul database ci dobbiamo preoccupare di implementarli anche nelle applicazioni che scriviamo, in modo da renderle il più user friendly possibili, ma solo per quest'ultimo motivo, non per altro! Nel caso in cui le nostre applicazioni fossero modificate da altri, senza lo nostra sensibilità in termini di validazione dei dati, il nostro database deve essere in grado di proteggersi "da solo"  da questi sviluppatore meno sensibili.

La qualità dei dati nel database non deve poter essere un fatto aleatorio, lasciato al "buon senso" degli sviluppatori. Non tutti ne sono provvisti.

Usate quindi tutti i constraint, trigger (se proprio non potete farne a meno), stored procedure e quant'altro che vi assicuri che se un dato è sbagliato (e per dato intendo un ordine o un cliente non solamente il singolo valore come potrebbe essere il CAP) questo non potrai mai, in nessun caso essere accettato dal database.

Proteggete voi stessi ed i vostri dati. Lavorerete molto meglio. Ed attenti ai profeti del "il database è superato"....

Published giovedì 10 gennaio 2008 8.29 by dmauri

Comments

# re: Validazione dei dati: farla sul database è un MUST

giovedì 10 gennaio 2008 10.30 by Michele Bernardi

Che sia importante mettere i constraint corretti nel DB é fuor di dubbio, ma, imho, la validazione va fatta nello strato di business logic dell'applicazione che, nel mio caso, é pressoché sempre in una libreria di classi separata dal DB. L'ideale sarebbe avere un layer nella business logic che si occupi solo della validazione. Da un lato sarebbe giusto porre la validazione il più in "basso" possibile, ma, secondo me, il problema é che più ci si allontana dal presentation layer e più é difficile dare un feedback "ricco" all'utente. Ma forse Guisa sarebbe il posto più giusto per parlarne. ;-)

# re: Validazione dei dati: farla sul database è un MUST

giovedì 10 gennaio 2008 10.36 by Michele Bernardi

Abuso dei commenti a questo post per segnalarti due cose, con una doverosa premessa: apprezzo tantissimo UGISS, la tua attività e il tuo blog (sennò mica ti aggregavo, no ;-D), ma:

1) Trovo "scortese" che per pubblicare un proprio commento bisogna essere registrati ad ugiss

2) Trovo altrettanto "scortese" che nonostante il "remember me" di default venga riproposto ogni volta un link ugiss in "your url". ;-)

Probabilmente sono solo problemi di "beta" o di CS, ma te li segnalo comunque...

# re: Validazione dei dati: farla sul database è un MUST

giovedì 10 gennaio 2008 11.14 by orsocurioso

Aggiungo la mia nel sub forum che diventato questo post ;-)

1- imho concordo col fatto che la validazione implementata nel db debba essere un must. Comprendo le considerazioni di Michele (io sono pur sempre piu' sviluppatore che dba), ma il db deve essere in grado di proteggersi da solo *indipendentemente* dal modo in cui viene acceduto. Ho spesso visti utenti smart che accedono a db in produzione tramite una connessione via excel e abilitati a scrivere lo fanno bypassando qualunque interfaccia applicativa... Sono situazioni rare (per fortuna), ma basta un errore per essere fottuti.. Come nella roulette russa ;-)))

2 - richiedere l'iscrizione per postare un commento non credo sia scortesia, ma un modo per accettare suggerimenti critiche ed osservazioni da chi si presenta (ovvero si autentica).

# re: Validazione dei dati: farla sul database è un MUST

giovedì 10 gennaio 2008 17.17 by sux_stellino

Ciao Davide.. c'è una frase molto importante, che anche orsocurioso (bellissimo questo nick ;-) ) ha sottolineato, oltre al tuo grassetto: "il nostro database deve essere in grado di proteggersi da solo".

Completamente d'accordo. Puoi scrivere tutti i controlli che vuoi sul business, ma esci da quello che a mio avviso il business layer deve fare. Il database DEVE effettuare la validazione dei dati. Ammetto di essere siquellaro e quindi un po' di parte.. ma credo che le tue motivazioni siano più che valide.

E poi ricordiamo che ci sono tanti professionisti che ancora non usano stored procedure, altri che si fanno fregare da sql injection.. altri ancora che lasciano ai validatori lato client il controllo formale e logico del dato.

Tutte potenziali porte spalancate. Con un database ricco di foreign key, di controlli sull'univocità, di constraint in generale, e non per ultime, di stored procedure (che sono fra gli unici oggetti che vorrei di interfaccia tra l'utente utilizzatore e il db ;-) ), garantiamo VERAMENTE sicurezza sul dato.

Saluti!

# re: Validazione dei dati: farla sul database è un MUST

giovedì 10 gennaio 2008 21.08 by alberto.dallagiacoma

Io quoto totalmente orsocurioso, specialmente la frase "Il db deve essere in grado di proteggersi da solo". Spessissimo ho a che fare con utenti che accedono ai dati utilizzando connessioni ODBC fatte con Access, e in questo caso, senza validazione su db, è una attimo avere dati inconsistenti.

Stando invece sul lato più applicativo, sono d'accordo con Michele quando parla di validazione sul BLL, dove è possibile applicare anche Code Access Security e altro per aumentare il livello di sicurezza.

# re: Validazione dei dati: farla sul database è un MUST

venerdì 11 gennaio 2008 10.34 by sgainz

c'è un motto in tema di programmazione che recita:

"la procedura chiamante ha il diritto di validare i dati passati, qualla chiamata ne ha il DOVERE"