Как заставить значение по умолчанию столбца в PostgreSQL? - PullRequest
1 голос
/ 17 октября 2011

Есть ли практический способ , кроме триггеров , чтобы игнорировать заданные значения в пользу значений по умолчанию во время INSERT / UPDATE?

Это поведение, которое я хочу заархивировать:

CREATE TABLE foo (id serial, data text);

INSERT INTO foo (data) VALUES('bar1');
INSERT INTO foo (id, data) VALUES(50, 'bar2');
INSERT INTO foo (id, data) VALUES(-34, 'bar3');
INSERT INTO foo (id, data) VALUES(80.34, 'bar4');
INSERT INTO foo (id, data) VALUES('foo5', 'bar5');
INSERT INTO foo (data) VALUES('bar6');

UPDATE foo SET id=200, data='BARn' WHERE íd=6;

SELECT * FROM foo;

+----+------+
| id | data |
+----+------+
|  1 | bar1 |
|  2 | bar2 |
|  3 | bar3 |
|  4 | bar4 |
|  5 | bar5 |
|  6 | BARn |
+----+------+

Спасибо!

Ответы [ 3 ]

1 голос
/ 18 октября 2011

Вы действительно не должны этого делать.

Вы должны программировать таким образом, чтобы ваш код не вел себя странно. После того, как вы что-то вставили в базу данных, эти данные должны быть вставлены или возникла ошибка.

Вы можете принудительно установить, что serial всегда будет соответствовать:

  • с использованием триггера после вставки, который проверяет, если NEW.id=curval('foo_id_seq'), и триггера после обновления, который проверяет, если NEW.id=OLD.id, и выдает ошибку, если эта проверка не удалась, но вы исключили триггеры по какой-то странной причине;
  • отключение доступа на запись в эту таблицу для пользователей, отличных от суперпользователя, и создание функции для вставки данных:
    create function insert_to_foo(text) returns void as
    $$ insert into foo(data) values ($1); $$
    language sql volatile security definer
    set search_path = public, pg_temp;
1 голос
/ 17 октября 2011

Не совсем.Спусковой крючок - способ пойти сюда.

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

0 голосов
/ 07 июля 2019

Существует способ отклонить определенные столбцы, отправленные пользователем, если это поможет.Как показано ниже,

revoke insert, update on table foo from public;
grant insert (data), update (data) on table foo to public;

Как показано, первый revoke должен быть на всей таблице.Если вы просто попробуете revoke insert (id) ....., это будет заменено существующими более полными грантами на столе.Таким образом, он выполняет эти два указанных шага.

Имейте в виду, что отправка запрещенного столбца приведет к ошибке.

...