J'aime vraiment l'explication de Craig sur la fonctionnalité. La spécification SQL-2011 les définit dans le contexte d'un déclencheur comme «une collection de lignes en cours de suppression, d'insertion ou de remplacement est appelée table de transition». Une explication similaire est fournie dans la documentation,
Alors que les tables de transition pour les AFTER
déclencheurs sont spécifiées à l'aide de la REFERENCING
clause de la manière standard, les variables de ligne utilisées dans les FOR EACH ROW
déclencheurs peuvent ne pas être spécifiées dans la REFERENCING
clause. Ils sont disponibles d'une manière qui dépend de la langue dans laquelle la fonction de déclenchement est écrite. Certaines langues se comportent effectivement comme s'il y avait une REFERENCING
clause contenantOLD ROW AS OLD NEW ROW AS NEW.
Essentiellement, ils mettent à votre disposition l'ensemble des modifications de l'instruction, ce qui est très pratique. Pour référence, le DDL sur le déclencheur de création ressemble à ceci avec les tables de transitions
REFERENCING OLD TABLE AS oldtable NEW TABLE AS newtable
Vous pouvez voir un exemple ici , et en voici un de la suite de tests ,
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();
Quelques notes supplémentaires
- Ils ne sont disponibles que sur les
AFTER
déclencheurs.
- Ils prennent en compte des choses comme
ON CONFLICT
.
Il est important de souligner qu'il n'est pas entièrement sûr d'être disponible dans PG 10 . Il y a beaucoup de problèmes ouverts avec les tables de transition . La plupart ont des patchs. Il y a des luttes intestines qui sont une sorte de routine. Il semble que le gros du travail ait été repris par quelqu'un d'autre. Le fil indique que nous le saurons bientôt.
L'auteur a répondu - semble aller de nouveau bien.