Postgresql игнорирует условие «когда» в триггере - PullRequest
1 голос
/ 01 мая 2019

Триггер, кажется, игнорирует условие «когда» в моем определении, но я не уверен почему.Я запускаю следующее:

create trigger trigger_update_candidate_location
after update on candidates
for each row
when (
  OLD.address1 is distinct from NEW.address1
  or
  OLD.address2 is distinct from NEW.address2
  or
  OLD.city is distinct from NEW.city
  or
  OLD.state is distinct from NEW.state
  or
  OLD.zip is distinct from NEW.zip
  or
  OLD.country is distinct from NEW.country

)
execute procedure entities.tf_update_candidate_location();

Но когда я проверяю его, я получаю следующее:

-- auto-generated definition
create trigger trigger_update_candidate_location
  after update
  on candidates
  for each row
execute procedure tf_update_candidate_location();

Это проблематично, потому что процедура, которую я вызываю, в конечном итоге делаетобновление одной и той же таблицы для разных столбцов (широта / долгота).Так как условие 'когда' игнорируется, это создает бесконечный цикл.

Мое намерение состоит в том, чтобы следить за изменением адреса, выполнить поиск в другой таблице, чтобы получить значения lat / lng.

Версия Postgresql: 10.6 IDE: DataGrip 2018.1.3

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

К сожалению, это проблема DataGrip.Пожалуйста, следуйте за билетом, чтобы получать уведомления, когда он исправлен.https://youtrack.jetbrains.com/issue/DBE-7247

0 голосов
/ 01 мая 2019

Как именно вы создаете и «возвращаетесь»?С помощью datagrip?

Условие WHEN было добавлено в Postgres 9.0.Некоторые старые (или плохие) клиенты могут быть устаревшими.Чтобы быть уверенным, проверьте в pgsql:

SELECT pg_get_triggerdef(oid, true)
FROM   pg_trigger
WHERE  tgrelid = 'candidates'::regclass  -- schema-qualify name to be sure
AND    NOT tgisinternal;

Любая фактическая WHEN квалификация хранится во внутреннем формате в pg_trigger.tgqual, кстати.Подробности в руководстве здесь .

Также каков ваш текущий search_path и какова схема таблицы candidates?

Выделяется, что таблица candidatesявляется неквалифицированным, в то время как триггерная функция entities.tf_update_candidate_location() имеет квалификацию схемы ... Вы не путаете таблицы с одним и тем же именем в разных схемах БД, не так ли?эквивалентный синтаксис:

create trigger trigger_update_candidate_location
after update on candidates   -- schema-qualify??
for each row
when (
   (OLD.address1, OLD.address2, OLD.city, OLD.state, OLD.zip, OLD.country)
   IS DISTINCT FROM
   (NEW.address1, NEW.address2, NEW.city, NEW.state, NEW.zip, NEW.country)
   )
execute procedure entities.tf_update_candidate_location();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...