powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как запретить update значения но разрешать insert?
7 сообщений из 7, страница 1 из 1
Как запретить update значения но разрешать insert?
    #40028111
JMLabs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите пожалуйста решить задачу.
Мне нужно в таблице PostgreSQL запретить обновление имеющихся значений столбца, но при этом оставить возможность вставки новых строк. Иными словами, если один раз значение записано, то менять его уже нельзя. Какие механизмы для этого есть?
...
Рейтинг: 0 / 0
Как запретить update значения но разрешать insert?
    #40028118
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JMLabs
Помогите пожалуйста решить задачу.
Мне нужно в таблице PostgreSQL запретить обновление имеющихся значений столбца, но при этом оставить возможность вставки новых строк. Иными словами, если один раз значение записано, то менять его уже нельзя. Какие механизмы для этого есть?


1)через права на колонки
2)через триггера

у обоих вариантов свои плюсы и минусы.


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Как запретить update значения но разрешать insert?
    #40028119
JMLabs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk, спасибо! Думаю что через права на колонку для меня не подойдет, т.к. приложение подключено к БД через логин имеющий все права на БД. А вот триггеры я ни разу не делал, прочитал тут https://stackoverflow.com/questions/56082230/postgres-trigger-to-avoid-update-in-a-column похожую ситуацию, но не понимаю как работает тот кусок кода. Я понимаю что при наступлении события UPDATE выполняется функция, но ведь NEW и OLD это ведь переменные которые как-то должны быть определены, где это?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE OR REPLACE FUNCTION stop_change_on_auxId()
  RETURNS trigger AS
$BODY$
BEGIN
  -- always reset the auxId to the value already stored
  NEW.auxId := OLD.auxId;
  RETURN NEW;
END;
$BODY$


CREATE TRIGGER avoid_auxid_changes
  BEFORE UPDATE
  ON product
  FOR EACH ROW
  EXECUTE PROCEDURE stop_change_on_auxId();
...
Рейтинг: 0 / 0
Как запретить update значения но разрешать insert?
    #40028124
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JMLabs
Maxim Boguk, спасибо! Думаю что через права на колонку для меня не подойдет, т.к. приложение подключено к БД через логин имеющий все права на БД. А вот триггеры я ни разу не делал, прочитал тут https://stackoverflow.com/questions/56082230/postgres-trigger-to-avoid-update-in-a-column похожую ситуацию, но не понимаю как работает тот кусок кода. Я понимаю что при наступлении события UPDATE выполняется функция, но ведь NEW и OLD это ведь переменные которые как-то должны быть определены, где это?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE OR REPLACE FUNCTION stop_change_on_auxId()
  RETURNS trigger AS
$BODY$
BEGIN
  -- always reset the auxId to the value already stored
  NEW.auxId := OLD.auxId;
  RETURN NEW;
END;
$BODY$


CREATE TRIGGER avoid_auxid_changes
  BEFORE UPDATE
  ON product
  FOR EACH ROW
  EXECUTE PROCEDURE stop_change_on_auxId();



Рекомендую все таки почитать официальную документацию начиная с https://www.postgresql.org/docs/13/plpgsql-trigger.html
А не лезть в stackoverlfow и брать оттуда куски которые вы не понимаете.

ps: " т.к. приложение подключено к БД через логин имеющий все права на БД." - а вот так вот не надо (это плохая практика)... но если этот логин у вас все таки (как я надеюсь) не superuser то даже у него можно забрать права на update колонки.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Как запретить update значения но разрешать insert?
    #40028177
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JMLabs
Мне нужно в таблице PostgreSQL запретить обновление имеющихся значений столбца, но при этом оставить возможность вставки новых строк. Иными словами, если один раз значение записано, то менять его уже нельзя.

в самом приложении права раздать?
так то UPDATE - это SELECT + DELETE + INSERT
так что ещё и DELETE надо запретить

ещё, как вариант, есть EVENT SOURCING (ES), там есть только INSERT
...
Рейтинг: 0 / 0
Как запретить update значения но разрешать insert?
    #40028790
JMLabs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk, спасибо з ссылку, разобрался и сделал триггер, решение со stackoverlfow рабочее.
tip78, про такой способ тоже узнал, спасибо!
...
Рейтинг: 0 / 0
Как запретить update значения но разрешать insert?
    #40030106
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JMLabs,
В не слишком старых версиях PostgrSQL есть команда "UPSERT", то есть INSERT с модификатором ON CONFLICT.
В вашем случае подойдёт INSERT ... ON CONFLICT DO NOTHING
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как запретить update значения но разрешать insert?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]