PostgreSQLでは、次のステートメントを発行して、これ以外のすべての開いている接続のバックエンドpidを返すことができます。
SELECT pid FROM pg_stat_activity where pid <> pg_backend_pid();
次に、これらの各バックエンドに終了リクエストを発行できます
SELECT pg_terminate_backend($1);
最初のステートメントから返されたpidを各pg_terminate_backendexecにバインドします。
他の接続があなたと同じユーザーを使用していない場合、正常に終了を発行するには、スーパーユーザーとして接続する必要があります。
更新:コメントを組み込み、Capistranoタスクとして表現する:
desc "Force disconnect of open backends and drop database"
task :force_close_and_drop_db do
dbname = 'your_database_name'
run "psql -U postgres",
:data => <<-"PSQL"
REVOKE CONNECT ON DATABASE #{dbname} FROM public;
ALTER DATABASE #{dbname} CONNECTION LIMIT 0;
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
AND datname='#{dbname}';
DROP DATABASE #{dbname};
PSQL
end