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

Създаване на тригери

Това, което имате тук, е ограничение на таблица с кръстосани редове - т.е. не можете просто да поставите едно Oracle CONSTRAINT в колона, тъй като те могат да разглеждат само данни в рамките на един ред наведнъж.

Oracle поддържа само два типа ограничения за кръстосани редове - уникалност (напр. първични ключове и уникални ограничения) и референтна цялост (чужди ключове).

Във вашия случай ще трябва сами да кодирате ограничението - и с това идва отговорността да гарантирате, че ограничението не е нарушено при наличието на множество сесии, всяка от които не може да вижда данни, вмъкнати/актуализирани от други едновременни сесии (поне докато не се ангажират).

Опростен подход е да се добави тригер, който издава заявка, за да преброи колко записа са в конфликт с новия запис; но това няма да работи, защото тригерът не може да види редове, които са били вмъкнати/актуализирани от други сесии, но все още не са ангажирани; така че тригерът понякога ще позволи на членовете да наемат 6 видеоклипа, стига (например) да накарат двама касиери да въвеждат данните в отделни терминали.

Еднопосочен за да заобиколите този проблем е да поставите някакъв елемент на сериализация - напр. тригерът първо ще поиска заключване на записа на член (напр. с ИЗБЕРЕТЕ ЗА АКТУАЛИЗАЦИЯ), преди да му бъде разрешено да проверява наемите; по този начин, ако втора сесия се опита да вмъкне наеми, тя ще изчака, докато първата сесия извърши ангажимент или връщане назад.

Друг начин около този проблем е да се използва агрегиращ материализиран изглед, който ще се основава на заявка, която е предназначена да намери всички редове, които не издържат теста; очакването е, че MV ще бъде празен и вие поставяте ограничение на таблица върху MV, така че ако някога се появи ред в MV, ограничението ще бъде нарушено. Ефектът от това е, че всеки оператор, който се опитва да вмъкне редове, които нарушават ограничението, ще причини нарушение на ограничението, когато MV се опреснява.

Написването на заявката за това въз основа на вашия дизайн е оставено като упражнение за читателя :)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-00932:непоследователни типове данни:очаквано - получено -

  2. Oracle ORA-00979 - не е израз GROUP BY

  3. Как да променя съществуващата си таблица, за да създам дял на диапазон в Oracle

  4. PL/SQL вложени цикли с курсори

  5. Заредете текстови файлове като clob към база данни