Denying update permissions is the way to go, example:CREATE TABLE a(a INT NOT NULL, b CHAR(1) NOT NULL)GRANT INSERT,SELECT,DELETE ON a TO PUBLICDENY UPDATE ON a(b) TO PUBLICGRANT UPDATE ON a(a) TO PUBLICSETUSER 'guest' -- remove or comment out this line to test dbo/sysadminINSERT a VALUES(1,'A') -- succeeds regardless of loginSELECT * FROM a -- succeeds regardless of loginUPDATE a SET a=2 -- succeeds regardless of loginUPDATE a SET b='B' -- fails for guest, succeeds for dbo or sysadminDELETE a -- succeeds regardless of loginSELECT * FROM a -- succeeds regardless of loginDROP TABLE a -- clean up
If you DENY permission on a specific column you have to ensure your GRANT that permission on the other columns, otherwise other columns will be DENY'd (at least in my brief testing)You can also DENY or GRANT permissions to specific logins, rather than public.