如何禁用 Postgres 中的 PK 更改?
How to disable PK changes in Postgres?
如何禁用数据库中的 PK 更改?可能吗?
例如,我有这个 table:
user
id name email password ...
1 Alex ... ...
2 Mark ... ...
如何禁用更改user.id的可能性?
您可以使用数据库引用机制。创建一个引用您要保护的列的虚拟 table,并撤销其他用户对此 table 的访问权限。示例:
create table users(
id int primary key,
name text);
insert into users values
(1, 'John');
create table users_restrict(
id int references users);
insert into users_restrict
values (1);
引用的默认模式是限制删除或更新:
update users set
id = 2
where id = 1;
ERROR: update or delete on table "users" violates foreign key constraint "users_restrict_id_fkey" on table "users_restrict"
DETAIL: Key (id)=(1) is still referenced from table "users_restrict".
或者,您可以定义一个触发器来放弃您不想要的修改,例如
create or replace function protect_users_id()
returns trigger language plpgsql as $$
begin
if old.id <> new.id then
raise exception 'Cannot change users.id';
end if;
end $$;
create trigger protect_users_id
before update on users
for each row execute procedure protect_users_id();
中测试
如何禁用数据库中的 PK 更改?可能吗?
例如,我有这个 table:
user
id name email password ...
1 Alex ... ...
2 Mark ... ...
如何禁用更改user.id的可能性?
您可以使用数据库引用机制。创建一个引用您要保护的列的虚拟 table,并撤销其他用户对此 table 的访问权限。示例:
create table users(
id int primary key,
name text);
insert into users values
(1, 'John');
create table users_restrict(
id int references users);
insert into users_restrict
values (1);
引用的默认模式是限制删除或更新:
update users set
id = 2
where id = 1;
ERROR: update or delete on table "users" violates foreign key constraint "users_restrict_id_fkey" on table "users_restrict"
DETAIL: Key (id)=(1) is still referenced from table "users_restrict".
或者,您可以定义一个触发器来放弃您不想要的修改,例如
create or replace function protect_users_id()
returns trigger language plpgsql as $$
begin
if old.id <> new.id then
raise exception 'Cannot change users.id';
end if;
end $$;
create trigger protect_users_id
before update on users
for each row execute procedure protect_users_id();
中测试