powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Не срабатывает триггер, как должен (где-то ошибка)
13 сообщений из 13, страница 1 из 1
Не срабатывает триггер, как должен (где-то ошибка)
    #37910363
kvesda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть 2 таблицы (очень упрощенные): catalogs - каталог вещей и catalog_volume - сборник каталогов.
В catalogs - данные по разным категорям (книги, видео, аудио, машины и т.д.).
Вот код создания таблиц с данными на SQLite :
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
/* Создание таблиц */
CREATE TABLE IF NOT EXISTS catalogs (
       catalog_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
       parent_id INTEGER REFERENCES catalogs (catalog_id) ON DELETE CASCADE ON UPDATE CASCADE,
       path_id TEXT NOT NULL UNIQUE DEFAULT ''
);

CREATE TABLE IF NOT EXISTS catalog_volume (
       catalog_volume_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
       catalog_id INTEGER NOT NULL DEFAULT -1
);

CREATE TRIGGER catalogs__bd_parent__catalog_volume__set BEFORE DELETE ON catalogs
WHEN OLD.parent_id IS NULL
BEGIN
   -- Если удаляются записи в catalogs, parent_id которых = null (корни деревьев), а также их потомки
   -- то в таблице catalog_volume для удаляемых записей в атрибут catalog_id заносим -1
   UPDATE catalog_volume
       SET catalog_id = -1
           WHERE catalog_volume.catalog_id = (
				-- список catalog_id таблицы catalogs, которые являются корнем и его потомками,       
                -- соответствующие найденному path_id корня дерева для удаляемой записи в таблице catalogs.
                SELECT OLD.catalog_id
					FROM catalogs
                    WHERE OLD.path_id
                    LIKE (
						-- path_id корня дерева для удаляемой записи в таблице catalogs
                        SELECT OLD.path_id
                        FROM catalogs
                        WHERE catalogs.catalog_id = OLD.catalog_id
                    )  || '%'
           );           
END;

