trigger и таблица мутант

У меня есть проблемы во время обновления линий таблицы ввиду необходимого trigger, который у меня есть. Ошибка - ошибка подмостков мутанты и не, как изменять мой trigger для того, чтобы он не произошел.

Структура таблицы - следующая:

CREATE TABLE CITAS (
    OID_CITA NUMBER PRIMARY KEY, 
    HORA VARCHAR2(5) NOT NULL, 
    FECHA DATE NOT NULL, 
    OID_CLINICA NUMBER, 
    USUARIO_MEDICO VARCHAR2(75) NOT NULL, 
    USUARIO_RECEPCIONISTA VARCHAR2(75), 
    DNI_PACIENTE CHAR(9), 
    FOREIGN KEY(OID_CLINICA) REFERENCES CLINICAS(OID_CLINICA), 
    FOREIGN KEY(USUARIO_MEDICO) REFERENCES MEDICOS(USUARIO), 
    FOREIGN KEY(USUARIO_RECEPCIONISTA) 
    REFERENCES RECEPCIONISTAS(USUARIO), 
    FOREIGN KEY(DNI_PACIENTE) REFERENCES PACIENTES(DNI)
);

Ошибка

Случилась ошибка после того, как сохраняет изменения в таблице "JHO". ТЫ "НАЗНАЧАЕШЬ ВСТРЕЧУ": Линия 231: ORA-04091: table JHO.CITAS is mutating, trigger/function май not see it ORA-06512: at "JHO.TR_CITA_IDENTICA", line 7 ORA-04088: ошибка during execution of trigger 'JHO.TR_CITA_IDENTICA'

trigger:

CREATE OR REPLACE TRIGGER TR_CITA_IDENTICA
BEFORE INSERT OR UPDATE OF USUARIO_MEDICO,FECHA,HORA ON CITAS
FOR EACH ROW
DECLARE
  V_MEDICO VARCHAR(40) := :NEW.USUARIO_MEDICO;
  V_FECHA DATE := :NEW.FECHA;
  V_HORA VARCHAR2(20) := :NEW.HORA;
  V_CUENTA NUMBER;
BEGIN
  SELECT COUNT(*) INTO V_CUENTA FROM CITAS WHERE USUARIO_MEDICO = V_MEDICO 
AND FECHA = V_FECHA AND HORA = V_HORA;
  IF V_CUENTA > 0 THEN
    RAISE_APPLICATION_ERROR(-20004,'No puede haber más de una cita de un 
mismo médico para una fecha y una hora específica');
  END IF;
END;
/
1
задан 05.08.2017, 06:13
1 ответ

Следующая ошибка появляется, потому что trigger estÃ: выполняя консультацию в ту же таблицу, что и disparÃ.

произвел Себе ошибку после того, как сохраняет изменения в таблице "JHO". ТЫ "НАЗНАЧАЕШЬ ВСТРЕЧУ": Линия 231: ORA-04091: table JHO.CITAS is mutating, trigger/function май not see it ORA-06512: at "JHO.TR_CITA_IDENTICA", line 7 ORA-04088: ошибка during execution of trigger 'JHO.TR_CITA_IDENTICA'

SOLUCIÓN 1 - ИСПОЛЬЗОВАТЬ СДЕЛОК AUTÓNOMAS

Автономные сделки - сделки, что, хотя они названы внутри другой сделки, Ваши действия независимые от главной сделки.

Мы Подтверждаем как estÃ: в настоящее время таблица:

select * from citas;

  OID_CITA HORA  FECHA       OID_CLINICA USUARIO_MEDICO   USUARIO_RECEPCIONISTA   DNI_PACIENTE
---------- ----- ----------- ----------- --------------   ---------------------   ------------
         1 07:35 05/08/2017            1 1                1                       1234
         2 07:50 05/08/2017            1 1                1                       1234
         3 08:00 05/08/2017            1 1                1                       1222

Давайте Верить в trigger.

CREATE OR REPLACE TRIGGER TR_CITA_IDENTICA
BEFORE INSERT OR UPDATE OF USUARIO_MEDICO,FECHA,HORA ON CITAS
FOR EACH ROW

DECLARE

  PRAGMA AUTONOMOUS_TRANSACTION;
  V_MEDICO VARCHAR(40) := :NEW.USUARIO_MEDICO;
  V_FECHA DATE := :NEW.FECHA;
  V_HORA VARCHAR2(20) := :NEW.HORA;
  V_CUENTA NUMBER;
BEGIN

  SELECT COUNT(*) INTO V_CUENTA FROM CITAS WHERE USUARIO_MEDICO = V_MEDICO 
    AND FECHA = V_FECHA AND HORA = V_HORA;

  IF V_CUENTA > 0 THEN
    RAISE_APPLICATION_ERROR(-20004,'No puede haber más de una cita de un 
    mismo médico para una fecha y una hora específica');
  END IF;
END;
/

Мы Бросаем UPDATE:

SQL> update citas set hora = '07:36' where oid_cita = 1;

1 row updated

Мы Бросаем другой UPDATE , который шокирует с часом другого реестра:

SQL> update citas set hora = '07:50' where oid_cita = 1;

Сейчас мы видим следующую ошибку, которая состоит в том, что мы хотим, чтобы он вышел:

update ты упоминаешь set час = '07:50' where oid_cita = 1 ORA-20004: Не может быть mÃ: s встречи того же самого médico для даты и часа espec¦-fica ORA-06512: в "JHO.TR_CITA_IDENTICA", l¦-nea 14 ORA-04088: ошибка в течение ejecuci¦n стрелка 'JHO.TR_CITA_IDENTICA'

Этот soluci¦n только эффективный, когда ты обновишь реестр в раз, так как, если ты используешь какой-то способ обновлять несколько реестров, в то же время возможно, что он не делает validaci¦n.

SOLUCIÓN 2 - САНКЦИОНИРОВАТЬ С APLICACIÓN

, Если ты работаешь на уровне aplicaci¦n, рекомендуемое в этом случае состоит в том, чтобы ты сделал validaci¦n с программы, asà - ты избегаешь консультировать ту же таблицу с trigger.

1
ответ дан 29.10.2019, 23:58

Теги

Похожие вопросы