¿Qué es una "tabla de transición" en Postgres?

12

La página que describe las novedades en Postgres 10 menciona "Tablas de transición para disparadores".

Tablas de transición para disparadores

Esta característica hace que los AFTER STATEMENTdisparadores sean útiles y eficaces al exponer, según corresponda, las filas antiguas y nuevas a consultas. Antes de esta función, los AFTER STATEMENTdesencadenantes no tenían acceso directo a estos, y las soluciones alternativas eran bizantinas y tenían un bajo rendimiento. Ahora se puede escribir mucha lógica de disparo AFTER STATEMENT, evitando la necesidad de realizar los costosos cambios de contexto en cada fila que requieren los disparadores PARA CADA FILA.

¿Qué es una tabla de transición?

Albahaca Bourque
fuente

Respuestas:

12

Ya sabes lo que hay OLDy NEWtocadiscos variables para FOR EACH ROWfactores desencadenantes?

Las tablas de transición son los FOR EACH STATEMENTequivalentes. Son tablas con las tuplas antiguas y nuevas, por lo que sus disparadores pueden ver qué ha cambiado.

Craig Ringer
fuente
9

Realmente me gusta la explicación de Craig de la función. La especificación SQL-2011 los define en el contexto de un desencadenador como "una colección de filas que se eliminan, insertan o reemplazan se conoce como una tabla de transición". Se proporciona una explicación similar en los documentos,

Si bien las tablas de transición para los AFTERdesencadenantes se especifican utilizando la REFERENCINGcláusula de la manera estándar, las variables de fila utilizadas en los FOR EACH ROWdesencadenantes pueden no especificarse en la REFERENCINGcláusula. Están disponibles de una manera que depende del idioma en el que se escribe la función de activación. Algunos idiomas se comportan efectivamente como si hubiera una REFERENCINGcláusula que contieneOLD ROW AS OLD NEW ROW AS NEW.

Esencialmente, ponen a su disposición todos los cambios de la declaración, lo cual es muy útil. Como referencia, el desencadenador DDL en crear se ve así con tablas de transiciones

REFERENCING OLD TABLE AS oldtable NEW TABLE AS newtable

Puede ver un ejemplo aquí , y aquí hay uno del conjunto de pruebas ,

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

Algunas notas adicionales

  1. Solo están disponibles en AFTERactivadores.
  2. Toman en cuenta cosas como ON CONFLICT.

Es importante señalar que no es del todo seguro estar disponible en PG 10 . Hay muchos problemas abiertos con las tablas de transición . La mayoría tiene parches. Hay algunas luchas internas que son una especie de rutina. Parece que el trabajo pesado fue recogido por otra persona. El hilo indica que lo sabremos pronto.

El autor respondió: parece estar yendo bien de nuevo.

Evan Carroll
fuente