|
|
|
Помогите в написание триггера
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, требуется помощь в написании триггера. Задача: Есть две таблицы [сообщения] и [история_сообщений], на инсерт в таблицу [сообщения] поставил триггер. Который следит чтобы при достижении 100 записей в диалоге сообщения переходили в архив. Возможно написано не самым умным способом но работает и ладно. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Второй половиной задачи является очистка сообщений из таблицы [сообщения] после того как они попали в архив. Мне показалось логичным, что он должен отрабатывать после вставки сообщений [история_сообщений] и выглядит вот так. Код: sql 1. 2. 3. 4. 5. 6. 7. Но у MySQL свое мнение на этот счет, и он мне сообщает, что таблицу [сообщения] модифицировать нельзя, так как она участвует в другом процессе. Дословно вот что говорит: Can't update table 'tbl' in stored function/trigger because it is already used by statement which invoked this stored function/trigger ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2018, 07:31 |
|
||
|
Помогите в написание триггера
|
|||
|---|---|---|---|
|
#18+
Nick-name,)) Собственно вопрос в том, как обойти это ограничение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2018, 07:32 |
|
||
|
Помогите в написание триггера
|
|||
|---|---|---|---|
|
#18+
Обойти ограничение нельзя. Есть на выбор как миниум три различных подхода к решению задачи. Первый - вместо удаления создание в триггере EVENT на удаление записи. Второй - реализация логики в виде не запроса, а хранимой процедуры. Третий - ротация. Т.е. сразу создаётся 100 пустых записей, и вместо вставки новой записи и удаления старой выполняется обновление самой старой записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2018, 07:37 |
|
||
|
Помогите в написание триггера
|
|||
|---|---|---|---|
|
#18+
Akina, Ага, спасибо, я признаться и сам думал про хранимую процедуру, только не понимаю в какой момент ее вызывать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2018, 07:55 |
|
||
|
Помогите в написание триггера
|
|||
|---|---|---|---|
|
#18+
Вопрос немного офтопный, пытаюсь создать процедуру Код: sql 1. 2. 3. 4. 5. 6. MySQL не создает но и не ругается, это что может быть? Права рутовые. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2018, 08:32 |
|
||
|
Помогите в написание триггера
|
|||
|---|---|---|---|
|
#18+
Nick-name, А такой вариант создался 0_0 Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2018, 08:54 |
|
||
|
Помогите в написание триггера
|
|||
|---|---|---|---|
|
#18+
Nick-nameне понимаю в какой момент ее вызывать?Вместо INSERT INTO messages ... делаете CALL insert_into_messages(...). Nick-name Код: sql 1. Самому не смешно? Это же WHERE true... Крайне опасное занятие - называть переменные так же, как имена полей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2018, 10:16 |
|
||
|
Помогите в написание триггера
|
|||
|---|---|---|---|
|
#18+
Один фик, не сработало, то же самое пишет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2018, 11:07 |
|
||
|
Помогите в написание триггера
|
|||
|---|---|---|---|
|
#18+
Nick-name , приводите полный порядок своих действий (какой именно код создан, как именно запущен) и точные цитаты сообщений. И - Вы не забыли удалить ранее созданные триггеры? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2018, 11:23 |
|
||
|
Помогите в написание триггера
|
|||
|---|---|---|---|
|
#18+
Нет, удалить не забыл. Вот перечень всего того что создано и как происходит 1. Триггер на создание сообщения. Проверяет если больше 5 сообщений то делаем запись самого первого в архивную таблицу. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 2. Триггер на вставку в архивную таблицу, вызывает хранимую процедуру Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 3. и наконец сама процедура Код: sql 1. 2. 3. 4. 5. 6. 7. Результат: Error Code: 1442. Can't update table 'messages' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. Вроде ничего не забыл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2018, 11:57 |
|
||
|
Помогите в написание триггера
|
|||
|---|---|---|---|
|
#18+
Nick-nameТриггер на создание сообщения. Проверяет если больше 5 сообщений то делаем запись самого первого в архивную таблицу.Ошибка. BEFORE INSERT проверяет намерение, а не факт вставки записи - т.е. если при вставке будет ошибка, и запись не вставится, триггер всё одно уже отработал. Операцию такого рода надо выполнять в триггере AFTER INSERT - т.е. когда запись уже реально вставлена в таблицу. Дополнительно - зачем нужна промежуточная переменная @cnt? можно же сразу Код: sql 1. 2. 3. Nick-nameТриггер на вставку в архивную таблицу, вызывает хранимую процедуру Ошибка. Процедура должна вызываться ВМЕСТО запроса на вставку в messages, а не в триггере. ИТОГО и суммарно: Вместо INSERT INTO messages -> trigger (INSERT INTO history_chats) -> DELETE FROM messages выполняется просто CALL insert_into_messages (данные для вставки) А вот внутри её уже и выполняется всё вышеперечисленное: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Дополнительно: в процедуре следует сформировать хэндлер(ы) на случай ошибки на любой стадии, саму ошибку фиксировать (где и что) и возвращать в OUT-параметре(ах), который потом можно проанализировать и понять, что выполнено, а что нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2018, 12:26 |
|
||
|
Помогите в написание триггера
|
|||
|---|---|---|---|
|
#18+
То есть все должно выглядеть так - триггер срабатывает по AFTER INSERT Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. А процедура выглядит так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Если да то это не помогло ошибка та же ((( и на BEFORE INSERT то же ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2018, 13:40 |
|
||
|
Помогите в написание триггера
|
|||
|---|---|---|---|
|
#18+
Nick-name, то есть триггера у вас вообще быть не должно. вместо insert в таблицу делаете процедуру. А не из триггера вызываете процедуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2018, 13:46 |
|
||
|
Помогите в написание триггера
|
|||
|---|---|---|---|
|
#18+
Melkij, Спасибо большое, все работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2018, 15:18 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39695408&tid=1829649]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 132ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...