powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Не работает триггер
3 сообщений из 3, страница 1 из 1
Не работает триггер
    #35560067
roman d.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!

Помогите победить триггер!

У меня Postgresql 8.3 на ХР SP2. Недавно решил перейти с Access-а.

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

Вот что получилось:

Таблица:

CREATE TABLE "public"."t_f000u" (
"IdUridObz" BIGINT DEFAULT nextval('"F000u_IdUridObz_seq"'::regclass) NOT NULL,
"DATER" TIMESTAMP(0) WITHOUT TIME ZONE,
"RRAX" VARCHAR(14),
"KEKV" DOUBLE PRECISION,
"DATEDOC" TIMESTAMP(0) WITHOUT TIME ZONE,
"NDOC" VARCHAR(16),
"DATETERM" TIMESTAMP(0) WITHOUT TIME ZONE,
"S" DOUBLE PRECISION,
"EDRPOUK" VARCHAR(14),
"ID_FU" VARCHAR(60),
"NOTE" VARCHAR(50),
"STMOU" INTEGER
) WITH OIDS;

CREATE UNIQUE INDEX "t_f000u_idx" ON "public"."t_f000u"
USING btree ("IdUridObz");

CREATE TRIGGER "t_f000u_tr" BEFORE INSERT OR UPDATE ON "public"."t_f000u" FOR EACH ROW
EXECUTE PROCEDURE "public"."fun_fu"();

CREATE OR REPLACE FUNCTION "public"."fun_fu" () RETURNS trigger AS
$body$
DECLARE

id_ur BIGINT;

BEGIN
IF (TG_OP = 'UPDATE') THEN
SELECT INTO id_ur t_f000u."IdUridObz"
FROM t_f000u
WHERE t_f000u."IdUridObz" = NEW."IdUridObz";

IF NOT FOUND THEN
RAISE EXCEPTION 'xrenovo c id_ur';
END IF;

END IF;

NEW."ID_FU" = t_f000u."DATEDOC" || t_f000u."NDOC" || t_f000u."EDRPOUK"
FROM t_f000u
WHERE t_f000u."ID_FU" = id_ur;

RETURN NEW;

END;

$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY DEFINER
COST 100;


Но, зараза почему-то не работает при вставке и работает хреново при обновлении, т.е. обновляет, но при следующим обновлением, но с предыдущими значениями.
...
Рейтинг: 0 / 0
Не работает триггер
    #35560145
Jelis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
SELECT INTO id_ur t_f000u."IdUridObz"
FROM t_f000u 
WHERE t_f000u."IdUridObz" = NEW."IdUridObz";

А что мы хотим увидеть id_ur? :-)
Сдаеться мне что это можно заменить на
Код: plaintext
id_ur := NEW."IdUridObz"

Можно, но не нужно. Потому как нужно просто этот запрос удалить и оставить
Код: plaintext
1.
NEW."ID_FU" = NEW."DATEDOC" || NEW."NDOC" || NEW."EDRPOUK";

Хотя, это не факт, учитывая, что выходит что вы делаеть по сути дела следущее
Код: plaintext
1.
2.
3.
NEW."ID_FU" = t_f000u."DATEDOC" || t_f000u."NDOC" || t_f000u."EDRPOUK" 
FROM t_f000u 
WHERE t_f000u."ID_FU" = NEW."IdUridObz";  -- тут два разнах поля?

З.Ы. У вас проблеммы со словарным запасом? Нет? Тогда от чего же не давать более осмысленные названия? ;-)
...
Рейтинг: 0 / 0
Не работает триггер
    #35560290
roman d.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо!

1. Увидел собственную тупость :

WHERE t_f000u."ID_FU" = NEW."IdUridObz"; -- тут два разнах поля? - два одинаковых - IdUridObz.

2. Как оказалось все просто - а я лез, блин, в какие-то дебри. Все заработало!

3. З запасами все ОК! Это просто когда-то под казначейскую программу делал свое на Access-e. А от них никаких описаний не добьешься. Вот и взял из их транспортных файлов.

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


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