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

Как да избегнете грешка ORA-04091 в рамките на тригер

Можете да накарате спусъка на A да направи нещо, за да предупреди спусъка на B, че не е необходимо да се задейства. Има различни искания за настройка на някакво състояние за сесия. Най-простият възможен подход би бил да направите нещо като създаване на пакет с булева променлива bypass_checks_on_b който сте задали на TRUE преди да направите UPDATE на A, задайте FALSE след UPDATE завършва и след това проверете състоянието на тази променлива във вашия тригер на B, преди да извършите вашите проверки. Бихте могли да направите нещо подобно с временна таблица или контекст, вместо да използвате пакет. По-малко ефективно бихте могли потенциално да анализирате стека на повикванията във вашия тригер на B, за да видите дали тригерът на A е в стека на повикванията, но това би било доста грозно.

Все пак бих бил много предпазлив относно цялата тази архитектура. Когато установите, че имате тригери на A, които предизвикват задействане на тригери на B, които искат да заявят A, почти винаги е така, че сте вложили твърде много логика в тригерите и че ще бъдете много по-добре обслужвани, ако се движите тази логика в слой със запомнени процедури, който може да бъде извикан, а не приложенията, извършващи директни вмъквания или актуализации. Когато вкарате твърде много логика в тригерите, в крайна сметка получавате система, която е много трудна за разбиране, защото не е очевидно от разглеждане на кода на приложението какви странични ефекти имат различните твърдения. И завършвате с код с много постоянно състояние, където имате много пътища през едно парче код в зависимост от повикващия. Това почти сигурно означава, че ще има състояния, които не тествате или не мислите къде ще откриете, че вашият код прави нещо неочаквано. Между наличието на много състояние и наличието на кодова база с много странични ефекти, много бързо можете да изградите кодова база, която по същество е неподдържана.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да получите информация за грешка при компилиране в Oracle/TOAD

  2. Oracle Entity Framework - Извикване на персонализирана функция (EDIT_DISTANCE)

  3. ORACLE SQL select distinct без премахване на дубликати

  4. Известие за промяна на базата данни на Oracle

  5. Хибернация> CLOB> Oracle :(