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

Имам автономен тригер, но изпълнявам само веднъж в една и съща сесия

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

Няма късмет за вас, това изобщо не решава проблема:

  • Първо, всяка транзакционна логика се губи. Не можете да отмените промените в suscription_fact маса, те са обзаведени , докато основната ви транзакция не е и може да бъде отменена. Така че вие ​​също сте загубили целостта на данните си.
  • Тригерът не може да види новия ред, защото новият ред все още не е ангажиран! Тъй като тригерът се изпълнява в независима транзакция, той не може да види неосъществените промени, направени от основната транзакция:ще попаднете на напълно грешни резултати.

Ето защо никога не трябва да правите бизнес логика в автономни транзакции. (има легитимни приложения, но те са почти изцяло ограничени до регистриране/дебъгване).

Във вашия случай трябва или да:

  1. Актуализирайте логиката си, така че да не се налага да прави запитвания към вашата таблица (актуализиране на suscription_fact само ако новият ред е по-скорошен от старата стойност, съхранена в id_date_unsuscription ).
  2. Забравете за използването на бизнес логика в задействания и използвайте процедура, която актуализира всички таблици правилно или използвайте изглед, защото тук имаме ясен случай на излишни данни.
  3. Използвайте заобиколно решение, което действително работи (от Том Кайт) .

Горещо препоръчвам да използвате (2) тук. Не използвайте тригери за кодиране на бизнес логиката. Те са трудни за писане без грешки и още по-трудни за поддържане. Използването на процедура гарантира, че целият подходящ код е групиран на едно място (пакет или процедура), лесен за четене и следване и без непредвидени последствия.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да си спомня в каква посока трябва да върви PRIOR в заявките CONNECT BY

  2. Как работи contains() в PL-SQL?

  3. отпечатайте начална и крайна дата в един ред за непрекъснати или припокриващи се периоди от време в oracle SQL

  4. Как правилно да експортирате резултатите от оператора select в Csv файл, като използвате spool в oracle sql developer

  5. Свързване към Oracle Database чрез Excel