我想更新RDS Postgres 11中的表的序列。尝试了以下命令,但我没有看到提交到数据库的更改。我甚至使用了commit。我错过了什么?第一个select currval('table1_id_seq')会传回6。
commit
select currval('table1_id_seq')
6
o7jaxewo1#
如果你...我看不到提交到数据库的更改...即使您确实提交了事务(并且您连接到了正确的数据库),我也只能看到两种可能的解释。1.找错人了在您的问题中,public.table1在CREATE TABLE语句中是模式限定的,但在以下任一语句中都不是:
public.table1
CREATE TABLE
SELECT setval(pg_get_serial_sequence('table1', 'id'), ... SELECT setval('table1_id_seq', ...
如果在search_path中的'public'之前的另一个模式中有另一个table1,则最终将修改该表的相应序列。由于Postgres中的出厂默认值是search_path = "$user",public,因此很明显,可疑的是当前角色的“home”模式中存在同名的表。
search_path
table1
search_path = "$user",public
修复搜索路径或模式限定表和序列名。
假设您的数据库角色对table1具有SELECT(甚至所有)权限应该是安全的。但是,您需要对底层SEQUENCE具有单独的附加权限,才能在其上运行setval()。但是,您应该会看到缺少权限的错误消息!请参阅:
SELECT
SEQUENCE
setval()
GRANT USAGE ON SEQUENCE table1_id_seq TO the_role; -- your role here
或者使用IDENTITY列而不是serial(Postgres 10+),它隐式继承表的权限。请参见:
IDENTITY
serial
1条答案
按热度按时间o7jaxewo1#
如果你...
我看不到提交到数据库的更改
...即使您确实提交了事务(并且您连接到了正确的数据库),我也只能看到两种可能的解释。
1.找错人了
在您的问题中,
public.table1
在CREATE TABLE
语句中是模式限定的,但在以下任一语句中都不是:如果在
search_path
中的'public'之前的另一个模式中有另一个table1
,则最终将修改该表的相应序列。由于Postgres中的出厂默认值是
search_path = "$user",public
,因此很明显,可疑的是当前角色的“home”模式中存在同名的表。解决方案:
修复搜索路径或模式限定表和序列名。
2.缺少权限
假设您的数据库角色对
table1
具有SELECT
(甚至所有)权限应该是安全的。但是,您需要对底层SEQUENCE
具有单独的附加权限,才能在其上运行setval()
。但是,您应该会看到缺少权限的错误消息!
请参阅:
解决方案:
或者使用
IDENTITY
列而不是serial
(Postgres 10+),它隐式继承表的权限。请参见: