Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Триггеры / 10 сообщений из 10, страница 1 из 1
24.06.2015, 02:11:00
    #38991196
Mor1L
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры
Скажите, можно ли в таблице, на которую навешан триггер, в момент его срабатывания какими либо путями удалить или изменить записи в этой таблице? Без никаких вариантов?
...
Рейтинг: 0 / 0
24.06.2015, 04:11:25
    #38991208
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры
Mor1LСкажите, можно ли в таблице, на которую навешан триггер, в момент его срабатывания какими либо путями удалить или изменить записи в этой таблице? Без никаких вариантов?


...будьте конкретнее...
...
Рейтинг: 0 / 0
24.06.2015, 11:22:55
    #38991412
Mor1L
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры
javajdbc,
Процедура вызывается в момент срабатывания триггера, и переписывает данные из одной таблицы на другую.
Как только она переписывает, я хочу тут же сразу удалить записи в старой таблице(log_memory) из которой она уже переписала.

CREATE DEFINER=`root`@`localhost` PROCEDURE `statisticAttendancePush`(IN data_part_count SMALLINT)
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE statist_id INT (11);
DECLARE table_nam varchar(30);
DECLARE old_val mediumtext;
DECLARE new_val mediumtext;
DECLARE pag varchar(250);
DECLARE act varchar(1);
DECLARE dat datetime;
#Обьявление курсора
DECLARE cur1 CURSOR FOR SELECT statistics_id, table_name, old_value, new_value, page, action, date_create from practic.log_memory
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur1;
SET @i = 0;
read_loop: LOOP
FETCH cur1 INTO ID, statist_id, table_nam, old_val, new_val, pag, act, dat;
IF done THEN
LEAVE read_loop;
END IF;
IF @i = data_part_count THEN
LEAVE read_loop;
END IF;
INSERT INTO practic.log(statistics_id, table_name, old_value, new_value, page, action, date_create)
VALUES(statist_id, table_nam, old_val, new_val, pag, act, dat);
DELETE FROM practic.log_memory WHERE log_memory.id =log_memory.id LIMIT 1;
SET @i = @i + 1;
END LOOP ;
CLOSE cur1;
END

Выбивает ошибку, при том, если удалять запись из той таблицы, в которую мы переписали, ошибки нет, а если удалить из той, из которой уже считали и переписали в новую вызывает ошибка. Насколько я понимаю, что нельзя вроде как изменять таблицу, в момент срабатывания триггера, если он висит на этой таблице, может можно как нибудь это обойти?
...
Рейтинг: 0 / 0
24.06.2015, 11:34:48
    #38991434
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры
Mor1L, помечайте в триггере записи как обработанные. При желании потом можете их удалять по расписанию.
...
Рейтинг: 0 / 0
24.06.2015, 11:40:06
    #38991444
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры
Mor1LПроцедура вызывается в момент срабатывания триггера
Я тебя чёта не понимаю. На что срабатывает триггер? на какое событие? почему из его кода надо вызывать процедуру?
Какая во всё это заложена глобально логика?

Mor1LПроцедура вызывается в момент срабатывания триггера, и переписывает данные из одной таблицы на другую.
Как только она переписывает, я хочу тут же сразу удалить записи в старой таблице(log_memory) из которой она уже переписала.
Сделай с точностью до наоборот. Удаляй записи. А в триггере BEFORE DELETE, если нужно, копируй удаляемые записи в другую таблицу.
...
Рейтинг: 0 / 0
24.06.2015, 11:48:27
    #38991454
Mor1L
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры
Akina, Логика такая, триггер навешан на таблицу, и срабатывает после каждого добавления в неё. При определенном числе записей, из триггера вызывается процедура, которая переписывает все данные с одной таблицы на другую, и она в ней должна же и удалить записи, в старой таблице, с которой данные были переписаны. То есть не надо никакого триггера после удаления, удаление должно происходить в самой процедуре при определенном числе записей.
...
Рейтинг: 0 / 0
24.06.2015, 12:09:22
    #38991488
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры
Mor1L , ну что я могу сказать... программист-процедурщик рисовал.

В общем, шлюхай сюды.
Первое. В таблицу сразу натолкать нужное количество записей. А хоть бы и пустых.
Второе. Добавление в таблицу делать не запросом, а процедурой.
Третье. Логика процедуры следующая:
1) select .. for update самой старой записи в переменные;
2) update этой записи новыми данными;
3) сохранённые в переменных значения (если они не null) вставляются в таблицу архива.

И никаких триггеров.
...
Рейтинг: 0 / 0
24.06.2015, 12:24:24
    #38991511
Mor1L
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры
Akina, Спасибо, идея крутяк. Но есть несколько моментов, по сути запись в архив процедурой будет проходить после каждого добавления, а нужно перезаписывать после каждой 10 записи, ПРИ ТОМ все эти 10 записей одновременно перезаписать, да и еще отчистить. Здесь не так производительность важная, как учебные цели. И сказали триггер обязательно нужно включить.
...
Рейтинг: 0 / 0
24.06.2015, 12:37:47
    #38991525
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры
Mor1LЗдесь не так производительность важная, как учебные цели. И сказали триггер обязательно нужно включить.C этого и надо было начинать.

В общем, так. В триггере ты НЕ СМОЖЕШЬ удалять записи из таблицы, событие на которой вызвало срабатывание триггера. И неважно, будет это тело триггера или тело вызванной из его кода процедуры. Так что тебе надо не включить триггер, а наоборот, доказать, что его включение не позволит выполнить требуемое. Заодно озвучь, что хоть пакетом, хоть по одной - а триггер всё равно будет обрабатывать строго по одной записи, а не все 10 сразу.
...
Рейтинг: 0 / 0
27.06.2015, 20:44:09
    #38994356
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры
AkinaMor1LЗдесь не так производительность важная, как учебные цели. И сказали триггер обязательно нужно включить.C этого и надо было начинать.

В общем, так. В триггере ты НЕ СМОЖЕШЬ удалять записи из таблицы, событие на которой вызвало срабатывание триггера. И неважно, будет это тело триггера или тело вызванной из его кода процедуры. Так что тебе надо не включить триггер, а наоборот, доказать, что его включение не позволит выполнить требуемое. Заодно озвучь, что хоть пакетом, хоть по одной - а триггер всё равно будет обрабатывать строго по одной записи, а не все 10 сразу.


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


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