放牛的

放牛的日子,是人生初恋的诗...

0%

PostgreSQL表数据禁止更新删除

公司建体验账号,不希望密码被改掉,又需要显示改密码功能,数据库用的是PostgreSQL。

于是,找到了这篇文章:PostgreSQL: 禁止表上数据更新或删除的方法:https://www.postgres.fun/20120810153010.html

该文中提到了2种方法,都是限定整张表的。而我们只想限定表中预置数据不能修改删除,于是做了以下测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
-- 建测试表
CREATE TABLE "public"."test_user" (
"id" int8 NOT NULL,
"name" varchar(255) COLLATE "pg_catalog"."default",
"password" varchar(255) COLLATE "pg_catalog"."default"
);
ALTER TABLE "public"."test_user" ADD CONSTRAINT "user_pkey" PRIMARY KEY ("id");


-- 插入预置数据
INSERT INTO "public"."test_user" VALUES (1, 'a', 'aaa');
INSERT INTO "public"."test_user" VALUES (2, 'b', 'bbb');
INSERT INTO "public"."test_user" VALUES (3, 'c', 'ccc');


-- 创建失败时执行的触发函数
CREATE OR REPLACE FUNCTION func_test_trigger()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
BEGIN
RAISE EXCEPTION 'Attention: can not update or delete table test_trigger,Please contact francs !';
END;
$function$;


-- 建触发器,根据id限定行
create trigger trigger_test_trigger_update BEFORE UPDATE ON test_user FOR EACH ROW WHEN (OLD.id in (1, 2, 3)) EXECUTE PROCEDURE func_test_trigger();
create trigger trigger_test_trigger_delete BEFORE DELETE ON test_user FOR EACH ROW WHEN (OLD.id in (1, 2, 3)) EXECUTE PROCEDURE func_test_trigger();

-- 限定行修改、删除时报错
UPDATE test_user set name = '123' where id = 1; -- 执行报错
DELETE FROM test_user WHERE id = 2; -- 执行报错

-- 可以插入新的行
INSERT INTO "public"."test_user" VALUES (4, 'd', 'ddd'); -- 成功

-- 新的行可以修改、删除
UPDATE test_user set name = '123' where id = 4; -- 成功
DELETE FROM test_user WHERE id = 4; -- 成功