Come posso visualizzare una query dopo l'applicazione delle regole?


9

Dai documenti - 37.3.1.1. "Una prima regola passo dopo passo"

CREATE TABLE shoelace_log (
    sl_name    text,          -- shoelace changed
    sl_avail   integer,       -- new available value
    log_who    text,          -- who did it
    log_when   timestamp      -- when
);

CREATE RULE log_shoelace AS ON UPDATE TO shoelace_data
    WHERE NEW.sl_avail <> OLD.sl_avail
    DO INSERT INTO shoelace_log VALUES (
                                    NEW.sl_name,
                                    NEW.sl_avail,
                                    current_user,
                                    current_timestamp
                                );

Ora qualcuno fa:

(1) UPDATE shoelace_data SET sl_avail = 6 WHERE sl_name = 'sl7';

E il parser genera questa query aggiuntiva

(2) INSERT INTO shoelace_log VALUES (
       shoelace_data.sl_name, 6,
       current_user, current_timestamp )
  FROM shoelace_data
 WHERE 6 <> shoelace_data.sl_avail
   AND shoelace_data.sl_name = 'sl7';

La domanda è: ci sono strumenti per dire come la query (1) viene riscritta in (1) + (2)?

Risposte:


5

Non esiste un modo diretto per visualizzare una rappresentazione SQL della query riscritta, poiché la riscrittura avviene su una rappresentazione ad albero interna e non è facile convertirla in SQL. La cosa più vicina è attivare il parametro di configurazione debug_print_rewritten, che stampa una rappresentazione di quel formato ad albero interno nel registro del server. Se lo usi insieme alle impostazioni debug_print_parsee debug_print_plan(e possibilmente debug_pretty_print), puoi vedere come la query viene trasformata attraverso le varie fasi. Il formato non è facile da leggere, ma se sei interessato ad apprenderne i dettagli, probabilmente ne varrà la pena.


Ho anche appreso che EXPLAIN fornisce informazioni sul numero e sul tipo di query coinvolte (ed è molto più leggibile del registro di debug del database :).
egemon
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.