2017-07-10 58 views
1

在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 
+0

如果你不想改变'id'的值,那你为什么要运行'update'? –

+0

我需要是唯一的列和标识列是静态的,这意味着插入后列不能改变。 – Manojkumar

回答

1

可以在表撤销更新,并授予它列(S):

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; 

方法是创建触发器,它会检查是否老了!=新的,但提供的细节我不认为需要它。