Как отключить изменения PK в моей базе данных? Является ли это возможным?
Например, у меня есть эта таблица:
user
id name email password ...
1 Alex ... ...
2 Mark ... ...
Как отключить возможность смены user.id?
🤔 А знаете ли вы, что...
PostgreSQL предоставляет механизмы полнотекстового поиска и поиска с использованием индексов.
Вы можете использовать механизм ссылок на базу данных. Создайте фиктивную таблицу, которая ссылается на столбец, который вы хотите защитить, и отмените привилегию доступа к этой таблице для других пользователей. Пример:
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();
Проверьте это в дб <> рабочий пример.