/* Заполнение таблиц */
/* Таблица catalogs */
-- корни дерева - основные каталоги ( parent_id=NULL )
INSERT INTO catalogs (catalog_id, path_id) VALUES (1, '/Книги/');
INSERT INTO catalogs (catalog_id, path_id) VALUES (2, '/Видео/');
INSERT INTO catalogs (catalog_id, path_id) VALUES (3, '/Аудио/');
-- потомки
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (4, 1, '/Книги/Программирование/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (5, 4, '/Книги/Программирование/Языки/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (6, 5, '/Книги/Программирование/Языки/C++/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (7, 5, '/Книги/Программирование/Языки/C#/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (8, 4, '/Книги/Программирование/Паттерны/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (9, 1, '/Книги/Проза/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (10, 1, '/Книги/Стихи/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (11, 9, '/Книги/Проза/Фантастика/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (12, 9, '/Книги/Проза/Приключения/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (13, 10, '/Книги/Проза/19 век/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (14, 10, '/Книги/Проза/20 век/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (15, 2, '/Видео/Русское/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (16, 15, '/Видео/Русское/Советское/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (17, 15, '/Видео/Русское/Современное/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (18, 2, '/Видео/Западное/');

/* Таблица catalog_volume */
INSERT INTO catalog_volume (catalog_id) VALUES (2);
INSERT INTO catalog_volume (catalog_id) VALUES (11);
INSERT INTO catalog_volume (catalog_id) VALUES (4);
INSERT INTO catalog_volume (catalog_id) VALUES (11);
INSERT INTO catalog_volume (catalog_id) VALUES (15);
INSERT INTO catalog_volume (catalog_id) VALUES (17);
INSERT INTO catalog_volume (catalog_id) VALUES (11);
INSERT INTO catalog_volume (catalog_id) VALUES (11);
INSERT INTO catalog_volume (catalog_id) VALUES (4);
INSERT INTO catalog_volume (catalog_id) VALUES (5);
INSERT INTO catalog_volume (catalog_id) VALUES (6);
INSERT INTO catalog_volume (catalog_id) VALUES (5);
INSERT INTO catalog_volume (catalog_id) VALUES (18);
INSERT INTO catalog_volume (catalog_id) VALUES (1);
INSERT INTO catalog_volume (catalog_id) VALUES (9);
INSERT INTO catalog_volume (catalog_id) VALUES (1);



Помощь нужна в следующем:
Нужно написать триггер, который, при удалении в таблице catalogs записей с p arent_id=NULL (корни деревьев), определял всех потомков этих корней (атрибуты catalog_id ) и в таблице catalog_volume в ЭТИХ ЖЕ атрибутах catalog_id ставил значение - 1 (т.е. таких вещей в каталоге больше нет).
Я написал триггер, но что-то он не срабатывает.

Подозреваю, что код не срабатывает где-то в условии WHERE catalog_volume.catalog_id = (
Код фрагмента SELECT root_children.catalog_id FROM ( работает корректно - проверял в простом SQL запросе, заменив OLD на catalogs , а в строку WHERE catalogs.catalog_id = OLD.catalog_id немного изменяем на WHERE catalogs.catalog_id = 1 (для примера удаляем 1-ю запись корня дерева). Вот проверочный код:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
-- список catalog_id таблицы catalogs, которые являются корнем и его потомками,       
-- соответствующие найденному path_id корня дерева для удаляемой записи в таблице catalogs.
SELECT catalogs.catalog_id
FROM catalogs
WHERE catalogs.path_id
LIKE (
     -- path_id корня дерева для удаляемой записи в таблице catalogs
     SELECT catalogs.path_id
     FROM catalogs
     WHERE catalogs.catalog_id = 1
)  || '%';



Подскажите, пожалуйста, где я недоделал код триггера? В чем ошибка? Благодарен за любые наводки и советы.
...
Рейтинг: 0 / 0
Не срабатывает триггер, как должен (где-то ошибка)
    #37910645
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Полная каша...
Смотрим текст триггера, видим:
Код: sql
1.
2.
3.
4.
5.
   UPDATE catalog_volume <...>
           WHERE catalog_volume.catalog_id = ( 
                SELECT OLD.catalog_id
	        FROM catalogs
                   WHERE ...


1. Если обновляем набор потомков, то нужно не "=", а "in", ИМХО.

2. OLD.* - это набор удаляемых строк (только их!), с вполне конкретными значениями. Потомки в него не входят.
"SELECT OLD.catalog_id FROM catalogs" - это мы что и где ищем?

Если поставить опцию "FOR EACH ROW", то в запросе это будет одна строка с конретным набором значений полей.
Найти ее потомков - можно без вложенного SELECT'а:
Код: sql
1.
2.
3.
  <...>
  WHERE path_id LIKE OLD.path_id || '_%'
  <...>


Маска '_%' исключает саму удаляемую запись, что нужно, поскольку триггер '_bd' (запись в catalog_volume, соответствующую удаляемой из catalogs, логично удалять, но это - по вкусу).
3. Отсутсвует проверка то, что удаляемый элемент - корневой. Ее нужно просто сделать.

Ну, и в довесок: сомнительна необходимость появления в таблице catalog_volume группы записей (some_catalog_volume_id, -1). Я бы просто удалял.
А обновление поля "path_id TEXT" - судя по всему, в другом триггере?
...
Рейтинг: 0 / 0
Не срабатывает триггер, как должен (где-то ошибка)
    #37910883
kvesda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Serg_GapПолная каша...
Согласен. Это - моя первая попытка использования триггеров (раньше как-то без них обходился, потом понял, что легче написать триггер, чем программировать на С++ логику обработки строк. Хотя, как оказалось, последнее для меня было легче, чем понять принципы работы CASE, WHEN и т.д., применительно к группе записей в триггере :) ). Поэтому и нуждаюсь в помощи.
Serg_Gap Ну, и в довесок: сомнительна необходимость появления в таблице catalog_volume группы записей (some_catalog_volume_id, -1). Я бы просто удалял.
Как я писал выше - код - очень урезанный кусок базы. В приводимом коде не все поля включены в таблицы (для простоты). Поэтому мне нужно, чтобы, при удалении строк в catalogs, строки в catalog_volume оставались, только catalog_id становился равным -1.
Serg_GapА обновление поля "path_id TEXT" - судя по всему, в другом триггере?
Именно так :) Где-то в сети увидел пример триггера по обработке деревьев в базе (есть же талантливые головы) - понял, что много терял, игнорируя триггеры. Адаптировал тот код под свои нужды, в смысле - обновления поля "path_id TEXT" - очень удобно - не надо на С++ делать массу проверок..

Serg_Gap , не могли бы вы написать пример триггера для моего случая? Если не сложно.
...
Рейтинг: 0 / 0
Не срабатывает триггер, как должен (где-то ошибка)
    #37910919
kvesda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уточнение: идея работы .
1. В таблице catalogs удаляем запись, у которой parent_id. Все ее потомки удаляются автоматом за счет " parent_id INTEGER REFERENCES catalogs (catalog_id) ON DELETE CASCADE ON UPDATE CASCAD ". Вместе с "корнем" удалятся и его потомками - 12 записей (из приведенного примера).
В таблице catalog_volume только для этих 12-ти атрибутов catalog_id нужно задать значение -1.
2. Если удаляется не корень, а како-то его потомок, то удаляется и он, и его потомки, например 5 записей. Опять же - за счет " parent_id INTEGER REFERENCES catalogs (catalog_id) ON DELETE CASCADE ON UPDATE CASCAD ".
В таблице catalog_volume только для этих 5-ти атрибутов catalog_id нужно задать значение -1.
...
Рейтинг: 0 / 0
Не срабатывает триггер, как должен (где-то ошибка)
    #37910943
kvesda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Опечатался, а правки - нет. Заново напишу исправленный текст.
Уточнение: идея работы.
1. В таблице catalogs удаляем запись, у которой parent_id = NULL . Все ее потомки удаляются автоматом за счет " parent_id INTEGER REFERENCES catalogs (catalog_id) ON DELETE CASCADE ON UPDATE CASCAD ". Вместе с "корнем" удалятся и его потомками - 12 записей (из приведенного примера).
В таблице catalog_volume только для этих 12-ти атрибутов catalog_id нужно задать значение -1.
2. Если удаляется не корень, а какой-то его потомок (у которой parent_id != NULL .) , то удаляется и он, и его потомки, например 5 записей. Опять же - за счет " parent_id INTEGER REFERENCES catalogs (catalog_id) ON DELETE CASCADE ON UPDATE CASCAD ".
В таблице catalog_volume только для этих 5-ти атрибутов catalog_id нужно задать значение -1.

Я 2-ю задачу вынес у себя в отдельный триггер - все прекрасно работает. Застопорился на 1-й задаче.
Если можете, помогите написать триггер, выполняющий только 1-ю задачу. Если же поможете написать триггер, объединяющий обе эти 2 задачи в одну - буду очень вам признателен. Спасибо.
...
Рейтинг: 0 / 0
Не срабатывает триггер, как должен (где-то ошибка)
    #37911137
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kvesda Serg_Gap , не могли бы вы написать пример триггера для моего случая? Если не сложно.
Не сложно, и не лень. Но все уже описано, только ручками - собрать в одно и вставить... Не в насмешку, - это просто полезно сделать самомУ; будет дальше легче жить.
Единственная поправка - для не-корневого элемента маска будет не '_%', а '%' (см.описание масок).

А проверка - в формулировке триггера (я в SQLite - новичок, и другой возможности для проверки не нашел).
Я создал 2 триггера, оба - с условием WHEN (инструмент SQLite Expert Personal 3.4.21.2243; при создании триггера в нижней части "шапки", в последнам выпадающем списке можно его выбрать):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE TRIGGER [trgAccountAD]
AFTER DELETE
ON TAccount
FOR EACH ROW
WHEN coalesce(old.id, -100) = -100
BEGIN
 update TObject set Class = 'Nothing' where Name like Old.Name || '%';
END

CREATE TRIGGER [trgAccountAD2]
AFTER DELETE
ON TAccount
FOR EACH ROW
WHEN coalesce(old.id, -100) <> -100
BEGIN
  update TObject set Class = 'Deleted' where Name like Old.Name || '%';
END



Работает, проверял.

Хотя в другом триггере - получилось сделать ветвление внутри триггера:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TRIGGER [trgAccountBD]
BEFORE DELETE
ON TAccount
FOR EACH ROW
BEGIN
  select case
    when exists (  
             select * 
             from TOperation             
             where AccountId = Old.Id
            )            
    then RAISE(Rollback, 'По данному счету есть операции!')    
  end;
END


(при необходимости - и строку "else" можно добавить).
Пробовал добавить вместо RAISE запрос на update ... , но получал каждый раз ошибку (хоть в кавычки брал запрос, хоть писал без них).

Но на этот счет - вопросы к специалистам более грамотным и опытным, чем я.

Удачи.
...
Рейтинг: 0 / 0
Не срабатывает триггер, как должен (где-то ошибка)
    #37911512
Stupid_BOT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kvesda,
а без триггеров не пробовали ?
Код: sql
1.
2.
3.
4.
5.
CREATE TABLE IF NOT EXISTS catalog_volume (
       catalog_volume_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
       catalog_id INTEGER NOT NULL DEFAULT -1,
       FOREIGN KEY(catalog_id) REFERENCES catalogs(catalog_id) ON DELETE SET DEFAULT ON UPDATE CASCADE
);
...
Рейтинг: 0 / 0
Не срабатывает триггер, как должен (где-то ошибка)
    #37911579
kvesda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Serg_Gap ,
Спасибо за помощь. Я тоже - новичок в SQLite :) . Ранее использовал MySQL - многого не хватает оттуда в SQLite. Ну и триггеры никогда не использовал. С другой стороны, мне легче учиться на готовых примерах...
...
Рейтинг: 0 / 0
Не срабатывает триггер, как должен (где-то ошибка)
    #37911581
kvesda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stupid_BOTkvesda,
а без триггеров не пробовали ?
Код: sql
1.
2.
3.
4.
5.
CREATE TABLE IF NOT EXISTS catalog_volume (
       catalog_volume_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
       catalog_id INTEGER NOT NULL DEFAULT -1,
       FOREIGN KEY(catalog_id) REFERENCES catalogs(catalog_id) ON DELETE SET DEFAULT ON UPDATE CASCADE
);


Такая идея не приходила в голову :). Спасибо, попробую и этот вариант.
...
Рейтинг: 0 / 0
Не срабатывает триггер, как должен (где-то ошибка)
    #37911601
kvesda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stupid_BOT ,
Идея "ON DELETE SET DEFAULT" привлекательная, но здесь возникает проблема:
Для моих таблиц (catalog_volume сделана по вашему коду):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE IF NOT EXISTS catalogs (
       catalog_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
       parent_id INTEGER REFERENCES catalogs (catalog_id) ON DELETE CASCADE ON UPDATE CASCADE,
       path_id TEXT NOT NULL UNIQUE DEFAULT ''
);

CREATE TABLE IF NOT EXISTS catalog_volume (
       catalog_volume_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
       catalog_id INTEGER NOT NULL DEFAULT -1,
       FOREIGN KEY(catalog_id) REFERENCES catalogs(catalog_id) ON DELETE SET DEFAULT ON UPDATE CASCADE
);



боюсь, такая идея не пройдет. Мне надо удалять строки в catalogs. Но из-за
FOREIGN KEY(catalog_id) REFERENCES catalogs(catalog_id) ON DELETE SET DEFAULT ON UPDATE CASCADE
удаление невозможно - ограничения FOREIGN KEY. Удалять строки можно в catalog_volume, но это как раз мне и не надо :).
Я поэтому и не задавал связь FK от catalog_volume к catalogs.
Возможно я что-то упускаю. Подскажите, пожалуйста, в таком случае.
...
Рейтинг: 0 / 0
Не срабатывает триггер, как должен (где-то ошибка)
    #37911687
