序列不存在 - 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的主要内容,如果未能解决你的问题,请参考以下文章

1259:例9.3求最长不下降序列

不同命名空间的对象二进制反序列化问题

动态规划程序设计

BZOJ4032: [HEOI2015]最短不公共子串(LibreOJ #2123)

Postgres - Spring Data JPA - 自动生成数据库和表

Docker Compose (TOMCAT + POSTGRES) - Spring Boot 应用程序:容器之间的连接问题