powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Ошибка в триггере
8 сообщений из 8, страница 1 из 1
Ошибка в триггере
    #34288559
Возможно проблема очень банальная, но решить ее пока не получается :(.
Вопрос вот в чем - есть триггерная функция следующего содержания:

CREATE OR REPLACE FUNCTION changes_audit() RETURNS "trigger" AS
$BODY$
BEGIN
IF (TG_OP = 'DELETE') THEN
INSERT INTO _backup_data SELECT OLD.id, TG_RELNAME, 'd', now();
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO _backup_data SELECT NEW.id, TG_RELNAME, 'u', now();
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO _backup_data SELECT NEW.id, TG_RELNAME, 'i', now();
RETURN NEW;
END IF;
RETURN NULL; -- result is ignored since this is an AFTER trigger
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

И есть вот такой триггер на таблицу show_type

CREATE TRIGGER show_type_audit_trig
BEFORE INSERT OR UPDATE OR DELETE
ON show_type
FOR EACH ROW
EXECUTE PROCEDURE changes_audit();

На тестовом сервере (8.1.4, Windows XP) триггер прекрасно работат, все изменения пишутся в _backup_data.
на рабочем сервере (7.3.2, юникс), при попытке выполнить, например,
update show_type (id, name) values (999,999); сервер возвращает ошибку
-------------
SQL error:
ERROR: parse error at or near "IF"
In statement:
insert into show_type (id,name) values (999,999);
-------------

Если отключить триггер, то естественно все операции по вставке или изменению таблицы проходят нормально.

Перерыл доки, никакой разницы между между объявлениями триггерных функций в указанных версиях серевров не увидел. Но похоже, гдето она таки есть. Помогите плз, если кто в курсе - буду очень благодарен за помощь.
...
Рейтинг: 0 / 0
Ошибка в триггере
    #34288766
bimike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
попробуй перечислить поля таблицы _backup_data в которые ты хочешь записать данные и забрать ключевое слово SELECT
...
Рейтинг: 0 / 0
Ошибка в триггере
    #34288815
попробовал... содержимое функции стало вот такое.
IF TG_OP = 'DELETE' THEN
INSERT INTO _backup_data (src_table_id, src_table, "operation", chg_date_time) values (OLD.id, TG_RELNAME, 'd', now());
RETURN OLD;
ELSIF TG_OP = 'UPDATE' THEN
INSERT INTO _backup_data (src_table_id, src_table, "operation", chg_date_time) values (NEW.id, TG_RELNAME, 'u', now());
RETURN NEW;
ELSIF TG_OP = 'INSERT' THEN
INSERT INTO _backup_data (src_table_id, src_table, "operation", chg_date_time) values (NEW.id, TG_RELNAME, 'i', now());
RETURN NEW;
END IF;
RETURN NULL;

ошибка не исчезла :(.
SQL error:
ERROR: parse error at or near "IF"
In statement:
insert into "show_type" ("id", "name", "logo_img") values (999,'999','999');
...
Рейтинг: 0 / 0
Ошибка в триггере
    #34288902
СергейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Евгений СемионовВозможно проблема очень банальная, но решить ее пока не получается :(.

Перерыл доки, никакой разницы между между объявлениями триггерных функций в указанных версиях серевров не увидел. Но похоже, гдето она таки есть. Помогите плз, если кто в курсе - буду очень благодарен за помощь.

A vy quotirovanie-to peredelalili s $BODY$ na prostye odinarnye kavychki ?
Ved' v PG <8.0 mojno tolko tak quotirovat'.
...
Рейтинг: 0 / 0
Ошибка в триггере
    #34290601
Mike White
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А может у тебя RULE на таблицу show_type стоит?..
...
Рейтинг: 0 / 0
Ошибка в триггере
    #34290611
Mike White
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mike WhiteА может у тебя RULE на таблицу show_type стоит?..

сори.... на таблицу _backup_data
...
Рейтинг: 0 / 0
Ошибка в триггере
    #34291426
2 Mike White
Не, RULE на таблицах у меня нет.
Но совет с кавычками помог. вот такое объявление функции решило проблему

CREATE OR REPLACE FUNCTION changes_audit() RETURNS "trigger"
AS '
BEGIN
IF TG_OP = ''DELETE'' THEN
INSERT INTO _backup_data (src_table_id, src_table, operation, chg_date_time) values (OLD.id, TG_RELNAME, ''d'', now());
RETURN OLD;
ELSIF TG_OP = ''UPDATE'' THEN
INSERT INTO _backup_data (src_table_id, src_table, operation, chg_date_time) values (NEW.id, TG_RELNAME, ''u'', now());
RETURN NEW;
ELSIF TG_OP = ''INSERT'' THEN
INSERT INTO _backup_data (src_table_id, src_table, operation, chg_date_time) values (NEW.id, TG_RELNAME, ''i'', now());
RETURN NEW;
END IF;
RETURN NULL; -- result is ignored since this is an AFTER trigger
END;
'
LANGUAGE plpgsql;

каюсь - про кавычки не знал :(. большое спасибо за помощь!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Ошибка в триггере
    #35417682
Shagrat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все это можно но я не пойму почему просто

Код: plaintext
NEW.modify = now();

нельзя поставить, при этом все условия и так выполняется. Данные передаваемые запросом, должны заполниться всеравно после AFTER.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Ошибка в триггере
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]