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

Używanie podzapytania w instrukcji Check w Oracle

Istnieją trzy podstawowe sposoby rozwiązania tego rodzaju problemu, ponieważ ograniczenia CHECK nie mogą być oparte na zapytaniu.

Opcja 1:Wyzwalacze

Najbardziej uproszczonym podejściem byłoby umieszczenie wyzwalacza na ZBIORNIK, który wysyła zapytanie do ZBIORNIKÓW i zgłasza wyjątek, jeśli POZIOM przekracza POJEMNOŚĆ. Problem z tego rodzaju uproszczonym podejściem polega jednak na tym, że prawidłowa obsługa problemów ze współbieżnością jest prawie niemożliwa. Jeśli sesja 1 zmniejszy POJEMNOŚĆ, to sesja 2 zwiększy POZIOM, a następnie obie transakcje zostaną zatwierdzone, wyzwalacze nie będą w stanie wykryć naruszenia. Może to nie stanowić problemu, jeśli jedna lub obie tabele są rzadko modyfikowane, ale ogólnie będzie to problem.

Opcja 2:widoki zmaterializowane

Problem współbieżności można rozwiązać, tworząc widok zmaterializowany ON COMMIT, który łączy tabele ZBIORNIK i ZBIORNIKI, a następnie tworząc ograniczenie CHECK w widoku zmaterializowanym, który weryfikuje, czy POZIOM <=POJEMNOŚĆ. Możesz również uniknąć dwukrotnego przechowywania danych, mając widok zmaterializowany zawierający tylko dane, które naruszałyby ograniczenie. Będzie to wymagało dzienników widoków zmaterializowanych w obu tabelach podstawowych, które dodadzą nieco narzutu do wstawiania (choć mniej niż przy użyciu wyzwalaczy). Przesunięcie sprawdzenia do czasu zatwierdzenia rozwiąże problem ze współbieżnością, ale wprowadza trochę problemu z zarządzaniem wyjątkami, ponieważ operacja COMMIT może teraz zakończyć się niepowodzeniem, ponieważ odświeżenie widoku zmaterializowanego nie powiodło się. Twoja aplikacja musiałaby być w stanie poradzić sobie z tym problemem i powiadomić użytkownika o tym fakcie.

Opcja 3:Zmień model danych

Jeśli masz wartość w tabeli A, która zależy od limitu w tabeli B, może to wskazywać, że limit w B powinien być atrybutem tabeli A (zamiast lub oprócz atrybutu tabeli B). Zależy to oczywiście od specyfiki Twojego modelu danych, ale często warto to rozważyć.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wysłać zapytanie do kolumny CLOB w Oracle?

  2. REGEXP_INSTR() Funkcja w Oracle

  3. Nieprawidłowy miesiąc podczas wstawiania danych do Oracle

  4. Importuj plik CSV do tabeli Oracle za pomocą procedury przechowywanej

  5. java.lang.ClassCastException:oracle.sql.TIMESTAMP nie może być rzutowany na java.sql.Timestamp