powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / тригер на удаление дерева записей
4 сообщений из 4, страница 1 из 1
тригер на удаление дерева записей
    #33977348
skomoroh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть таблица(древовидная структура):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TABLE "zzz"."table" (
  "id" SERIAL, 
  "parent_id" INTEGER, 
  "position" SMALLINT DEFAULT  0 , 
  "name" VARCHAR( 256 ), 
  CONSTRAINT "zzz_pkey" PRIMARY KEY("id"), 
  CONSTRAINT "zzz_fk_parent" FOREIGN KEY ("zzz_id")
    REFERENCES "zzz"."table"("id")
    ON DELETE CASCADE
    ON UPDATE NO ACTION
    NOT DEFERRABLE
) WITH OIDS;
нужен тригер для смещения поля "position". например при удалении записей с позицией 3, 4 и 5, он все записи больше 5 уменьшал на 3, что-б позиции шли попарядку...

тригер такого вида:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
BEGIN
    UPDATE
        zzz.table
    SET
        position = position - 1 
	WHERE
        position > OLD.position;
    RETURN NULL;
END;
отказывается правильно работать, отрабатывает только 1 ветку, а на остальные забивает =(
...
Рейтинг: 0 / 0
тригер на удаление дерева записей
    #33977524
skomoroh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пока, изменил FOREIGN KEY на
автор
ON DELETE SET NULL
ON UPDATE NO ACTION

а вместо триггера написал функцию
автор
DECLARE
row record;
BEGIN
UPDATE
zzz.table
SET
position = position -1
WHERE
position > OLD.position;

FOR row IN
SELECT table.id
FROM zzz.table
WHERE table.parent_id = OLD.id
LOOP
DELETE FROM zzz.table
WHERE table.id = row.id;
END LOOP;
RETURN OLD;
END;


но очень хочется узнать почему не работает триггер
...
Рейтинг: 0 / 0
тригер на удаление дерева записей
    #33977534
skomoroh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пока, изменил FOREIGN KEY на
Код: plaintext
1.
2.
    ON DELETE SET NULL
    ON UPDATE NO ACTION
а вместо триггера написал функцию
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
DECLARE
    row record;
BEGIN
    UPDATE
        zzz.table
    SET
        position = position - 1 
	WHERE
        position > OLD.position;

    FOR row IN
        SELECT table.id
        FROM zzz.table
        WHERE table.parent_id = OLD.id
    LOOP
        DELETE FROM zzz.table
        WHERE table.id = row.id;
    END LOOP;
    RETURN OLD;
END;

но очень хочется узнать почему не работает триггер
...
Рейтинг: 0 / 0
тригер на удаление дерева записей
    #33982289
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторотказывается правильно работать, отрабатывает только 1 ветку, а на остальные забивает =(
Приведи пример: данные до команды delete, после, сама команда delete и как все-таки объявлен триггер, а то не все понятно из твоей речи.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / тригер на удаление дерева записей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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