Com o PostgreSQL, você pode emitir a seguinte instrução para retornar os pids de backend de todas as conexões abertas que não sejam esta:
SELECT pid FROM pg_stat_activity where pid <> pg_backend_pid();
Em seguida, você pode emitir uma solicitação de rescisão para cada um desses back-ends com
SELECT pg_terminate_backend($1);
Ligando os pids retornados da primeira instrução para cada exec pg_terminate_backend.
Se as outras conexões não estiverem usando o mesmo usuário que você, você terá que se conectar como superusuário para emitir as terminações com sucesso.
- Documentos de funções de sinalização de administrador
- Funções de estatísticas de monitoramento
- pg_stat_activity ver documentos
ATUALIZAÇÃO:Incorporando comentários e expressando como tarefa de 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