冲突的触发器

时间:2018-01-10 22:50:30

标签: sql oracle triggers oracle-sqldeveloper

我需要帮助我的oracle sql代码我得到一个错误,我不应该在这个插入

UPDATE PRENOTAZIONI SET STATO='ACCETTATO' WHERE ID_PRENOTA='P00000011'


Errore con inizio alla riga : 16 nel comando -
Report error -
ORA-20007: Imposssibile accettare prenotazione: limite posti auto superato
ORA-06512: at "CARPOOLING_DBA.TR_MAX_NUM_OSPITI", line 16
ORA-04088: error during execution of trigger 'CARPOOLING_DBA.TR_MAX_NUM_OSPITI'
ORA-06512: at "CARPOOLING_DBA.SETTO_PAGA", line 2
ORA-04088: error during execution of trigger 'CARPOOLING_DBA.SETTO_PAGA'



UPDATE PRENOTAZIONI SET STATO='ACCETTATO' WHERE ID_PRENOTA='P00000011';

两个触发器中的第一个发生冲突

   create or replace TRIGGER TR_MAX_NUM_OSPITI
  BEFORE INSERT OR UPDATE ON PRENOTAZIONI
  FOR EACH ROW
  DECLARE 
  ERRORE EXCEPTION;
  POSTI_DISP NUMBER (1):=0;
  BEGIN
  --QUERY
  SELECT V.POSTI_DISPONIBILI INTO POSTI_DISP
  FROM VIAGGI V
  WHERE V.ID_VIAGGIO=:NEW.VIAGGIO;
  IF(:NEW.N_OSPITI+1<=POSTI_DISP)
  THEN NULL;
  ELSE RAISE ERRORE;
  END IF;
  exception
  WHEN ERRORE THEN RAISE_APPLICATION_ERROR (-20007,'Imposssibile accettare prenotazione: limite posti auto superato');
  END;

两个触发器中的第二个发生冲突

create or replace TRIGGER SETTO_PAGA
AFTER UPDATE OR INSERT OF STATO ON PRENOTAZIONI
BEGIN
UPDATE PRENOTAZIONI
SET PAGATO='Y'
WHERE PAGATO='N' AND STATO='ACCETTATO';
END;

如果需要我可以添加表PRENOTAZIONI和其他触发器...我只是找不到错误的原因....插入应该没问题我检查了所有的值和错误我得到只是不做任何感觉..至少对我来说..

1 个答案:

答案 0 :(得分:0)

我真的没有看到任何东西&#34;冲突&#34;这里。错误的原因是

IF(:NEW.N_OSPITI+1<=POSTI_DISP)
THEN NULL;
ELSE RAISE ERRORE;
END IF;

引发ERRORE时,会调用TR_MAX_NUM_OSPITI末尾的异常块:

exception
  WHEN ERRORE THEN RAISE_APPLICATION_ERROR (-20007,'Imposssibile accettare prenotazione: limite posti auto superato');

这将抛出用户异常-20007,这是ORA-20007在您的问题中包含的消息列表开头的原因。因此导致错误是因为:NEW.N_OSPITI+1大于POSTI_DISP中的TR_MAX_NUM_OSPITI

祝你好运。