|
|
|
Триггеры
|
|||
|---|---|---|---|
|
#18+
Скажите, можно ли в таблице, на которую навешан триггер, в момент его срабатывания какими либо путями удалить или изменить записи в этой таблице? Без никаких вариантов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2015, 02:11:00 |
|
||
|
Триггеры
|
|||
|---|---|---|---|
|
#18+
Mor1LСкажите, можно ли в таблице, на которую навешан триггер, в момент его срабатывания какими либо путями удалить или изменить записи в этой таблице? Без никаких вариантов? ...будьте конкретнее... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2015, 04:11:25 |
|
||
|
Триггеры
|
|||
|---|---|---|---|
|
#18+
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 Выбивает ошибку, при том, если удалять запись из той таблицы, в которую мы переписали, ошибки нет, а если удалить из той, из которой уже считали и переписали в новую вызывает ошибка. Насколько я понимаю, что нельзя вроде как изменять таблицу, в момент срабатывания триггера, если он висит на этой таблице, может можно как нибудь это обойти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2015, 11:22:55 |
|
||
|
Триггеры
|
|||
|---|---|---|---|
|
#18+
Mor1L, помечайте в триггере записи как обработанные. При желании потом можете их удалять по расписанию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2015, 11:34:48 |
|
||
|
Триггеры
|
|||
|---|---|---|---|
|
#18+
Mor1LПроцедура вызывается в момент срабатывания триггера Я тебя чёта не понимаю. На что срабатывает триггер? на какое событие? почему из его кода надо вызывать процедуру? Какая во всё это заложена глобально логика? Mor1LПроцедура вызывается в момент срабатывания триггера, и переписывает данные из одной таблицы на другую. Как только она переписывает, я хочу тут же сразу удалить записи в старой таблице(log_memory) из которой она уже переписала. Сделай с точностью до наоборот. Удаляй записи. А в триггере BEFORE DELETE, если нужно, копируй удаляемые записи в другую таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2015, 11:40:06 |
|
||
|
Триггеры
|
|||
|---|---|---|---|
|
#18+
Akina, Логика такая, триггер навешан на таблицу, и срабатывает после каждого добавления в неё. При определенном числе записей, из триггера вызывается процедура, которая переписывает все данные с одной таблицы на другую, и она в ней должна же и удалить записи, в старой таблице, с которой данные были переписаны. То есть не надо никакого триггера после удаления, удаление должно происходить в самой процедуре при определенном числе записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2015, 11:48:27 |
|
||
|
Триггеры
|
|||
|---|---|---|---|
|
#18+
Mor1L , ну что я могу сказать... программист-процедурщик рисовал. В общем, шлюхай сюды. Первое. В таблицу сразу натолкать нужное количество записей. А хоть бы и пустых. Второе. Добавление в таблицу делать не запросом, а процедурой. Третье. Логика процедуры следующая: 1) select .. for update самой старой записи в переменные; 2) update этой записи новыми данными; 3) сохранённые в переменных значения (если они не null) вставляются в таблицу архива. И никаких триггеров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2015, 12:09:22 |
|
||
|
Триггеры
|
|||
|---|---|---|---|
|
#18+
Akina, Спасибо, идея крутяк. Но есть несколько моментов, по сути запись в архив процедурой будет проходить после каждого добавления, а нужно перезаписывать после каждой 10 записи, ПРИ ТОМ все эти 10 записей одновременно перезаписать, да и еще отчистить. Здесь не так производительность важная, как учебные цели. И сказали триггер обязательно нужно включить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2015, 12:24:24 |
|
||
|
Триггеры
|
|||
|---|---|---|---|
|
#18+
Mor1LЗдесь не так производительность важная, как учебные цели. И сказали триггер обязательно нужно включить.C этого и надо было начинать. В общем, так. В триггере ты НЕ СМОЖЕШЬ удалять записи из таблицы, событие на которой вызвало срабатывание триггера. И неважно, будет это тело триггера или тело вызванной из его кода процедуры. Так что тебе надо не включить триггер, а наоборот, доказать, что его включение не позволит выполнить требуемое. Заодно озвучь, что хоть пакетом, хоть по одной - а триггер всё равно будет обрабатывать строго по одной записи, а не все 10 сразу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2015, 12:37:47 |
|
||
|
Триггеры
|
|||
|---|---|---|---|
|
#18+
AkinaMor1LЗдесь не так производительность важная, как учебные цели. И сказали триггер обязательно нужно включить.C этого и надо было начинать. В общем, так. В триггере ты НЕ СМОЖЕШЬ удалять записи из таблицы, событие на которой вызвало срабатывание триггера. И неважно, будет это тело триггера или тело вызванной из его кода процедуры. Так что тебе надо не включить триггер, а наоборот, доказать, что его включение не позволит выполнить требуемое. Заодно озвучь, что хоть пакетом, хоть по одной - а триггер всё равно будет обрабатывать строго по одной записи, а не все 10 сразу. врядли проффесор дурак и дал не выполнимое задание... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2015, 20:44:09 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38991196&tid=1833009]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
641ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 920ms |

| 0 / 0 |
