|
|
|
Проверка записи на существование в триггере
|
|||
|---|---|---|---|
|
#18+
в тригере пытаюсь проверить, существует ли уже запись в таблице. триггер AFTER INSERT Код: sql 1. 2. переменная @cnt всегда 0. записи в таблице присутствуют ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 13:33:46 |
|
||
|
Проверка записи на существование в триггере
|
|||
|---|---|---|---|
|
#18+
1) Переменные cnt и @cnt - это разные переменные. 2) А что и откуда в этот момент в переменной @MsgID? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 13:40:56 |
|
||
|
Проверка записи на существование в триггере
|
|||
|---|---|---|---|
|
#18+
1. уяснил. будет ли правильно вот так: Код: sql 1. 2. переменная @MsgID извлекается ранее Код: sql 1. это идентификатор новости. он уникальный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 14:01:56 |
|
||
|
Проверка записи на существование в триггере
|
|||
|---|---|---|---|
|
#18+
nevinnyв тригере пытаюсь проверить, существует ли уже запись в таблице. триггер AFTER INSERT Код: sql 1. 2. переменная @cnt всегда 0. записи в таблице присутствуют интересный текст тригера... вроде как NEW.msgid select ....; row_count() - число найденых записей при последнем селектеж ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 14:02:50 |
|
||
|
Проверка записи на существование в триггере
|
|||
|---|---|---|---|
|
#18+
alex564657498765453, ошибочка вышла FOUND_ROWS() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 14:05:59 |
|
||
|
Проверка записи на существование в триггере
|
|||
|---|---|---|---|
|
#18+
попробовал как указали раннее: Код: sql 1. 2. при обновлении тригера выдает ошибку Not allowed to return a result set from a trigger ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 14:42:03 |
|
||
|
Проверка записи на существование в триггере
|
|||
|---|---|---|---|
|
#18+
nevinny, Прежде, чем метаться по разным вариантам синтаксиса, опишите толком задачу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 14:47:36 |
|
||
|
Проверка записи на существование в триггере
|
|||
|---|---|---|---|
|
#18+
nevinnyпопробовал как указали раннее: Код: sql 1. 2. при обновлении тригера выдает ошибку Not allowed to return a result set from a trigger круто...я не сталкивался с таким ограничением на тригере, что нельзя селект делать...тогда только как ты - селект инту вар ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 15:50:50 |
|
||
|
Проверка записи на существование в триггере
|
|||
|---|---|---|---|
|
#18+
miksoft, Прошу прощения за нечеткую формулировку задачи. показалось что полностью алгоритм описывать - избыточно. ниже более подробное описание. из внешней системы в таблицу синхронизации (replicate_table) приезжают данные в формате xml. Код: sql 1. В этом xml содержится информация о том, что необходимо сделать, какие данные вставить/обновить/удалить. на эту таблицу (replicate_table) навешен триггер AFTER INSERT который и разбирает данные. одно из условий внутри триггера, проверить, существует ли уже запись в системе по переданному идентификатору (<Ident>55363</Ident>). Идентификатор является внешним, и только по нему невозможно полностью удалить сообщение из системы, тк информация о сообщении хранится в нескольких таблицах, под внутренним идентификтором ElementID, который отличается от <Ident></Ident> в данном случае, в xml содержится информация о удалении сообщения. сначала необходимо проверить, существует ли данное сообщение в системе, если нет, то создать новое, если есть, то проверить , есть ли инструкции на удаление, и если они есть, то удалить. Обработка тега <Action> убрана, тк insert и update практически идентичны. вообщем то загвоздка в проверке существования записей в системе, поскольку селект возвращает всегда 0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 16:30:35 |
|
||
|
Проверка записи на существование в триггере
|
|||
|---|---|---|---|
|
#18+
nevinnymiksoft, Прошу прощения за нечеткую формулировку задачи. показалось что полностью алгоритм описывать - избыточно. ниже более подробное описание. из внешней системы в таблицу синхронизации (replicate_table) приезжают данные в формате xml. Код: sql 1. В этом xml содержится информация о том, что необходимо сделать, какие данные вставить/обновить/удалить. на эту таблицу (replicate_table) навешен триггер AFTER INSERT который и разбирает данные. одно из условий внутри триггера, проверить, существует ли уже запись в системе по переданному идентификатору (<Ident>55363</Ident>). Идентификатор является внешним, и только по нему невозможно полностью удалить сообщение из системы, тк информация о сообщении хранится в нескольких таблицах, под внутренним идентификтором ElementID, который отличается от <Ident></Ident> в данном случае, в xml содержится информация о удалении сообщения. сначала необходимо проверить, существует ли данное сообщение в системе, если нет, то создать новое, если есть, то проверить , есть ли инструкции на удаление, и если они есть, то удалить. Обработка тега <Action> убрана, тк insert и update практически идентичны. вообщем то загвоздка в проверке существования записей в системе, поскольку селект возвращает всегда 0 нащот того что селект ноль вернул, тебе написали var и @var Это вде разные переменные ту что в дикларе описал, не надо с собакой пользовать. а ваще архитектура вцелом странная. я так полагаю это то, что скрываеться за понтовым словом рест. приходит запрос на удаление записи 123, тебе какая разница есть она или нету - ты бери удаляй. пришла запись на вставку бери вставляй, апдейт апдейть. или ты думаешь твой код поиска записи и анализа результата быстрее отработает чем родной скомпиленый мускла? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 16:34:30 |
|
||
|
Проверка записи на существование в триггере
|
|||
|---|---|---|---|
|
#18+
alex564657498765453, видимо переделаю алгоритм триггера. поскольку на один хмл инструкции вставки, необходимо добавлять по одной записи в три разных таблицы, и только две из них содержат внешний ключ MsgID, который берется из <Ident>, а третью таблицу не могу денормализовать, поскольку она системная, и это изменение архитектуры, то буду менять логику самого тригера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 16:49:16 |
|
||
|
Проверка записи на существование в триггере
|
|||
|---|---|---|---|
|
#18+
nevinny , у Вас совершенно кривой подход. И весьма чреватый, надо сказать - размахать с ним данные в лапшу раз плюнуть... Напишите хранимую процедуру, которая примет эту XML-строку, распарсит её, выполнить необходимые проверки, и по их итогам аккуратно сделает ровно то, что нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 16:53:30 |
|
||
|
Проверка записи на существование в триггере
|
|||
|---|---|---|---|
|
#18+
Akina, эм. хорошо, помогите пожалуйста тогда исправить ошибки. Код: 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. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 17:06:42 |
|
||
|
Проверка записи на существование в триггере
|
|||
|---|---|---|---|
|
#18+
Ошибок две. Первая - вместо того, чтобы выбросить всё нахрен и написАть с нуля, но в форме процедуры, предпринимается попытка "исправить". Она основаная, идеологическая. Вторая - декларируется хренова гора переменных, которые потом не используются. Она синтаксическая и, в общем, безобидная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 17:23:54 |
|
||
|
Проверка записи на существование в триггере
|
|||
|---|---|---|---|
|
#18+
Akina, вообщем то, код и написан с нуля. в форме процедуры или триггера - помоему не сильно важно. возможно ошибаюсь, поясните. синтаксические ошибки помогите исправить. идея вынести основную логику в процедуру и вызывать из тригера ее, была, просто не дошел до этого момента, тк споткнулся на сабж топика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 17:32:33 |
|
||
|
Проверка записи на существование в триггере
|
|||
|---|---|---|---|
|
#18+
nevinnyв форме процедуры или триггера - помоему не сильно важноno comments ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 17:39:29 |
|
||
|
Проверка записи на существование в триггере
|
|||
|---|---|---|---|
|
#18+
Akinanevinnyв форме процедуры или триггера - помоему не сильно важноno comments авторвозможно ошибаюсь, поясните. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 18:11:39 |
|
||
|
Проверка записи на существование в триггере
|
|||
|---|---|---|---|
|
#18+
Поясняю. 1) Триггер жёстко привязан к записи, добавление/удаление/изменение которой вызвало срабатывание триггера. Процедура такой привязки не имеет. 2) Триггер ограничен в перечне используемых конструкций. В т.ч. и как следствие из 1-го отличия. Ограничения у процедур несколько мягче. 3) Триггер гарантированно срабатывает только на определённый и, к сожалению, не исчерпывающий, набор действий, формально выполняющий условия срабатывания. Процедура при вызове выполняется безусловно. 4) Триггер выполняется линейно (выполнение триггера для следующей запписи набора начинается только после завершения выполнения триггера для предыдущей записи) и, емнип, однозадачно (т.е. не могут одновременно выполняться два тела одного триггера, инициированные двумя разными запросами). Экземпляры процедур выполняются параллельно. 5) Триггер всегда обрабатывает только одну запись инициирующего набора. Процедура не имеет такого ограничения. Эти отличия (и куча прочих) имеют следствием то, что подход при написании триггера и процедуры различен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 18:35:19 |
|
||
|
Проверка записи на существование в триггере
|
|||
|---|---|---|---|
|
#18+
Akina, Спасибо за пояснения, очень помогли! ) решил свою проблему с помощью процедур. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 19:10:56 |
|
||
|
Проверка записи на существование в триггере
|
|||
|---|---|---|---|
|
#18+
Akinaне могут одновременно выполняться два тела одного триггера, инициированные двумя разными запросамиЭм... Это точно? Не вижу никаких логичных причин для этого... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 19:13:08 |
|
||
|
Проверка записи на существование в триггере
|
|||
|---|---|---|---|
|
#18+
miksoftAkinaне могут одновременно выполняться два тела одного триггера, инициированные двумя разными запросамиЭм... Это точно? Не вижу никаких логичных причин для этого... Если это НЕ так - триггер просто обязан блокировать как минимум текущую запись на всё время своей работы. В противном случае возможна параллельная работа двух экземпляров триггера над одной и той же записью, что потенциально приведёт к нарушению целостности и/или разрушению данных. А с учётом того, что триггеру позволено изменять данные других таблиц - он должен блокировать также и их, по тем же причинам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 21:22:47 |
|
||
|
Проверка записи на существование в триггере
|
|||
|---|---|---|---|
|
#18+
Akinamiksoftпропущено... Эм... Это точно? Не вижу никаких логичных причин для этого... Если это НЕ так - триггер просто обязан блокировать как минимум текущую запись на всё время своей работы. Это и так происходит. В случае MyISAM блокируется вся таблица. В случае InnoDB блокируется, как минимум, изменяемая запись. Все равно не вижу, почему один и тот же триггер не может работать одновременно над двумя разными записями в двух разных сессиях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 22:05:15 |
|
||
|
|

start [/forum/topic.php?fid=47&gotonew=1&tid=1834343]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
34ms |
get topic data: |
6ms |
get first new msg: |
4ms |
get forum data: |
1ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 192ms |
| total: | 289ms |

| 0 / 0 |