kvesda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все гениальное - просто! ( (с) не помню кто )
Сделал все-таки триггер, который работает даже лучше, чем первоначально планировал: Если удаляется корень дерева в catalog, то все записи в catalog_volume, соответствующие этому корню и его потомкам в атрибуте catalog_id получают значение -1 (данного вида каталога - нет). Если же удаляется не корень, а какой-то его потомок, то все записи в catalog_volume, соответствующие этому потомку и его потомкам получают значение вышестоящего узла (parent_id из catalog) - т.е. все книги, или видео, или аудио и т.д. для удаляемого узла "переносятся" на вышестоящий узел.
Вот полный код тестовой базы (но главное - триггер ):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
/* Создание таблиц */
CREATE TABLE IF NOT EXISTS catalogs (
       catalog_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
       parent_id INTEGER REFERENCES catalogs (catalog_id) ON DELETE CASCADE ON UPDATE CASCADE,
       path_id TEXT NOT NULL UNIQUE DEFAULT ''
);

CREATE TABLE IF NOT EXISTS catalog_volume (
       catalog_volume_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
       catalog_id INTEGER NOT NULL DEFAULT -1
);

CREATE TRIGGER catalogs__ad_parent__catalog_volume__set AFTER DELETE ON catalogs
FOR EACH ROW
BEGIN
     UPDATE catalog_volume SET catalog_id = CASE
     WHEN OLD.parent_id IS NULL THEN -1
     ELSE OLD.parent_id
     END
     WHERE catalog_id = OLD.catalog_id;
