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 AFTER
desencadenantes se especifican utilizando la REFERENCING
cláusula de la manera estándar, las variables de fila utilizadas en los FOR EACH ROW
desencadenantes pueden no especificarse en la REFERENCING
clá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 REFERENCING
clá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
- Solo están disponibles en
AFTER
activadores.
- 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.