Я застрял в течение нескольких дней с триггерами на Postgresql (и Mysql также). Я просто хочу вставить вновь заполненные строки в другую таблицу. Исходные данные поступают из внешней формы (OpenDataKit) и переходят в «промежуточные» таблицы. Я не могу понять, почему форма больше не может отправлять данные после создания триггера ... Обратите внимание, что все действия работают без триггера, когда я делаю вставки вручную. Я был бы очень признателен за помощь в понимании того, что я делаю неправильно.
Теперь я тестирую Postgresql 9.5, но у меня возникла аналогичная проблема с MySQL 5.1.Postgresql Триггер для вставки строк
-- CREATE procedure:
CREATE OR REPLACE FUNCTION proc_natobs() RETURNS TRIGGER AS
$BODY$
DECLARE
BEGIN
INSERT INTO lieu (id_lieu, wgs_lat, wgs_lon, date_obs, geom)
SELECT id_loc,"GPS_TEL_LAT", "GPS_TEL_LNG", "DATE_OBS", ST_SetSRID(ST_POINT("GPS_TEL_LNG","GPS_TEL_LAT"), 4326)
FROM "FORMULAIRE_NATOBS_REPEAT_LOC", "FORMULAIRE_NATOBS_CORE"
WHERE "FORMULAIRE_NATOBS_CORE"."_URI" = "FORMULAIRE_NATOBS_REPEAT_LOC"."_TOP_LEVEL_AURI"
AND "FORMULAIRE_NATOBS_REPEAT_LOC".id_loc IN (SELECT max(id_loc) FROM "FORMULAIRE_NATOBS_REPEAT_LOC");
INSERT INTO i_lieu_observateurs (id_lieu, id_auteur)
SELECT id_loc, CAST("AUTEUR" AS integer)
FROM "FORMULAIRE_NATOBS_CORE", "FORMULAIRE_NATOBS_REPEAT_LOC"
WHERE "FORMULAIRE_NATOBS_REPEAT_LOC"."_TOP_LEVEL_AURI" = "FORMULAIRE_NATOBS_CORE"."_URI"
AND id_loc IN (SELECT max(id_loc) FROM "FORMULAIRE_NATOBS_REPEAT_LOC")
UNION
SELECT id_loc, CAST("OBSERVATEURS" AS integer)
FROM "FORMULAIRE_NATOBS_REPEAT_LOC", "FORMULAIRE_NATOBS_REPEAT_OBSERVATEUR"
WHERE "FORMULAIRE_NATOBS_REPEAT_LOC"."_TOP_LEVEL_AURI" = "FORMULAIRE_NATOBS_REPEAT_OBSERVATEUR"."_TOP_LEVEL_AURI"
AND id_loc IN (SELECT max(id_loc) FROM "FORMULAIRE_NATOBS_REPEAT_LOC")
;
END;
$BODY$
LANGUAGE 'plpgsql';
-- CREATE the trigger:
CREATE TRIGGER trigger_natobs AFTER INSERT
ON "FORMULAIRE_NATOBS_REPEAT_LOC"
FOR EACH ROW
EXECUTE PROCEDURE proc_natobs();
Итак, когда форма ОКА вставляет новые строки в FORMULAIRE_NATOBS_REPEAT_LOC (для которого я создал серийный номер для облегчения запросов SQL), я пытаюсь вставить эту строку (в сочетании с информацией из других промежуточных таблиц) в таблицу «lieu» для первого действия триггера и в таблицу i_lieu_observation (состоящую из двойного первичного ключа) для второго действия. Я тестировал также триггер, состоящий только из первого действия, но он тоже не работает. Приложение Android, которое отправляет форму, падает до тех пор, пока я не удалю триггер.
Заранее благодарим!
Вместо использования 'MAX (id_loc) FROM FORMULAIRE _...' вы должны использовать 'new.xxx' для проверки строки, которая запускает триггер. – joop
Это поможет, если вы добавите определения для всех упомянутых таблиц в вопрос. Для меня это похоже на соотношение 1: N между двумя таблицами lieu и i_lieu_observateurs. И это, безусловно, поможет, если вы использовали синтаксис JOIN. – wildplasser