sql >> Base de Datos >  >> RDS >> PostgreSQL

Capistrano con PostgreSQL, error:otros usuarios están accediendo a la base de datos

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.

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