테이블에 문 수준 트리거를 구현할 때 영향을 받는 모든 행에 대해 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-트리거 솔루션"입니다(변종 테이블 문제를 해결하려고 할 때 더 일반적으로 사용됨).
- 테이블에 대한 키 모음을 포함하는 패키지 만들기
- 컬렉션을 초기화하는 before 문 트리거 만들기
- 키를 컬렉션에 삽입하는 행 수준 트리거를 만듭니다.
- 컬렉션의 키를 사용하여 처리를 수행하는 애프터 문 트리거를 만듭니다.
분명히, 당신의 경우, 행 수준 트리거가 돌연변이 테이블 오류를 유발하지 않는다면, 이것은 아마도 프로세스에 복잡성을 가중시킬 것입니다.
Josephj1989가 아래에서 지적했듯이, 만약 당신이 11g를 사용하고 있다면, 복합 트리거를 사용하여 이를 조금 단순화할 수 있습니다.계속해서 컬렉션을 선언하고, 행 수준 트리거 본문에 컬렉션을 채우고, 문 수준 트리거에서 컬렉션을 처리합니다.그러나 여러 개체가 아닌 하나의 개체만 생성하고 관리할 수 있습니다.
언급URL : https://stackoverflow.com/questions/5905182/when-implementing-a-statement-level-trigger-on-a-table-is-it-possible-to-obtain
'programing' 카테고리의 다른 글
pphp 도커 이미지에 pdo 드라이버를 설치하는 방법은 무엇입니까? (0) | 2023.07.28 |
---|---|
스프링 부트 내 @ControllerAdvise에서 재정의된 예외 이외의 예외에 대해 빈 본문으로 응답하는 Rest (0) | 2023.07.28 |
미국 달러 금액을 나타내기 위해 사용할 수 있는 가장 좋은 장고 모델 필드는 무엇입니까? (0) | 2023.07.28 |
TensorFlow에서 변수와 get_variable의 차이 (0) | 2023.07.23 |
PHP 헤더 리디렉션 301 - 의미는 무엇입니까? (0) | 2023.07.23 |