Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Нужен тригер / 5 сообщений из 5, страница 1 из 1
06.03.2003, 15:18
    #32115677
avenger
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен тригер
есть база menu в ней 3 поля (строим дерево)
1 nmbr (сериал - правда карявый какой-то)
2 parent(указатель на родителя)(def=0)
3 child(кол детей) (def=0)

задача написать два triggera - первый на добовление в базу данных второй на удаленее т.е. если добавляем в базу запись с parent=n ишем запись с nmbr=n и child=child+1

аналогично на удаление(только нужно убивать все записи ниже удаляемой ветки)
...
Рейтинг: 0 / 0
09.03.2003, 20:58
    #32116822
Niemi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен тригер
А может можно сюда вставить структуру таблиц к которым тригеры будут привязаны, ну или хотя бы наобум что-то близкое.


абстрактное мышление 0% :)
...
Рейтинг: 0 / 0
10.03.2003, 08:19
    #32116856
gr_san
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен тригер
-- САМА ТАБЛИЦА
CREATE TABLE "public"."products" (
"id" INTEGER DEFAULT nextval('"products_productid_seq"'::text) NOT NULL,
"productname" VARCHAR(100) NOT NULL,
"productmakerid" BIGINT,
"abbr" VARCHAR(100),
"lifetime" BIGINT,
"havelifetime" SMALLINT DEFAULT 1 NOT NULL,
"productimage" CHAR(254),
"parentid" INTEGER DEFAULT 0 NOT NULL,
"isnode" SMALLINT DEFAULT 0 NOT NULL,
"childcount" INTEGER DEFAULT 0 NOT NULL,
"isactive" BIGINT DEFAULT 1 NOT NULL,
PRIMARY KEY("id")
) WITH OIDS;

CREATE TRIGGER "products_after_delete" AFTER DELETE
ON "public"."products" FOR EACH ROW
EXECUTE PROCEDURE "public"."trg_products_after_delete"();

CREATE TRIGGER "products_after_insert" AFTER INSERT
ON "public"."products" FOR EACH ROW
EXECUTE PROCEDURE "public"."trg_products_after_insert"();

CREATE TRIGGER "products_after_update" AFTER UPDATE
ON "public"."products" FOR EACH ROW
EXECUTE PROCEDURE "public"."trg_products_after_update"();
-- table END ;-))

-- Триггер на удаление
CREATE FUNCTION "public"."trg_products_after_delete" () RETURNS trigger AS'
BEGIN
--if new.parentid <> null THEN
UPDATE products set childcount = childcount-1 where id = old.parentid;
--end if;
return new;
END;
'LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

-- Триггер на добавление
CREATE FUNCTION "public"."trg_products_after_insert" () RETURNS trigger AS'
DECLARE
i integer;
BEGIN
--if new.parentid <> null THEN
UPDATE products set childcount = childcount+1 where id = new.parentid;
--end if;
return new;
END;
'LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

-- И на изменение
-- Нужно проверять не изменился ли после апдейта родитель
-- И ,соответственно , контролировать childcount
BEGIN
if new.parentid <> old.parentid THEN
UPDATE products set childcount = childcount-1 where id = old.parentid;
UPDATE products set childcount = childcount+1 where id = new.parentid;
end if;
return new;
END;
...
Рейтинг: 0 / 0
10.03.2003, 08:24
    #32116857
gr_san
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен тригер
-- AFTER UPDATE
CREATE FUNCTION "public"."trg_products_after_update" () RETURNS trigger AS'
BEGIN
if new.parentid <> old.parentid THEN
UPDATE products set childcount = childcount-1 where id = old.parentid;
UPDATE products set childcount = childcount+1 where id = new.parentid;
end if;
return new;
END;
'LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

-- isnode всё же полезен , если вдруг смутит наличие такого поля , и
-- совершенно субъективное мнение : "boolean - недоотстой" ;-))
...
Рейтинг: 0 / 0
12.03.2003, 05:56
    #32117858
avenger
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен тригер
Большое спасибо!
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Нужен тригер / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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