Я несколько дней застрял с триггерами в Postgresql (и в Mysql тоже). Я просто хочу вставить новые заполненные строки в другую таблицу. Исходные данные поступают из внешней формы (OpenDataKit) и попадают в «промежуточные» таблицы. Я не могу понять, почему форма больше не может отправлять данные после создания триггера... Обратите внимание, что все действия работают без триггера, когда я делаю вставки вручную. Я был бы очень признателен за помощь, чтобы понять, что я делаю неправильно.
Сейчас я тестирую Postgresql 9.5, но у меня возникла аналогичная проблема с MySQL 5.1.
-- 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();
Итак, когда форма ODK вставляет новые строки в FORMULAIRE_NATOBS_REPEAT_LOC (для которых я создал серийный идентификатор для облегчения SQL-запросов), я пытаюсь вставить эту строку (в сочетании с информацией из других промежуточных таблиц) в таблицу «заместо» для первого действие триггера и в таблицу i_lieu_observation (составленную двойным первичным ключом) для второго действия. Я тестировал также с триггером, состоящим только из первого действия, но он тоже не работает. Приложение для Android, отправляющее форму, аварийно завершает работу, пока я не удалю триггер.
Заранее спасибо!
MAX(id_loc) FROM FORMULAIRE_...
вы должны использоватьnew.xxx
для проверки строки, вызвавшей срабатывание триггера. - person joop   schedule 09.08.2016