Oracle
 sql >> Database >  >> RDS >> Oracle

Utilizzo della sottoquery in un'istruzione Check in Oracle

Esistono tre modi di base per risolvere questo tipo di problema poiché i vincoli CHECK non possono essere basati su una query.

Opzione 1:trigger

L'approccio più semplicistico sarebbe inserire un trigger su TANK che interroga TANKS e genera un'eccezione se il LIVELLO supera la CAPACITÀ. Il problema con questo tipo di approccio semplicistico, tuttavia, è che è quasi impossibile gestire correttamente i problemi di concorrenza. Se la sessione 1 diminuisce la CAPACITÀ, la sessione 2 aumenta il LIVELLO e quindi entrambe le transazioni vengono eseguite, i trigger non saranno in grado di rilevare la violazione. Questo potrebbe non essere un problema se una o entrambe le tabelle vengono modificate di rado, ma in generale sarà un problema.

Opzione 2:visualizzazioni materializzate

È possibile risolvere il problema di concorrenza creando una vista materializzata ON COMMIT che unisce la tabella TANK e TANKS e quindi creando un vincolo CHECK sulla vista materializzata che verifica che LEVEL <=CAPACITY. Puoi anche evitare di archiviare i dati due volte facendo in modo che la vista materializzata contenga solo dati che violerebbero il vincolo. Ciò richiederà registri di visualizzazione materializzati su entrambe le tabelle di base che aggiungeranno un po' di sovraccarico agli inserti (sebbene meno rispetto all'utilizzo dei trigger). Spingere il controllo al tempo di commit risolverà il problema di concorrenza, ma introduce un po' di un problema di gestione delle eccezioni poiché l'operazione COMMIT ora può non riuscire perché l'aggiornamento della vista materializzato non è riuscito. La tua applicazione dovrebbe essere in grado di gestire quel problema e di avvisare l'utente di questo fatto.

Opzione 3:modifica il modello di dati

Se hai un valore nella tabella A che dipende da un limite nella tabella B, ciò potrebbe indicare che il limite in B dovrebbe essere un attributo della tabella A (invece o in aggiunta ad essere un attributo della tabella B). Dipende dalle specifiche del tuo modello di dati, ovviamente, ma spesso vale la pena considerare.