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

Прекъснете операцията за вмъкване/актуализация в тригера с помощта на PL/SQL

Не отивайте там.

ORA-04091: table XXXX is mutating обикновено е добър индикатор, че каквото и да се опитвате да направите, е твърде сложно, за да бъде направено надеждно със задействания.

Разбира се, можете да използвате променлива за масив от пакети и няколко тригера ( уф!) за да заобиколите тази грешка, но вашият код най-вероятно ще:

  • да не се поддържа поради сложността си и непредсказуемия характер на тригерите
  • не реагира добре на многопотребителска среда

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

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

  1. получете заключване, за да предотвратите едновременна актуализация на същата група редове (например заключете записа на стаята в приложение за хотелска резервация).
  2. проверете дали редът, който ще бъде вмъкнат, валидира цялата бизнес логика
  3. направете всички подходящи DML
  4. връща всички свои промени (и само своите промени -- не цялата транзакция) в случай на грешка (лесно с PL/SQL, просто повдигнете грешка).



  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 с pdo, със SID и INSTANCE_NAME

  2. Заявката за избор на JPA с полета за време и дата не успява да извлече резултати

  3. Ускорете to_sql() при записване на Pandas DataFrame в база данни на Oracle с помощта на SqlAlchemy и cx_Oracle

  4. asp classic как да прихванете грешки при свързване към сървър, свързан с oracle

  5. Извличане на pl/sql масив (като изходящ параметър)