Con PostgreSQL, puede emitir la siguiente declaración para devolver los pid de back-end de todas las conexiones abiertas que no sean esta:
SELECT pid FROM pg_stat_activity where pid <> pg_backend_pid();
Luego, puede emitir una solicitud de finalización para cada uno de esos backends con
SELECT pg_terminate_backend($1);
Vincular los pid devueltos desde la primera instrucción a cada ejecución pg_terminate_backend.
Si las otras conexiones no usan el mismo usuario que usted, tendrá que conectarse como superusuario para emitir con éxito las terminaciones.
- Documentos de funciones de señalización de administración
- Funciones de estadísticas de monitoreo
- pg_stat_activity view docs
ACTUALIZACIÓN:incorporación de comentarios y expresión como tarea 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