【问题标题】:Why does Postgres dropdb works but psql DROP DATABASE doesn't?为什么 Postgres dropdb 有效但 psql DROP DATABASE 无效?
【发布时间】:2019-07-14 05:20:16
【问题描述】:

我正在编写一个将删除 PostgreSQL 数据库的脚本。我是这样做的:

echo "> Prevent connection of new users."
PGPASSWORD=$PG_PASSWORD_IMPORT psql \
    -h $PG_HOST_IMPORT -p $PG_PORT_IMPORT -U $PG_USER_IMPORT -d $PG_DATABASE_IMPORT \ 
    -c "REVOKE CONNECT ON DATABASE $PG_DATABASE_IMPORT FROM PUBLIC, $PG_USER_IMPORT;"

echo "> Terminate existing connections."
PGPASSWORD=$PG_PASSWORD_IMPORT psql \
    -h $PG_HOST_IMPORT -p $PG_PORT_IMPORT -U $PG_USER_IMPORT -d $PG_DATABASE_IMPORT \
    -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE pid <> pg_backend_pid() AND datname = '$PG_DATABASE_IMPORT';"

echo "> Drop '$PG_DATABASE_IMPORT' database."
PGPASSWORD=$PG_PASSWORD_IMPORT dropdb \
    -h $PG_HOST_IMPORT -p $PG_PORT_IMPORT -U $PG_USER_IMPORT  $PG_DATABASE_IMPORT

而且效果很好。

但是当我尝试使用 psql 删除数据库时,我得到错误 ERROR: cannot drop the current open database.

echo "> Prevent connection of new users."
PGPASSWORD=$PG_PASSWORD_IMPORT psql \
    -h $PG_HOST_IMPORT -p $PG_PORT_IMPORT -U $PG_USER_IMPORT -d $PG_DATABASE_IMPORT \
    -c "REVOKE CONNECT ON DATABASE $PG_DATABASE_IMPORT FROM PUBLIC, $PG_USER_IMPORT;"

echo "> Terminate existing connections."
PGPASSWORD=$PG_PASSWORD_IMPORT psql \
    -h $PG_HOST_IMPORT -p $PG_PORT_IMPORT -U $PG_USER_IMPORT -d $PG_DATABASE_IMPORT \
    -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE pid <> pg_backend_pid() AND datname = '$PG_DATABASE_IMPORT';"

echo "> Drop '$PG_DATABASE_IMPORT' database."
PGPASSWORD=$PG_PASSWORD_IMPORT psql \
    -h $PG_HOST_IMPORT -p $PG_PORT_IMPORT -U $PG_USER_IMPORT -d $PG_DATABASE_IMPORT \
    -c "DROP DATABASE $PG_DATABASE_IMPORT;"

我觉得很奇怪,因为根据文档,dropdb 是 SQL 命令 DROP DATABASE 的包装器。

【问题讨论】:

  • 问题是,当您打开与某个数据库的会话时,Postgres 不会让您删除该数据库。但是从命令行来看,没有这样的限制

标签: postgresql


【解决方案1】:

The dropdb documentation 说:

--maintenance-db=<strong><em>dbname</em></strong>

    指定要连接到的数据库的名称,以便删除目标数据库。如果未指定,将使用postgres 数据库;如果不存在(或正在删除数据库),将使用template1

dropdb 连接到postgres,而不是连接到即将被删除的数据库,这就是它在这种情况下工作的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 2022-01-12
    • 2020-05-14
    • 2020-10-07
    • 2023-03-30
    • 2013-05-13
    相关资源
    最近更新 更多