2016-06-15 2 views
0

새 행을 추가하면 한 열 ("notubes")을 같은 테이블의 다른 열 ("notubesleft")에 복사하는 트리거를 만들려고합니다. . 제대로 컴파일하지만 새 행을 삽입 할 때이 오류가 발생합니다SQL 트리거가 올바르게 컴파일되지만 오류가 발생합니다.

내 트리거는 다음과 같습니다

create or replace TRIGGER NOTUBESLEFT_INSERT_TRIGGER  
AFTER INSERT ON SAMPLES FOR EACH ROW BEGIN 
update samples 
set notubesleft = (select notubes from samples where sampleid = :new.sampleid); 
END; 

내가 오류 얻을 새 행을 커밋 할 때 :

One error saving changes to table "APEX_WS_PROMETHEUS"."SAMPLES":
Row 10: ORA-04091: table APEX_WS_PROMETHEUS.SAMPLES is mutating, trigger/function may not see it
ORA-06512: at "APEX_WS_PROMETHEUS.NOTUBESLEFT_INSERT_TRIGGER", line 2 ORA-04088: error during execution of trigger 'APEX_WS_PROMETHEUS.NOTUBESLEFT_INSERT_TRIGGER'
ORA-06512: at line 1

을 나는 새로운 질문을하고있다. 왜냐하면 내가 트리거의 PL/SQL 코드를 구조화하는 방법에 대한 해결책을 찾을 수 있었기 때문입니다. 그러나 그것이 작동하지 않는 이유를 알 수는 없습니다.

감사합니다.

+0

왜 삽입 후 트리거로이 작업을 수행하려고합니까? –

+0

왜냐하면 먼저 테이블에 값을 삽입해야만 다른 값을 채우기 전에 값을 삽입해야한다고 생각했기 때문입니다. 그것은 첫 번째 방아쇠입니다. – Matte

답변

1

당신은 할 수 없습니다 (쉽게)는 로우 -와에 삽입하고있는 테이블을 쿼리 레벨 트리거. 그러나 테이블을 쿼리하지 않아야하며이를 수행하기 위해 삽입 후 트리거를 사용하지 않아야합니다. 대신 삽입 전 트리거를 사용하십시오.

CREATE OR REPLACE TRIGGER NOTUBESLEFT_INSERT_TRIGGER  
BEFORE INSERT ON SAMPLES FOR EACH ROW 
BEGIN 
    :new.notubesleft := :new.notubes; 
END; 
+0

그건 매력처럼 작동합니다! 엄청 고마워 – Matte

0

변경 테이블 문제가 발생했습니다. 당신이 EACH ROW 트리거 A의 변이 된 테이블을 쿼리 할 수없는 제한이

Trigger Restrictions on Mutating Tables

If you must update a mutating table, you can bypass these restrictions by using a temporary table, a PL/SQL table, or a package variable. For example, in place of a single AFTER row trigger that updates the original table, resulting in a mutating table error, you might use two triggers—an AFTER row trigger that updates a temporary table, and an AFTER statement trigger that updates the original table with the values from the temporary table.

+0

도움 주셔서 감사합니다. FOR EACH ROW가 정확한지 궁금합니다. 내 목표는 삽입되는 새 행에 대한 트리거 만 실행하는 것입니다. 나는 사용자가 한 번에 한 행을 삽입 할 것으로 기대합니다. – Matte

관련 문제