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

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

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


абстрактное мышление 0% :)
...
Рейтинг: 0 / 0
Нужен тригер
    #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
Нужен тригер
    #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
Нужен тригер
    #32117858
avenger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо!
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Нужен тригер
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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