Postgresql 序列存在时不存在-Postgres/Spring引导

Postgresql 序列存在时不存在-Postgres/Spring引导,postgresql,hibernate,spring-data,database-sequence,Postgresql,Hibernate,Spring Data,Database Sequence,我正在编写一个SpringBootWeb应用程序,并使用PostgresDB来持久化我的数据。我使用create table user(id bigserial primary key not null,name text not null;在Postgres中创建了一个表,并通过查看模式(在本例中,它是user id_seq)来识别它的序列名称 @Entity @Table(name = "user") public class User implements Serializable {

我正在编写一个SpringBootWeb应用程序,并使用PostgresDB来持久化我的数据。我使用
create table user(id bigserial primary key not null,name text not null;
在Postgres中创建了一个表,并通过查看模式(在本例中,它是
user id_seq
)来识别它的
序列名称

@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
这意味着什么?我遗漏了什么吗?非常感谢您的帮助/见解。

这是见解

ERROR: sequence "user_id_seq" does not exist
这意味着数据库中不存在您的序列,或者用户没有访问该序列的权限

解决方案:

  • 通过命令
    \ds
  • 向特定用户授予序列访问权限。
    将SCHEMA\u name中所有序列的ALL-ON-ALL授予user\u name;

  • 猜测spring boot抽象掉的后端,但我在使用postgresql 9.6时发现了一个类似的问题,该错误可能很有用。当我的表被重建(删除,然后使用相同的序列名创建)时,具有_序列_权限(名称、文本、文本)可能无法识别序列的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中”)

    驱动程序已更改序列的名称。有时会发生这种情况,因为驱动程序认为db服务器不区分大小写,但db服务器区分大小写

      @Id
      @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TEACHER")
      @SequenceGenerator(name = "TEACHER",  sequenceName = "\"Teahcer_pkey\"")
      @Column(name = "id", nullable = false)
    

    确保您的搜索路径设置为序列所属的架构。即使有问题的表符合架构要求,也必须适当设置搜索路径。

    希望此见解对您有所帮助。如果此答案对您有帮助,请向上投票或至少将其标记为答案。谢谢。如果您愿意,我们可以在评论部分讨论更多内容。