【问题标题】:postgresql - Drop schema says schema does not existpostgresql - 删除模式说模式不存在
【发布时间】:2018-10-31 23:58:08
【问题描述】:

我想删除一个用户,我收到了这条消息。

postgres=# drop user user1;
ERROR:  role "user1" cannot be dropped because some objects depend on it
DETAIL:  owner of schema schema1
postgres=# 

所以,我尝试删除架构并收到以下消息:

postgres=# drop schema schema1 cascade;
ERROR:  schema "schema1" does not exist

但是,架构存在!

postgres=# \dn
     List of schemas
     Name      |  Owner   
---------------+----------
 schema1       | user1
 public        | postgres
(2 rows)

【问题讨论】:

  • 您是否使用同一用户运行以上所有操作?..
  • 用户、数据库和架构是使用sudo -u postgres psql -f ddl.sql创建的。
  • 否 - 未创建。您发布的代码 - 都使用 postgres 用户运行?..
  • 是的。我试过\c db user1 并收到“对等身份验证失败”消息。我将 hba.conf 文件的方法值更改为 md5 但是,我无法让它工作。

标签: postgresql database-design schema


【解决方案1】:

假设您在同一个数据库中执行这两个命令,最可能的解释是“schema1”并不是您认为的那样。后面会有一个空格之类的。

试试下面的方法看看有没有什么奇怪的地方。

SELECT ':' || nspname || ':' FROM pg_namespace;

编辑:来自海报的更正信息

您的查询结果与原始名称没有任何不同。我以大写形式创建了模式名称,并在 \dn

的输出中以大写形式显示

但这不是你展示的,是吗?

postgres=# \dn List of schemas Name | Owner
---------------+---------- schema1 | user1 public | postgres (2 rows)

所以 - 如果它实际上是大写的,这意味着您在创建时通过双引号将其强制为大写。

PostgreSQL 通常会将标识符折叠为小写(SQL 标识符通常应该不区分大小写)

因此,如果您在创建时将其强制为大写,您也需要强制将其删除。

DROP SCHEMA "SCHEMA1" CASCADE;

【讨论】:

  • 您的查询结果与原始名称没有任何不同。我以大写形式创建了模式名称,并在\dn 的输出中以大写形式显示。但是,这似乎不会影响DROP SCHEMA
猜你喜欢
  • 2018-03-25
  • 1970-01-01
  • 2020-02-03
  • 2016-07-05
  • 2015-12-25
  • 2020-08-08
  • 2015-10-03
  • 1970-01-01
  • 2017-09-14
相关资源
最近更新 更多