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

Creazione di un trigger

Quello che hai qui è un vincolo di tabella su più righe, ovvero non puoi semplicemente inserire un singolo Oracle CONSTRAINT su una colonna, poiché possono guardare solo i dati all'interno di una singola riga alla volta.

Oracle supporta solo due tipi di vincoli tra righe:unicità (ad es. chiavi primarie e vincoli univoci) e integrità referenziale (chiavi esterne).

Nel tuo caso, dovrai codificare manualmente il vincolo da solo - e con ciò deriva la responsabilità di garantire che il vincolo non venga violato in presenza di più sessioni, ognuna delle quali non può vedere i dati inseriti/aggiornati da altre sessioni simultanee (almeno, finché non si impegnano).

Un approccio semplicistico consiste nell'aggiungere un trigger che emette una query per contare quanti record sono in conflitto con il nuovo record; ma questo non funzionerà perché il trigger non può vedere le righe che sono state inserite/aggiornate da altre sessioni ma non ancora impegnate; quindi il trigger a volte consentirà ai membri di noleggiare 6 video, purché (ad esempio) ottengano due cassieri per inserire i dati in terminali separati.

Solo andata per aggirare questo problema è necessario inserire alcuni elementi di serializzazione, ad es. il trigger richiederebbe prima un blocco sul record del membro (ad esempio con un SELECT FOR UPDATE) prima che sia consentito controllare i noleggi; in questo modo, se una seconda sessione tenta di inserire noleggi, attenderà fino a quando la prima sessione non esegue un commit o un rollback.

Un altro modo aggirare questo problema consiste nell'utilizzare una visualizzazione materializzata di aggregazione, che sarebbe basata su una query progettata per trovare le righe che non superano il test; l'aspettativa è che la MV sia vuota e si metta un vincolo di tabella sulla MV in modo tale che se dovesse apparire una riga nella MV, il vincolo sarebbe violato. L'effetto di ciò è che qualsiasi istruzione che tenti di inserire righe che violano il vincolo causerà una violazione del vincolo quando la MV viene aggiornata.

Scrivere la query per questo in base al tuo progetto è lasciato come esercizio per il lettore :)