Postgres의 "전환 테이블"은 무엇입니까?


12

Postgres 10의 새로운 기능을 설명 하는 페이지 에는“트리거 전환 테이블”이 언급되어 있습니다.

트리거에 대한 전이 테이블

이 기능은 AFTER STATEMENT적절한 경우 이전 행과 새 행을 쿼리에 노출하여 트리거를 유용하고 성능 적으로 만듭니다 . 이 기능을 AFTER STATEMENT실행 하기 전에는 트리거에 직접 액세스 할 수 없었으며 해결 방법은 비잔틴이었고 성능이 떨어졌습니다. AFTER STATEMENTFOR EACH ROW 트리거에 필요한 각 행에서 값 비싼 컨텍스트 전환을 수행 할 필요없이 많은 트리거 로직을로 작성할 수 있습니다 .

전이 테이블이란 무엇입니까?

답변:


12

트리거에 대한 레코드 변수 OLD및 방법이 무엇인지 알고 있습니까?NEWFOR EACH ROW

전환 테이블은 FOR EACH STATEMENT동일합니다. 이전 및 새 튜플이있는 테이블이므로 트리거가 변경된 내용을 볼 수 있습니다.


9

이 기능에 대한 Craig의 설명이 정말 마음에 듭니다. SQL-2011 스펙은 트리거 컨텍스트에서 이들을 "삭제, 삽입 또는 대체되는 행 콜렉션을 전이 테이블이라고합니다"라고 정의합니다. 유사한 설명이 문서에서 제공됩니다,

AFTER트리거의 전이 테이블 REFERENCING은 표준 방식으로 절을 사용하여 지정 되지만 트리거에 사용 된 행 변수 FOR EACH ROWREFERENCING절에 지정되지 않을 수 있습니다 . 트리거 기능이 작성되는 언어에 따라 다른 방식으로 제공됩니다. 일부 언어는 다음 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();

몇 가지 추가 사항

  1. AFTER트리거 에서만 사용할 수 있습니다 .
  2. 그들은 같은 것을 고려합니다 ON CONFLICT.

PG 10에서 완전히 사용할 수있는 것은 아니라는 점을 지적하는 것이 중요합니다 . 전이 테이블 에는 많은 공개 문제가 있습니다 . 대부분 패치가 있습니다. 일종의 일상적인 싸움이 있습니다. 무거운 물건은 다른 사람이 집어 든 것 같습니다. 스레드는 우리가 곧 알 수 있음을 나타냅니다.

저자는 응답했다 – 다시 잘 가고있는 것처럼 보인다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.