2016-10-09 27 views
1

どのように強制的に温度テーブルを削除できますか?私は、一時テーブルを使用しているWebアプリケーションを持っているが、私は、このエラーに実行し続ける:PostgreSQLでDROPを強制する

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

私はDROPにRESTRICTオプションがありますが、制限しないようにする方法がある参照してください?または、これを解決する良い方法がありますか?

+0

"このセッションでは*アクティブなクエリで使用されているため*"というメッセージはかなり明確です。そのテーブルを使用していないことを確認してください。私が推測しなければならないのは、そのテーブルを使ってトランザクションを開始したにもかかわらず、そのトランザクションをコミットしたことがなく、それらのセッションが「アイドル」ではなく「トランザクションでアイドル状態」でないことです。 –

+0

「アクティブなクエリこのセッションでは、おそらくそれを使用しているものを見つけて、それを落とそうとする前にそれを殺すでしょうか? – SeinopSys

+0

それを使用しているカーソルがありますが、それが再び作成されているという事実はもはや必要ではないということを意味します。強制的にドロップする方法がある場合は、最も簡単な解決策のようです。 – Adam12344

答えて

0

任意のトランザクションが発行してテーブルを使用しているかどうかを点検:

SELECT * FROM pg_stat_activity; 

あなたはおそらくidle in transactionまたはactiveあるクエリを見つけ、テーブルtを伴うとき、あなたは(そのクエリまたはクライアントを強制終了することができますこれは、上記のクエリから返されpidでそれを識別することによって、クエリ自体を発行ROLLBACK)を発行:

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

チュstをpidと置き換え、統計情報のアクティビティビューを照会します。

か(私はむしろそれを手動で行うことをお勧めが)あなたもそのようにいくつかのクレイジーな方法でそれを行うことができます:溶液上の

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

は、あなたのテーブル名を考慮し安全でないと生産に使用すべきではありません!これは、テーブルtに関係しない多くのクエリと一致する可能性があります。

+0

'pg_locks'を使って、どのセッションがテーブルにアクセスしているのか、それともアクセスしたのかを正確に判断することもできます。 –

関連する問題