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 AFTER
acionadores sejam especificadas usando a REFERENCING
cláusula da maneira padrão, as variáveis de linha usadas nos FOR EACH ROW
acionadores podem não ser especificadas na REFERENCING
clá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 REFERENCING
clá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
- Eles estão disponíveis apenas em
AFTER
gatilhos.
- 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.