2016-07-06 10 views
0

haben einfachen Einsatz loggenWie id mit der Rückkehr Abfrage für einzelne Tabelle

INSERT INTO "public"."mytbl" ("col1", "col2" , "col3" , "col4", "col5") 
values ('test', 'test' , null , 'test', null) RETURNING id; 

Logtime für diese Abfrage nur die Ausführung sollen. Wie es geht ? Ich möchte nicht alle querys einzuloggen, nur dieses eine

Antwort

0

Wenn Sie die Befehlszeilenschnittstelle psql verwenden, können Sie einfach

\timing 

eingeben und Sie werden die Dauer jeder Anweisung erhalten, nachdem es ausgeführt wurde. Wenn Sie die Dauer in der PostgreSQL-Protokolldatei protokollieren möchten, können Sie dies tun, indem Sie den Parameter log_min_duration_statement = 0 setzen.
Das Problem ist, dass dieser Parameter nur vom Superuser gesetzt werden kann, und Sie wahrscheinlich die Anweisung als ein anderer Benutzer ausführen möchten.

Eine Möglichkeit, einen normalen Benutzer zu ermöglichen Aussage Dauer loggt ist eine SECURITY DEFINER Funktion zu verwenden, die von einem Super-User gehört und setzt den Parameter für die Dauer der aktuellen Transaktion:

CREATE OR REPLACE FUNCTION logduration() RETURNS void AS 
    'SET LOCAL log_min_duration_statement=0' 
    LANGUAGE sql SECURITY DEFINER; 

REVOKE EXECUTE ON FUNCTION logduration() FROM PUBLIC; 
GRANT EXECUTE ON FUNCTION logduration() TO laurenz; 

Dann Benutzer laurenz können wie folgt vorgehen:

START TRANSACTION; 
SELECT logduration(); 
INSERT INTO "public"."mytbl" ... 
COMMIT; 

Ihr Protokoll enthält nur die Dauer des INSERT Befehl (na ja, auch die Dauer des funxtion Ruf, aber das sollte kein Problem sein).