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


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

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


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
15.12.2020, 20:22
    #40028119
JMLabs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запретить update значения но разрешать insert?
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
15.12.2020, 20:37
    #40028124
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запретить update значения но разрешать insert?
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
16.12.2020, 00:47
    #40028177
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запретить update значения но разрешать insert?
JMLabs
Мне нужно в таблице PostgreSQL запретить обновление имеющихся значений столбца, но при этом оставить возможность вставки новых строк. Иными словами, если один раз значение записано, то менять его уже нельзя.

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

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


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