Che cos'è una "tabella di transizione" in Postgres?


12

La pagina che descrive le novità di Postgres 10 menziona "Tabelle di transizione per i trigger".

Tabelle di transizione per trigger

Questa funzione rende i AFTER STATEMENTtrigger utili e performanti esponendo, a seconda dei casi, le righe vecchie e nuove alle query. Prima di questa funzionalità, i AFTER STATEMENTtrigger non avevano accesso diretto a questi e le soluzioni alternative erano bizantine e avevano scarse prestazioni. Ora è possibile scrivere molta logica di trigger come AFTER STATEMENT, evitando la necessità di eseguire i costosi switch di contesto su ogni riga richiesti dai trigger FOR EACH ROW.

Che cos'è una tabella di transizione?

Risposte:


12

Sai come ci sono OLDe le NEWvariabili record per i FOR EACH ROWtrigger?

Le tabelle di transizione sono FOR EACH STATEMENTequivalenti. Sono tabelle con le vecchie e nuove tuple, quindi i tuoi trigger possono vedere cosa è cambiato.


9

Mi piace molto la spiegazione di Craig sulla funzionalità. Le specifiche SQL-2011 le definiscono nel contesto di un trigger come "una raccolta di righe che vengono eliminate, inserite o sostituite è nota come tabella di transizione". Una spiegazione simile è fornita nei documenti,

Mentre le tabelle di transizione per i AFTERtrigger sono specificate utilizzando la REFERENCINGclausola in modo standard, le variabili di riga utilizzate nei FOR EACH ROWtrigger potrebbero non essere specificate nella REFERENCINGclausola. Sono disponibili in un modo che dipende dalla lingua in cui è scritta la funzione trigger. Alcune lingue si comportano effettivamente come se ci fosse una REFERENCINGclausola contenenteOLD ROW AS OLD NEW ROW AS NEW.

Fondamentalmente rendono disponibili le modifiche dell'intera dichiarazione, il che è super utile. Per riferimento, il DDL su trigger trigger si presenta così con le tabelle delle transizioni

REFERENCING OLD TABLE AS oldtable NEW TABLE AS newtable

Puoi vedere un esempio qui , ed eccone uno dalla suite di test ,

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

Alcune note aggiuntive

  1. Sono disponibili solo sui AFTERtrigger.
  2. Prendono in considerazione cose come ON CONFLICT.

È importante sottolineare che non è del tutto sicuro di essere disponibile in PG 10 . Esistono molti problemi aperti con le tabelle di transizione . La maggior parte ha patch. C'è qualche combattimento che è una specie di routine. Sembra che il sollevamento pesante sia stato rilevato da qualcun altro. Il thread indica che lo sapremo presto.

L'autore ha risposto: sembra che stia andando di nuovo bene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.