END;

/* Заполнение таблиц */
/* Таблица catalogs */
-- корни дерева - основные каталоги ( parent_id=NULL )
INSERT INTO catalogs (catalog_id, path_id) VALUES (1, '/Книги/');
INSERT INTO catalogs (catalog_id, path_id) VALUES (2, '/Видео/');
INSERT INTO catalogs (catalog_id, path_id) VALUES (3, '/Аудио/');
-- потомки
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (4, 1, '/Книги/Программирование/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (5, 4, '/Книги/Программирование/Языки/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (6, 5, '/Книги/Программирование/Языки/C++/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (7, 5, '/Книги/Программирование/Языки/C#/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (8, 4, '/Книги/Программирование/Паттерны/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (9, 1, '/Книги/Проза/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (10, 1, '/Книги/Стихи/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (11, 9, '/Книги/Проза/Фантастика/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (12, 9, '/Книги/Проза/Приключения/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (13, 10, '/Книги/Проза/19 век/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (14, 10, '/Книги/Проза/20 век/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (15, 2, '/Видео/Русское/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (16, 15, '/Видео/Русское/Советское/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (17, 15, '/Видео/Русское/Современное/');
INSERT INTO catalogs (catalog_id, parent_id, path_id) VALUES (18, 2, '/Видео/Западное/');

/* Таблица catalog_volume */
INSERT INTO catalog_volume (catalog_id) VALUES (1);
INSERT INTO catalog_volume (catalog_id) VALUES (2);
INSERT INTO catalog_volume (catalog_id) VALUES (3);
INSERT INTO catalog_volume (catalog_id) VALUES (4);
INSERT INTO catalog_volume (catalog_id) VALUES (5);
INSERT INTO catalog_volume (catalog_id) VALUES (6);
INSERT INTO catalog_volume (catalog_id) VALUES (7);
INSERT INTO catalog_volume (catalog_id) VALUES (8);
INSERT INTO catalog_volume (catalog_id) VALUES (9);
INSERT INTO catalog_volume (catalog_id) VALUES (10);
INSERT INTO catalog_volume (catalog_id) VALUES (11);
INSERT INTO catalog_volume (catalog_id) VALUES (12);
INSERT INTO catalog_volume (catalog_id) VALUES (13);
INSERT INTO catalog_volume (catalog_id) VALUES (14);
INSERT INTO catalog_volume (catalog_id) VALUES (15);
INSERT INTO catalog_volume (catalog_id) VALUES (16);
INSERT INTO catalog_volume (catalog_id) VALUES (17);
INSERT INTO catalog_volume (catalog_id) VALUES (18);


Например, удаляем в catalogs узел /Книги/Программирование/
Все нижестоящие ветки-потомки удаляются каскадно. А в catalog_volume все записи этих удаленных ветвей в атрибуте catalog_id принимают значение 1 - эти книги "перенеслись" в категорию /Книги/
Так даже универсальней получилось.
Спасибо всем, кто откликнулся...
...
Рейтинг: 0 / 0
Не срабатывает триггер, как должен (где-то ошибка)
    #37912789
Stupid_BOT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> kvesda,
> удаление невозможно - ограничения FOREIGN KEY.

Возможно. Если добавить в catalogs запись с catalog_id = -1.
...
Рейтинг: 0 / 0
Не срабатывает триггер, как должен (где-то ошибка)
    #37912961
kvesda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stupid_BOT,
Не подумал об этом, спасибо.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Не срабатывает триггер, как должен (где-то ошибка)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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