Postgresql 将用户列表传递给Postgres是否会改变用户一次对所有用户进行操作?

Postgresql 将用户列表传递给Postgres是否会改变用户一次对所有用户进行操作?,postgresql,Postgresql,我对PGAdmin4有一个恼人的问题。我们的一个工作流涉及相当频繁地从备份中删除和重新创建数据库。如果此时有人使用PGAdmin4连接,则会阻止删除数据库。终止连接不起作用,因为它会立即恢复以生成服务器仪表板 我试图通过暂时禁用连接到DB的任何用户的登录来解决这个问题,直到删除并重新创建DB为止,但是我很难将用户列表传递给ALTER USER函数,并且不确定是否可以同时对多个用户进行操作。查询如下: ALTER USER (SELECT usename FROM pg_stat_activity

我对PGAdmin4有一个恼人的问题。我们的一个工作流涉及相当频繁地从备份中删除和重新创建数据库。如果此时有人使用PGAdmin4连接,则会阻止删除数据库。终止连接不起作用,因为它会立即恢复以生成服务器仪表板

我试图通过暂时禁用连接到DB的任何用户的登录来解决这个问题,直到删除并重新创建DB为止,但是我很难将用户列表传递给ALTER USER函数,并且不确定是否可以同时对多个用户进行操作。查询如下:

ALTER USER (SELECT usename FROM pg_stat_activity WHERE dataname="THEDATABASE" and usename NOT IN ('postgres', 'systemuser1', 'systemuser2')) WITH NOLOGIN;
有人知道我该怎么做吗?如果相关的话,我在Postgres 12上。

升级到v13并使用

DROP DATABASE xyz FORCE;
升级到v13并使用

DROP DATABASE xyz FORCE;

FWIW我能够通过一个程序以一种有点棘手的方式做到这一点:

DO
    $$
        DECLARE row record;
        BEGIN
            FOR row IN select 'ALTER USER ' || usename || ' WITH NOLOGIN;' as cmd from pg_stat_activity where "usename" not in ('postgres', 'sysadmin') and datname = 'THEDATABASE' 
            LOOP
                RAISE NOTICE '%', row.cmd;
                EXECUTE row.cmd;
            END LOOP;
        END;
    $$;

如果您的限制条件允许,升级到PG13是一个更好的解决方案,正如前面提到的另一个回答者所说。

FWIW我能够通过一个过程以一种有点棘手的方式做到这一点:

DO
    $$
        DECLARE row record;
        BEGIN
            FOR row IN select 'ALTER USER ' || usename || ' WITH NOLOGIN;' as cmd from pg_stat_activity where "usename" not in ('postgres', 'sysadmin') and datname = 'THEDATABASE' 
            LOOP
                RAISE NOTICE '%', row.cmd;
                EXECUTE row.cmd;
            END LOOP;
        END;
    $$;

如果您的限制允许,升级到PG13是一个更好的解决方案,正如前面提到的其他回答者所说。

如果可以的话,我会的!如果我能的话,我会的!