ORA-04082: 테이블 레벨 트리거에서 새 참조 또는 오래된 참조가 허용되지 않음
테이블 이름이 있습니다.각 테이블에는 "fl1"이라는 필드와 "fl2"라는 다른 필드가 있습니다.레코드를 갱신할 때 "fl1" 값이 변경되었는지 확인하고 싶습니다.값이 변경된 경우 "fl2" 열을 "fl1"의 새 값으로 업데이트합니다.
이 방아쇠를 당겼는데
CREATE OR REPLACE TRIGGER Flag
AFTER INSERT OR UPDATE on per
REFERENCING NEW AS NEW OLD AS OLD
BEGIN
If :New.fl1 != :Old.fl1 Then
:New.fl2:= :new.fl1;
End If;
END;
실행 시 "ORA-04082: 새 참조 또는 오래된 참조가 테이블레벨 트리거에 허용되지 않음"이 표시된다.
다른 방법으로는 fl1의 값이 변경되었는지 여부에 관계없이 fl2의 값을 fl1의 값으로 간단하게 갱신하는 방법이 있습니다.
갱신하다
각 행에 대해 "Before INSERT OR UPDATE"를 추가하고 "Before INSERT OR UPDATE"를 "Before INSERT OR UPDATE"를 변경했습니다.그건 효과가 있다.
CREATE OR REPLACE TRIGGER Flag
BEFORE INSERT OR UPDATE on per
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
If :New.fl1 != :Old.fl1 Then
:New.fl2:= :new.fl1;
End If;
END;
DML 트리거는 테이블레벨 또는 행레벨로 정의됩니다.
테이블 레벨 트리거는 테이블 상의 각 조작에 대해1회 기동하기 때문에 30 행을 갱신하면 테이블트리거에 관한 한 1회의 조작이 됩니다.테이블 트리거에는 수정할 행에 대한 통찰력은 없지만 작업이 수행된 사실을 기록하는 데 사용할 수 있습니다.
이 경우 "FOR EACH ROW"를 트리거 정의에 포함해야 하는 행 레벨 트리거가 필요합니다.새로운 행과 오래된 행을 참조하는 방법을 변경하지 않을 경우 "REferencing" 절은 옵션입니다.
http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/triggers.htm#BABCIBBJ
하지만 여기서 연습의 요점은 잘 모르겠습니다.fl2가 아닌 fl1만 참조하는 것을 고려해 본 적이 있습니까?
최종 작업 코드:
CREATE OR REPLACE TRIGGER Flag
BEFORE INSERT OR UPDATE on per
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
If :New.fl1 != :Old.fl1 Then
:New.fl2:= :new.fl1;
End If;
END;
언급URL : https://stackoverflow.com/questions/18741342/ora-04082-new-or-old-references-not-allowed-in-table-level-triggers
'sourcecode' 카테고리의 다른 글
Spring Rest템플릿 예외 처리 (0) | 2023.02.23 |
---|---|
사용자 정의 필터 기능이 있는 AngularJS 다중 필터 (0) | 2023.02.23 |
Wordpress 플러그인 슬라이더 회전 오류 (0) | 2023.02.23 |
Python에서 JSON 출력 색칠하기 (0) | 2023.02.23 |
ASP를 정지하는 방법JQuery를 사용하기 위해 ID를 변경하는 NET (0) | 2023.02.23 |