O que é uma "tabela de transição" no Postgres?

12

A página que descreve as novidades do Postgres 10 menciona "Tabelas de transição para gatilhos".

Tabelas de transição para gatilhos

Esse recurso torna os AFTER STATEMENTacionadores úteis e de alto desempenho, expondo, conforme apropriado, as linhas antiga e nova às consultas. Antes desse recurso, os AFTER STATEMENTgatilhos não tinham acesso direto a eles, e as soluções alternativas eram bizantinas e apresentavam baixo desempenho. Muita lógica de gatilho agora pode ser escrita como AFTER STATEMENT, evitando a necessidade de alternar o contexto caro em cada linha que os gatilhos do FOR EACH ROW exigem.

O que é uma tabela de transição?

Basil Bourque
fonte

Respostas:

12

Você sabe como existem OLDe NEWvariáveis ​​de registro para FOR EACH ROWgatilhos?

As tabelas de transição são os FOR EACH STATEMENTequivalentes. São tabelas com as tuplas antiga e nova, para que seus gatilhos possam ver o que mudou.

Craig Ringer
fonte
9

Eu realmente gosto da explicação de Craig sobre o recurso. O SQL-2011 Spec os define no contexto de um gatilho como "uma coleção de linhas excluídas, inseridas ou substituídas é conhecida como tabela de transição". Uma explicação semelhante é fornecida nos documentos,

Embora as tabelas de transição para AFTERacionadores sejam especificadas usando a REFERENCINGcláusula da maneira padrão, as variáveis ​​de linha usadas nos FOR EACH ROWacionadores podem não ser especificadas na REFERENCINGcláusula. Eles estão disponíveis de uma maneira que depende do idioma em que a função de disparo está escrita. Alguns idiomas se comportam efetivamente como se houvesse uma REFERENCINGcláusula que contenhaOLD ROW AS OLD NEW ROW AS NEW.

Essencialmente, eles disponibilizam todas as alterações da declaração, o que é super útil. Para referência, o DDL no gatilho de criação se parece com isso nas tabelas de transições

REFERENCING OLD TABLE AS oldtable NEW TABLE AS newtable

Você pode ver um exemplo aqui , e aqui está um da suíte de testes ,

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();

Algumas notas adicionais

  1. Eles estão disponíveis apenas em AFTERgatilhos.
  2. Eles levam em conta coisas como ON CONFLICT.

É importante ressaltar que não é totalmente certo que esteja disponível na PG 10 . Existem muitos problemas em aberto nas tabelas de transição . A maioria tem patches. Há algumas lutas internas que são uma espécie de rotina. Parece que o trabalho pesado foi captado por outra pessoa. A discussão indica que saberemos em breve.

O autor respondeu - parece estar indo bem novamente.

Evan Carroll
fonte