Сохранить поведение по умолчанию, когда новый триггер вставлен SQL - PullRequest
0 голосов
/ 12 декабря 2018

Допустим, у меня есть ограничения на столе.Когда я пытаюсь вставить туда что-то, что не имеет правильных данных, я получаю сообщение об ошибке в консоли, в котором говорится, что эта и эта микросхема были нарушены.

ERROR:  null value in column "column" violates not-null constraint
DETAIL:  Failing row contains (0, null, null, null, null).

Теперь, если я добавлю это:

CREATE OR REPLACE FUNCTION trigger_function()
  RETURNS trigger AS $BODY$
    BEGIN
     raise notice 'test';
     return null;
    END;
  $BODY$ LANGUAGE plpgsql;


create trigger test_trigger
  before update or insert
  on tablename
  for each row
  execute procedure trigger_function();

И выполню то же самое, что и раньше, вместо этого я получу это:

NOTICE:  test
INSERT 0 0

Я знаю, что этотриггер не очень полезен, но я все еще изучаю, как они работают.

Можно ли сохранить предыдущие сообщения об ошибках и добавить после них все, что я сделал в функции trigger_function?Почему он заменяет все сообщения по умолчанию?

1 Ответ

0 голосов
/ 12 декабря 2018

Цитата из руководства

Сработали триггеры уровня строки ДО того, как можно вернуть ноль , чтобы подать сигнал менеджеру триггера , чтобы пропустить остальныеоперация для этой строки (т. е. последующие триггеры не запускаются, и INSERT / UPDATE / DELETE не выполняется для этой строки)

(выделено мной)

Поскольку ваш триггер возвращает NULL, insert фактически никогда не выполняется, и поэтому никакие ограничения не могут быть нарушены.

Вывод в консоли psql

INSERT 0 0

сообщает, что ни одна строка не была вставлена.Второе значение - количество вставленных строк.


Если вы хотите, чтобы триггер "ничего не делал", вам нужно использовать return new

CREATE OR REPLACE FUNCTION trigger_function()
  RETURNS trigger 
AS $BODY$
BEGIN
  raise notice 'test';
  return new; --<< here
END;
$BODY$ LANGUAGE plpgsql;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...