2016-10-09 8 views
1

Wie kann ich DROP zwingen, eine TEMP TABLE? Ich habe eine Web-Anwendung, die temporäre Tabellen verwendet, aber ich halte in diesen Fehler ausgeführt wird:DROP in Postgresql Erzwingen

PG::ObjectInUse: ERROR: cannot DROP TABLE "t" because it is being used by active queries in this session 

Ich sehe eine Option auf DROP RESTRICT ist, aber ist es eine Möglichkeit, nicht zu beschränken? Oder gibt es einen besseren Weg, dies zu lösen?

+0

Nun, die Meldung „*, weil sie durch aktive Abfragen in dieser Sitzung * verwendet wird“ ist ziemlich klar: Stellen Sie sicher, dass Sie nicht mehr, dass die Tabelle. Wenn ich raten musste: Sie haben eine Transaktion mit dieser Tabelle gestartet, aber diese Transaktion nie committed und diese Sitzungen sind nicht "in der Transaktion inaktiv" - sondern nur "im Leerlauf" –

+0

Lesen Sie die Fehlermeldung: 'wird von aktiven Abfragen verwendet in dieser Sitzung "- vielleicht herausfinden, was es benutzt und es töten, bevor Sie versuchen, es fallen zu lassen? – SeinopSys

+0

Es gibt einen Cursor, der es verwendet, aber die Tatsache, dass es neu erstellt wird, bedeutet, dass es nicht mehr notwendig ist. Wenn es eine Möglichkeit gibt, es fallen zu lassen, scheint das die einfachste Lösung zu sein. – Adam12344

Antwort

0

Überprüfen Sie ob eine Transaktion in der Tabelle wird mit durch Ausgabe:

SELECT * FROM pg_stat_activity; 

Wenn Sie Fragen finden, die wahrscheinlich idle in transaction oder active sind und beinhalten Tabelle t dann können Sie Beendigung der Abfrage oder dem Client erzwingen (Dies gibt ROLLBACK), die die Abfrage selbst ausgibt, indem sie sie mit pid identifizieren, die aus der obigen Abfrage zurückgegeben wird:

SELECT pg_cancel_backend(${pid here}); -- cancel query 
SELECT pg_terminate_backend(${pid here}); -- terminate connection 

Ju st ersetzen ${pid here} mit der pid von Abfrage Statistik Aktivitätsansicht.

Oder man könnte es auch in einigen verrückten Art und Weise tun (obwohl ich eher empfehlen es manuell zu tun) wie folgt aus:

SELECT pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE query ~* ' t' 
    AND pid <> pg_backend_pid(); -- prevent killing "yourself" ;-) 

Above Lösung ist unsicher Ihre Tabellennamen unter Berücksichtigung und sollte nie in der Produktion verwendet werden! Dies könnte viele Abfragen nicht mit der Tabelle t übereinstimmen!

+0

Sie können auch mit 'pg_locks' genau zu bestimmen, welche Sitzungen die Tabelle zugreifen, oder haben sie zugegriffen. –