Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Tworzenie wyzwalaczy

To, co masz tutaj, to ograniczenie między wierszami - tzn. Nie możesz po prostu umieścić pojedynczego CONSTRAINT Oracle w kolumnie, ponieważ mogą one jednocześnie przeglądać dane tylko w jednym wierszu.

Oracle obsługuje tylko dwa typy ograniczeń krzyżowych - unikalność (np. klucze podstawowe i ograniczenia unikatowe) oraz integralność referencyjną (klucze obce).

W twoim przypadku będziesz musiał ręcznie zakodować ograniczenie - a wraz z tym odpowiedzialność za zapewnienie, że ograniczenie nie zostanie naruszone w obecności wielu sesji, z których każda nie może zobaczyć danych wstawionych/zaktualizowanych przez inne współbieżne sesje (przynajmniej dopóki się nie zaangażują).

Uproszczone podejście polega na dodaniu wyzwalacza, który wysyła zapytanie w celu zliczenia, ile rekordów jest w konflikcie z nowym rekordem; ale to nie zadziała, ponieważ wyzwalacz nie widzi wierszy, które zostały wstawione/zaktualizowane przez inne sesje, ale jeszcze nie zostały zatwierdzone; więc wyzwalacz czasami pozwala członkom wypożyczyć 6 filmów, o ile (na przykład) mają dwóch kasjerów do wprowadzania danych w osobnych terminalach.

Jeden sposób obejście tego problemu polega na wprowadzeniu do programu jakiegoś elementu serializacji - np. wyzwalacz najpierw zażąda zablokowania rekordu członka (np. za pomocą SELECT FOR UPDATE), zanim będzie mógł sprawdzić wypożyczenia; w ten sposób, jeśli druga sesja spróbuje wstawić wypożyczenia, poczeka, aż pierwsza sesja wykona zatwierdzenie lub wycofanie.

Inny sposób obejście tego problemu jest użycie agregującego widoku zmaterializowanego, który byłby oparty na zapytaniu zaprojektowanym w celu znalezienia dowolnych wierszy, które nie przejdą testu; oczekuje się, że MV będzie pusty i nałożysz ograniczenie tabeli na MV, tak że jeśli wiersz kiedykolwiek pojawi się w MV, ograniczenie zostanie naruszone. Efektem tego jest to, że każda instrukcja, która próbuje wstawić wiersze, które naruszają ograniczenie, spowoduje naruszenie ograniczenia po odświeżeniu MV.

Pisanie zapytania w tym celu na podstawie twojego projektu jest pozostawione jako ćwiczenie dla czytelnika :)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Formatowanie wyników zapytań w SQLPlus

  2. ładowanie ogromnych danych XLS do Oracle za pomocą Pythona

  3. SQL, aby znaleźć zduplikowane wpisy (w grupie)

  4. Oracle REGEX_SUBSTR nie honoruje wartości null

  5. Podłączanie Oracle do SQL Server przez łącze do bazy danych