序列不存在 - Postgres/Spring Boot
Posted
技术标签:
【中文标题】序列不存在 - Postgres/Spring Boot【英文标题】:Sequence does not exist when it does - Postgres/Spring Boot 【发布时间】:2017-07-07 05:09:33 【问题描述】:我正在编写一个 Spring Boot 网络应用程序并使用 Postgres 数据库来保存我的数据。我在 Postgres 中使用create table user (id bigserial primary key not null, name text not null;
创建了一个表,并通过查看架构来识别它的sequence_name
(在本例中为user_id_seq
)。然后,在 Spring Boot 的 User
实体类中,我添加了以下内容:
@Entity
@Table(name = "user")
public class User implements Serializable
@Id
@SequenceGenerator(name = "user_local_seq", sequenceName = "user_id_seq", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_local_seq")
private Long id;
...
确保sequenceName
与我之前看到的相符。现在,当我启动我的 Spring Boot 应用程序时,我能够成功启动它,但在跟踪中出现以下“错误”:
main] org.hibernate.tool.hbm2ddl.SchemaExport : ERROR: sequence "user_id_seq" does not exist
我杀死了应用程序并再次启动它,这一次,我得到了:
main] org.hibernate.tool.hbm2ddl.SchemaExport : HHH000389: Unsuccessful: drop sequence user_id_seq
main] org.hibernate.tool.hbm2ddl.SchemaExport : ERROR: sequence "user_id_seq" does not exist
这是什么意思?我错过了什么吗?任何帮助/见解表示赞赏。
【问题讨论】:
【参考方案1】:这是洞察力。
ERROR: sequence "user_id_seq" does not exist
这意味着您的序列要么不存在于数据库中或用户无权访问它。
解决方案:
-
通过命令
\ds
检查数据库中的user_id_seq
将序列访问权限授予特定用户。GRANT ALL ON SCHEMA schema_name TO user_name 中的所有序列;
【讨论】:
希望这篇见解对您有所帮助。如果这个答案对你有帮助。请投票或至少标记为答案。谢谢你。如果您愿意,我们可以在评论部分进行更多讨论。【参考方案2】:将特定于数据库的转义字符(postgres 中的 ")放在序列名称的名称周围。
序列的名称已被驱动程序更改。有时会发生这种情况,因为驱动程序认为 db-server 不区分大小写,但 db-server 区分大小写。
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TEACHER")
@SequenceGenerator(name = "TEACHER", sequenceName = "\"Teahcer_pkey\"")
@Column(name = "id", nullable = false)
【讨论】:
【参考方案3】:确保您的 search_path 设置为序列所属的架构。即使有问题的表是模式限定的,也必须适当地设置 search_path。
【讨论】:
【参考方案4】:在 Spring Boot 抽象出的后端进行猜测,但我在使用可能有用的 postgresql 9.6 时发现了一个类似的问题,同样的错误。当我的表被重建(DROP 然后用相同的序列名称创建)时,has_sequence_privilege(name,text,text) 可能无法识别序列的 pg_class.relname。
使用 pg_class.oid 为我解决了这个问题。
澄清一下:
SELECT has_sequence_privilege('my_role_name',c.relname,'USAGE')
FROM pg_namespace n
JOIN pg_class c
ON c.relnamespace = n.oid
WHERE c.relnamespace = n.oid AND c.relkind = 'S'::"char"
AND n.nspname = 'my_schema_name'
在重建表时抛出错误,而
SELECT has_sequence_privilege('my_role_name',c.oid,'USAGE')
FROM pg_namespace n
JOIN pg_class c
ON c.relnamespace = n.oid
WHERE c.relnamespace = n.oid AND c.relkind = 'S'::"char"
AND n.nspname = 'my_schema_name'
没有。
【讨论】:
以上是关于序列不存在 - Postgres/Spring Boot的主要内容,如果未能解决你的问题,请参考以下文章
BZOJ4032: [HEOI2015]最短不公共子串(LibreOJ #2123)
Postgres - Spring Data JPA - 自动生成数据库和表
Docker Compose (TOMCAT + POSTGRES) - Spring Boot 应用程序:容器之间的连接问题