Qu'est-ce qu'une «table de transition» dans Postgres?

12

La page décrivant les nouveautés de Postgres 10 mentionne les «Tables de transition pour les déclencheurs».

Tables de transition pour les déclencheurs

Cette fonctionnalité rend les AFTER STATEMENTdéclencheurs à la fois utiles et performants en exposant, le cas échéant, les anciennes et nouvelles lignes aux requêtes. Avant cette fonctionnalité, les AFTER STATEMENTdéclencheurs n'avaient pas d'accès direct à ceux-ci, et les solutions de contournement étaient byzantines et avaient de mauvaises performances. Une grande partie de la logique de déclenchement peut désormais être écrite sous la forme AFTER STATEMENT, évitant ainsi de devoir effectuer les changements de contexte coûteux à chaque ligne requis par les déclencheurs FOR EACH ROW.

Qu'est-ce qu'une table de transition?

Basil Bourque
la source

Réponses:

12

Vous savez comment il y a OLDet NEWélectrophones variables pour les FOR EACH ROWdéclencheurs?

Les tables de transition sont les FOR EACH STATEMENTéquivalents. Ce sont des tableaux avec les anciens et les nouveaux tuples, afin que vos déclencheurs puissent voir ce qui a changé.

Craig Ringer
la source
9

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 AFTERdéclencheurs sont spécifiées à l'aide de la REFERENCINGclause de la manière standard, les variables de ligne utilisées dans les FOR EACH ROWdéclencheurs peuvent ne pas être spécifiées dans la REFERENCINGclause. 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 REFERENCINGclause 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

  1. Ils ne sont disponibles que sur les AFTERdéclencheurs.
  2. 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.

Evan Carroll
la source