programing

테이블에 문 수준 트리거를 구현할 때 영향을 받는 모든 행에 대해 OLD 및 NEW 레코드를 가져올 수 있습니까?

newstyles 2023. 7. 28. 21:51

테이블에 문 수준 트리거를 구현할 때 영향을 받는 모든 행에 대해 OLD 및 NEW 레코드를 가져올 수 있습니까?

Oracle에서 다음을 지정하여 행 수준 트리거를 작성할 수 있습니다.FOR EACH ROW의 조항CREATE TRIGGER문:

CREATE TRIGGER MY_FANCY_TRIGGER
  BEFORE UPDATE ON MY_TABLE
  FOR EACH ROW
BEGIN
  IF :OLD.my_id_column > 4 AND :NEW.some_other_column <> 'foo' THEN
    -- ...
  END IF;
END;

이러한 트리거를 사용하면 영향을 받는 각 행의 이전 버전과 이후 버전을 볼 수 있습니다.:OLD그리고.:NEW각각)예를 들어, 다음 명령문은 이 트리거를 각 행에 대해 한 번 실행하게 합니다.MY_TABLE:

UPDATE MY_TABLE SET some_other_column = 'bar';

다음을 제거함으로써FOR EACH ROW절, 트리거는 문 레벨 트리거가 됩니다.즉, 문의 영향을 받은 행 수(있는 경우)에 관계없이 문당만 실행됩니다.불행히도 문 수준 트리거에는 다음이 없습니다.:OLD그리고.:NEW변수를 사용할 수 있습니다(영향을 받는 행의 수가 다양하기 때문에).

그것을 얻는 것이 가능합니까?:OLD그리고.:NEW문 수준 트리거 내의 영향을 받는 모든 행에 대한 값?명세서당 한 번만 발생하고 싶은 처리가 있습니다.

한 가지 방법은 저스틴 케이브가 제안한 방법으로 행 수준 트리거의 정보를 별도의 패키지 컬렉션에 저장하는 것입니다.

11g를 사용하는 경우에는 복합 트리거를 사용하는 것이 좋습니다.이렇게 하면 키 수집을 유지하기 위한 별도의 패키지가 생성되지 않습니다. 트리거 자체에서 수행할 수 있습니다.

직접적으로는 안해, 안했어.

표준 접근 방식은 "3-트리거 솔루션"입니다(변종 테이블 문제를 해결하려고 할 때 더 일반적으로 사용됨).

  1. 테이블에 대한 키 모음을 포함하는 패키지 만들기
  2. 컬렉션을 초기화하는 before 문 트리거 만들기
  3. 키를 컬렉션에 삽입하는 행 수준 트리거를 만듭니다.
  4. 컬렉션의 키를 사용하여 처리를 수행하는 애프터 문 트리거를 만듭니다.

분명히, 당신의 경우, 행 수준 트리거가 돌연변이 테이블 오류를 유발하지 않는다면, 이것은 아마도 프로세스에 복잡성을 가중시킬 것입니다.

Josephj1989가 아래에서 지적했듯이, 만약 당신이 11g를 사용하고 있다면, 복합 트리거를 사용하여 이를 조금 단순화할 수 있습니다.계속해서 컬렉션을 선언하고, 행 수준 트리거 본문에 컬렉션을 채우고, 문 수준 트리거에서 컬렉션을 처리합니다.그러나 여러 개체가 아닌 하나의 개체만 생성하고 관리할 수 있습니다.

언급URL : https://stackoverflow.com/questions/5905182/when-implementing-a-statement-level-trigger-on-a-table-is-it-possible-to-obtain