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

Проблеми при промяна на датата с тригер в Oracle

Искате нещо подобно:

CREATE OR REPLACE TRIGGER TRIGGER_D
BEFORE
INSERT OR UPDATE ON CONTRACTS
FOR EACH ROW
DECLARE
BEGIN
  UPDATE CONTRACTS
  SET    ENDDATE   = :NEW.STARTDATE - INTERVAL '1' DAY
  WHERE  CLIENTID  = :NEW.CLIENTID
  AND    ENDDATE   > :NEW.STARTDATE
  AND    STARTDATE < :NEW.STARTDATE;
END;

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

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Доставчикът на ADO.NET „Oracle.ManagedDataAccess.Client“ или не е регистриран в конфигурационния файл на машината или приложението, или не може да бъде зареден

  2. java.sql.SQLException:ORA-01438:

  3. Функция STUFF на Oracle, еквивалентна на SQL Server?

  4. Заявка за каскадно изтриване

  5. Заключете базата данни на Oracle, преди да стартирате скриптовете за изтриване/зареждане на данни