如何在PostgreSQL中将表设为只读

时间:2018-07-16 17:20:18

标签: sql postgresql constraints

我需要防止应用程序核心表中的意外更改。我不希望任何人在应用程序运行期间更改行,但是,我将在部署新版本的应用程序期间进行更改。例如:

create table procedure (
  id int primary key not null,
  name varchar(50) not null
);

insert into procedure (id, name) values (1, 'Send Exam Request');
insert into procedure (id, name) values (2, 'Confirm Exam Data');
insert into procedure (id, name) values (3, 'Close Visit');

-- Now, make the table read-only.

太好了,该应用程序的第一个版本现已在生产中运行良好。

下个月部署该应用程序的下一版本时:

-- Make the table read-write.

insert into procedure (id, name) values (4, 'Request Visit'); -- new proc
delete from procedure where id = 2; -- remove old unsupported proc

-- Now, make the table read-only again.

理想情况下,如果有人在应用程序的正常运行期间尝试更改错误消息,则显示错误消息将非常有用。像这样:

insert into procedure (id, name) values (5, 'New bad procedure');
ERROR: Cannot modify table procedure. 
Contact the system administrator if you want to make this change.

任何想法使这种情况发生的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

创建引发错误的触发器:

create function do_not_change()
  returns trigger
as
$$
begin
  raise exception 'Cannot modify table procedure. 
Contact the system administrator if you want to make this change.';
end;
$$
language plpgsql;

create trigger no_change_trigger
  before insert or update or delete on "procedure"
  execute procedure do_not_change();

请注意,procedure是一个关键字。您应该避免使用该名称的表。


更好的选择是将创建表的DB用户和修改表的用户分开。创建者应该是所有者,并且仅向“修改”用户授予必要的特权:对所有常规表执行select,insert,update,delete,仅对procedure表进行select。但是,这将需要对部署脚本进行一些更改,但这绝对是更安全的选择(特别是如果只有少数人知道“创建者”密码的话)

答案 1 :(得分:1)

这是访问控制的用途。将有关表的插入特权(或更好的是,对表的视图)限制为某些用户(也许只有您自己)。如果其他用户尝试插入到表中,则会收到“权限不足”错误消息。它也适用于更新和删除。然后查询。