Con PostgreSQL puoi emettere la seguente istruzione per restituire i pid di back-end di tutte le connessioni aperte diverse da questa:
SELECT pid FROM pg_stat_activity where pid <> pg_backend_pid();
Quindi puoi inviare una richiesta di terminazione a ciascuno di questi backend con
SELECT pg_terminate_backend($1);
Associazione dei pid restituiti dalla prima istruzione a ogni pg_terminate_backend exec.
Se le altre connessioni non utilizzano il tuo stesso utente, dovrai connetterti come superutente per emettere correttamente le terminazioni.
- Documenti sulle funzioni di segnalazione dell'amministratore
- Funzioni statistiche di monitoraggio
- pg_stat_activity visualizza i documenti
AGGIORNAMENTO:Incorporando commenti ed esprimendo come compito 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