[英]Why does Postgres dropdb works but psql DROP DATABASE doesn't?
我正在编写一个将删除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的包装。
dropdb
文档说:
--maintenance-db= dbname
指定要删除目标数据库要连接的数据库的名称。 如果未指定,将使用
postgres
数据库。 如果不存在(或正在删除数据库),则将使用template1
。
dropdb
连接到postgres
,而不连接到将要删除的数据库,这就是在这种情况下它起作用的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.