【问题标题】:Sequence does not exist when it does - Postgres/Spring Boot序列不存在 - Postgres/Spring Boot
【发布时间】:2017-12-11 06:56:27
【问题描述】:

我正在编写一个 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

这是什么意思?我错过了什么吗?任何帮助/见解表示赞赏。

【问题讨论】:

    标签: postgresql hibernate spring-data database-sequence


    【解决方案1】:

    这是洞察力。

    ERROR: sequence "user_id_seq" does not exist
    

    这意味着您的序列要么不存在于数据库中要么用户无权访问它。

    解决方案:

    1. 通过命令\ds检查数据库中的user_id_seq
    2. 将序列访问权限授予特定用户。
      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'
        

        没有。

        【讨论】:

          猜你喜欢
          • 2016-05-01
          • 2021-09-03
          • 2018-10-19
          • 2022-10-21
          • 2018-12-19
          • 1970-01-01
          • 1970-01-01
          • 2016-10-29
          相关资源
          最近更新 更多