Как отключить изменения PK в Postgres?

Как отключить изменения PK в моей базе данных? Является ли это возможным?

Например, у меня есть эта таблица:

user
id name email password ...
1  Alex ...   ...
2  Mark ...   ...

Как отключить возможность смены user.id?

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
18
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать механизм ссылок на базу данных. Создайте фиктивную таблицу, которая ссылается на столбец, который вы хотите защитить, и отмените привилегию доступа к этой таблице для других пользователей. Пример:

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();

Проверьте это в дб <> рабочий пример.

Классный трюк, ТИЛ. Хотя, по-видимому, вам нужно обновлять вторую таблицу любыми вставками в users, верно? Любые строки, которые вставляются в users без вставки соответствующего users_restrict, не будут защищены — и вставка в users не ограничена; поэтому любые строки, вставленные объектами, у которых нет разрешений для users_restrict, будут доступны для изменения.

Amadan 17.05.2022 04:04

Именно, это решение требует дополнительной обработки вновь вставленных строк. С другой стороны, это дает вам возможность выбирать строки для защиты.

klin 17.05.2022 04:15

Другие вопросы по теме