PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Capistrano con PostgreSQL, errore:accesso al database da parte di altri utenti

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.

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