阻止更新生成的主键列

时间:2017-07-10 06:16:52

标签: postgresql

在PostgreSQL中,我创建了一个表,并将id列定义为serial。我插入了两行,但我仍然可以更新id列的值。

但我需要阻止更新id列的生成值。

create table aas.apa_testtable
(
    id serial primary key,
    name text
)

insert into aas.apa_testtable(name) select ('test')
insert into aas.apa_testtable(name) select ('test2')


update aas.apa_testtable set id=3 where id=2

1 个答案:

答案 0 :(得分:1)

您可以撤消对表的更新并将其授予列:

REVOKE UPDATE ON TABLE aas.apa_testtable FROM some_role;
GRANT UPDATE (name) ON TABLE aas.apa_testtable TO some_role;

请记住您在设置中可能遇到的角色public,超级用户和其他继承问题。

--Do not try this, it will not work without revoking table level privileges:
REVOKE UPDATE (id) ON TABLE aas.apa_testtable FROM some_role;

替代方法是创建触发器,检查是否旧!=新,但提供详细信息我不认为需要它。