我正在编写一个脚本,该脚本将删除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:无法删除当前打开的数据库。
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的包装。
答案 0 :(得分:2)
--maintenance-db=dbname
指定连接到以删除目标数据库的数据库的名称。如果未指定,将使用
postgres
数据库;如果不存在(或者正在删除数据库),将使用template1
。
dropdb
连接到postgres
,而不连接到要删除的数据库,这就是在这种情况下它可以工作的原因。