Oracle
 sql >> база данни >  >> RDS >> Oracle

Използване на подзаявка в изявление за проверка в Oracle

Има три основни начина за решаване на този вид проблеми, тъй като ограниченията на CHECK не могат да се основават на заявка.

Опция 1:Задействания

Най-опростеният подход би бил да поставите тригер на TANK, който отправя запитвания към TANK и хвърля изключение, ако НИВОТО надвишава CAPACITY. Проблемът с този вид опростен подход обаче е, че е почти невъзможно да се справят правилно с проблемите с паралелността. Ако сесия 1 намали КАПАЦИТЕТА, тогава сесия 2 увеличава НИВОТО и след това и двете транзакции се ангажират, тригерите няма да могат да открият нарушението. Това може да не е проблем, ако една или и двете таблици рядко се променят, но като цяло ще бъде проблем.

Опция 2:Материализирани изгледи

Можете да разрешите проблема с едновременността, като създадете материализиран изглед ON COMMIT, който се присъединява към таблицата TANK and TANKS и след това създадете ограничение CHECK на материализирания изглед, което проверява, че LEVEL <=CAPACITY. Можете също така да избегнете съхраняването на данните два пъти, като материализираният изглед съдържа само данни, които биха нарушили ограничението. Това ще изисква материализирани регистрационни файлове за изглед и на двете основни таблици, което ще добави малко излишни разходи към вмъкванията (макар и по-малко от използването на тригери). Натискането на проверката до време за извършване ще реши проблема с паралелността, но въвежда малко проблем с управлението на изключенията, тъй като операцията COMMIT вече може да се провали, защото материализираното опресняване на изглед е неуспешно. Вашето приложение трябва да може да се справи с този проблем и да предупреди потребителя за този факт.

Опция 3:Променете модела на данни

Ако имате стойност в таблица A, която зависи от ограничение в таблица B, това може да означава, че ограничението в B трябва да бъде атрибут на таблица A (вместо или в допълнение към атрибут на таблица B). Зависи от спецификата на вашия модел на данни, разбира се, но често си струва да се обмисли.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да намерите компонентите на EBS R12 Версия

  2. Въведение в PL/SQL функциите в Oracle Database

  3. Как мога да получа броя на записите, засегнати от съхранена процедура?

  4. Разлика в критериите за търсене между Like срещу Contains() в oracle

  5. Javascript дата към sql обект дата