2013-11-21 3 views
0
내가 트리거가 '히스토리'에서 한 행을 삽입해야한다 'ALUGUER'뭔가 삽입 할 때 나는 역사적인 데이터 테이블에서 'REGIST'를 삽입해야

:트리거를 삽입 한 후

내 트리거 :

create or replace 
trigger ADD_HISTORICO 
AFTER INSERT 
    ON ALUGUER 
    FOR EACH ROW 

DECLARE 
    cod_aluguer_p NUMBER(6,0); 
    cod_veiculo_p NUMBER(6,0); 
BEGIN 

    SELECT ID_ALUGUER INTO cod_aluguer_p 
    FROM ALUGUER; 
    SELECT COD_VEICULO INTO cod_veiculo_p 
    FROM ALUGUER; 

    INSERT INTO HISTORICO(ID_ENTRADA,DESCRICAO,DATA_REGISTO,NOVO_VEICULO,NOVO_ALUGUER) 
    VALUES(SEQ_HISTORICO.nextval,'NOVA DESCRIÇÃO','21/11/2013',cod_veiculo_p,cod_aluguer_p); 

END; 

오류 보고서 :

SQL Error:
ORA-04091: BDDAD_DL1.ALUGUER table is mutating, trigger can not read or modify
ORA-06512: at "BDDAD_DL1.ADD_HISTORICO", line 6
ORA-04088: error during execution of trigger 'BDDAD_DL1.ADD_HISTORICO' 04091. 00000 -. "Table% s% s is mutating, trigger/function may not see it"
* Cause: A trigger (or a user defined plsql function that is referenced in
            this statement) attempted to look at (or modify) a table que was
            in the middle of being modified by the statement Which fired it.
* Action: Rewrite the trigger (or function) so it does not read that table.

답변

1

없음 SELECT는 트리거에 :NEW 값을 참조해야합니다. 또한, 당신은 당신이 의도의 가정에 현재 날짜를 얻을 수 TRUNC (SYSDATE)를 사용할 수 있습니다 :

create or replace 
trigger ADD_HISTORICO 
AFTER INSERT 
    ON ALUGUER 
    FOR EACH ROW 

BEGIN 

    INSERT INTO HISTORICO(ID_ENTRADA,DESCRICAO,DATA_REGISTO, 
      NOVO_VEICULO,NOVO_ALUGUER) 
    VALUES(SEQ_HISTORICO.nextval,'NOVA DESCRIÇÃO', 
      TRUNC(SYSDATE),:NEW.COD_VEICULO ,:NEW.ID_ALUGUER); 

END; 
+0

이 시간 내 주셔서 감사 읽고 추천 할 것입니다. 그것은 많은 도움이되었습니다. – Vyward

2

당신은 트리거가 발사 한 테이블에서 레코드를 읽을 위해 노력하고 있습니다. 이것은 아니오입니다. 따라서이 코드는

SELECT ID_ALUGUER INTO cod_aluguer_p 
    FROM ALUGUER; 
    SELECT COD_VEICULO INTO cod_veiculo_p 
    FROM ALUGUER; 

이 허용되지 않습니다. 또한 WHERE 절이 없으므로 의미가 없습니다. 따라서 모든 행이 반환됩니다. 너는 어쨌든 이것을 할 수 없기 때문에 논점이있다. 당신이하고 싶은 것은 트리거 된 행의 새로운 값을 참조하는 것입니다. 예 :

cod_aluguer_p := :new.ID_ALUGUER ; 
    cod_veiculo_p L= :NEW.COD_VEICULO; 

로컬 변수가 없어도 new를 직접 사용할 수 있습니다.

INSERT INTO HISTORICO(ID_ENTRADA,DESCRICAO,DATA_REGISTO,NOVO_VEICULO,NOVO_ALUGUER) 
    VALUES(SEQ_HISTORICO.nextval,'NOVA DESCRIÇÃO','21/11/2013',:NEW.COD_VEICULO,:new.ID_ALUGUER); 

나는 Oracle docs on triggers

+0

시간 내 주셔서 감사합니다. 그것은 많은 도움이되었습니다. – Vyward

관련 문제