PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Capistrano avec PostgreSQL, erreur :la base de données est en cours d'accès par d'autres utilisateurs

Avec PostgreSQL, vous pouvez émettre l'instruction suivante pour renvoyer les pid backend de toutes les connexions ouvertes autres que celle-ci :

SELECT pid FROM pg_stat_activity where pid <> pg_backend_pid();

Ensuite, vous pouvez envoyer une demande de résiliation à chacun de ces backends avec

SELECT pg_terminate_backend($1);

Lier les pid renvoyés par la première instruction à chaque exécutable pg_terminate_backend.

Si les autres connexions n'utilisent pas le même utilisateur que vous, vous devrez vous connecter en tant que superutilisateur pour émettre avec succès les terminaisons.

MISE À JOUR :Incorporer des commentaires et exprimer en tant que tâche 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