이 기능에 대한 Craig의 설명이 정말 마음에 듭니다. SQL-2011 스펙은 트리거 컨텍스트에서 이들을 "삭제, 삽입 또는 대체되는 행 콜렉션을 전이 테이블이라고합니다"라고 정의합니다. 유사한 설명이 문서에서 제공됩니다,
AFTER
트리거의 전이 테이블 REFERENCING
은 표준 방식으로 절을 사용하여 지정 되지만 트리거에 사용 된 행 변수 FOR EACH ROW
는 REFERENCING
절에 지정되지 않을 수 있습니다 . 트리거 기능이 작성되는 언어에 따라 다른 방식으로 제공됩니다. 일부 언어는 다음 REFERENCING
을 포함 하는 절이있는 것처럼 효과적으로 작동합니다.OLD ROW AS OLD NEW ROW AS NEW.
본질적으로 그들은 전체 진술의 변경 사항을 귀하에게 제공하므로 매우 편리합니다. 참고로 create 트리거의 DDL은 전환 테이블에서 다음과 같이 보입니다.
REFERENCING OLD TABLE AS oldtable NEW TABLE AS newtable
여기 에서 예제 를 볼 수 있으며 여기 테스트 스위트 의 예제가 있습니다 .
CREATE TABLE transition_table_base (id int PRIMARY KEY, val text);
CREATE FUNCTION transition_table_base_ins_func()
RETURNS trigger
LANGUAGE plpgsql
AS $$
DECLARE
t text;
l text;
BEGIN
t = '';
FOR l IN EXECUTE
$q$
EXPLAIN (TIMING off, COSTS off, VERBOSE on)
SELECT * FROM newtable
$q$ LOOP
t = t || l || E'\n';
END LOOP;
RAISE INFO '%', t;
RETURN new;
END;
$$;
CREATE TRIGGER transition_table_base_ins_trig
AFTER INSERT ON transition_table_base
REFERENCING OLD TABLE AS oldtable NEW TABLE AS newtable
FOR EACH STATEMENT
EXECUTE PROCEDURE transition_table_base_ins_func();
몇 가지 추가 사항
AFTER
트리거 에서만 사용할 수 있습니다 .
- 그들은 같은 것을 고려합니다
ON CONFLICT
.
PG 10에서 완전히 사용할 수있는 것은 아니라는 점을 지적하는 것이 중요합니다 . 전이 테이블 에는 많은 공개 문제가 있습니다 . 대부분 패치가 있습니다. 일종의 일상적인 싸움이 있습니다. 무거운 물건은 다른 사람이 집어 든 것 같습니다. 스레드는 우리가 곧 알 수 있음을 나타냅니다.
저자는 응답했다 – 다시 잘 가고있는 것처럼 보인다.