我需要防止应用程序核心表中的意外更改。我不希望任何人在应用程序运行期间更改行,但是,我将在部署新版本的应用程序期间进行更改。例如:
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.
任何想法使这种情况发生的最佳方法是什么?
答案 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)
这是访问控制的用途。将有关表的插入特权(或更好的是,对表的视图)限制为某些用户(也许只有您自己)。如果其他用户尝试插入到表中,则会收到“权限不足”错误消息。它也适用于更新和删除。然后查询。