Postgresql 序列存在时不存在-Postgres/Spring引导
我正在编写一个SpringBootWeb应用程序,并使用PostgresDB来持久化我的数据。我使用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 {
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)
确保您的搜索路径设置为序列所属的架构。即使有问题的表符合架构要求,也必须适当设置搜索路径。希望此见解对您有所帮助。如果此答案对您有帮助,请向上投票或至少将其标记为答案。谢谢。如果您愿意,我们可以在评论部分讨论更多内容。