Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
Добрый день, коллеги. Второй день ломаю голову по поводу вот такой задачи - Есть таблица orders, триггер натравлен на эту таблицу. Сценарий такой - про добавлении строки в заказы пишется лог в таблицу orders_log и insert двух строк в вспомогательную таблицу. Вопрос к знатокам - почему иногда примерно 1000 к 1 в таблице inserted пропадают значения??? К примеру - 1. Создаем заказ (insert into orders) 2. Триггер агрится и начинает выполнение. 3. Достаем значение из inserted и вставляем в лог. Ок. 4. Достаем значение из inserted и вставляем в вспомогательную. Не ок. Строка не создается. Для понимаю вставлю запрос. Код: sql 1. 2. 3. 4. 2611730 05.04.2018 15:10:46 84413792 84413792 NewOrder 2611730 0 1 290 2611729 05.04.2018 15:10:45 84413763 84413763 NewOrder 2611729 0 1 290 2611728 05.04.2018 15:10:42 84413735 84413735 NewOrder 2611728 0 1 290 2611726 05.04.2018 15:10:39 NULL NULL NULL NULL NULL NULL NULL 2611727 05.04.2018 15:10:39 84413684 84413684 NewOrder 2611727 0 1 290 2611725 05.04.2018 15:10:36 84413653 84413653 NewOrder 2611725 0 1 290 2611724 05.04.2018 15:10:34 84413625 84413625 NewOrder 2611724 0 1 290 Тело триггера выглядит вот так - Код: 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. Определяется тип произведенной операции и производятся действия. Вот чего я не понимаю почему insert в ORDERS_log выполняется всегда, а следующая вставка 1 к 1000 заканчивается нулами??? Нагрузка на сервер довольно таки большая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 15:19 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
inserted может содержать больше чем 1 запись ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 15:29 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
Maxx, не в этом дело. До этого было 3 отдельные вставки без переменных, напрямую из таблицы inserted. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 15:45 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
ну не волшебство же происходит )) отсюда два варианта : либо в @insert_id оказывается null, либо в @insert_id оказывается не тот id заказа который вы ожидаете )) а это может получиться из этого Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 16:10 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
Гигабайт Мегабайтович Килобайтов, я из-за этого тему и создал. я пробовал еще 2 варианта Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Был еще union но он вел себя так же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 16:49 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
PisarevskiyRE, Мне одному кажется странным, что эти данные вставляются Код: sql 1. а эти нет Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 16:53 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
PisarevskiyRE, а откуда уверенность, что пустые - это не update операции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 16:57 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
blonduser, from inserted строка существует и записывается, следующие 2 оператора пропускается. Повторяюсь это случай 1/1000. И когда это проходит по времени вставки видно что транзакция ожидает чего - то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 17:17 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
PisarevskiyRE, В триггере они у вас выглядят так Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 17:22 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
blonduser, Что должно пропустится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 17:22 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
а покажите скрипт вашей таблички VG_FIELD_VALUES ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 17:29 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
Konst_One, REATE TABLE [dbo].[VG_FIELD_VALUES]( [ID] [bigint] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL, [FORMNAME] [varchar](500) NULL, [REF] [int] NULL, [SVALUE] [text] NULL, [ENABLED] [smallint] NULL, [FIELDID] [int] NULL, CONSTRAINT [PK__VG_FIELD_VALUES__3A379A64] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [DataFiles] ) ON [DataFiles] TEXTIMAGE_ON [DataFiles] GO ALTER TABLE [dbo].[VG_FIELD_VALUES] ADD CONSTRAINT [DF__VG_FIELD___ENABL__3B2BBE9D] DEFAULT ((1)) FOR [ENABLED] GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Ссылка на Vg_Fields.Id' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'VG_FIELD_VALUES', @level2type=N'COLUMN',@level2name=N'FIELDID' GO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 17:43 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
простите, а какая версия у вас сервера? Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 17:48 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
Konst_One, Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) Jun 17 2011 00:54:03 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 17:49 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
вы делаете неверные выводы, потому что анализируете неверный запрос: Код: sql 1. 2. 3. 4. 5. 6. 7. в табличке VG_FIELD_VALUES нет никакой записи с выделенным вами ID ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 17:52 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
а это вы так ищите что нет записи в этой табличке. тогда отбой зы вы уверены что у вас удаление не происходит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 18:00 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
Konst_One, дык я выделил просто для наглядности в скрине. Самое простое объяснение идет подряд 3 inserta из inserted. 1, 2, ..,56,..509,..840,.. и рамдомно не пишется, причем если смотреть по id она должна была вставиться гооораздо раньше. INSERT INTO dbo.ORDERS_log (ChangedID, ChangedOperation) SELECT @insert_id, 'I' insert into VG_FIELD_VALUES (FORMNAME, REF, SVALUE, ENABLED, FIELDID) VALUES ('NewOrder',@insert_id,CAST(CAST(ROUND(dbo.GetMaxAutoSum(@insert_id), 0) AS VARCHAR(255)) AS TEXT),1,290), ('NewOrder',@insert_id,CAST(CAST(@insert_clientid ^ 0xdeadee AS VARCHAR(255)) AS TEXT),1,286) -- можно так можно через union all можно разбить на 2 отдельных, сути не меняет записи после 1 операции не создаются ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 18:05 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
PisarevskiyRE, извиняюсь за фото. В общем случаи получается такая картина - ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 18:09 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
PisarevskiyRE, Что возвращает функция dbo.GetMaxAutoSum(@insert_id) ? Может в ней ошибка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 19:44 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
PisarevskiyREPisarevskiyRE, извиняюсь за фото. В общем случаи получается такая картина - Что вы гадаете с своими запутанными значениями? Кто так отлаживает??? Навставляйте отладочных селектов в триггер, и потом вставляйте в Order, сразу всё увидите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 19:45 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
PisarevskiyRE, 1. Никаких переменных в триггере! Ну, разве что переменную с обозначением команда, для которой вызван триггер. 2. С inserted и deleted работать как с таблицами, а не источниками скалярных значений. 3. Не применять @@ROWCOUNT на входе триггера. Только EXISTS(SELECT * FROM inserted UNION ALL SELECT * FROM deleted). Это на случай, если таблицу будут использовать в MERGE. 4. Забыть о типе TEXT. Вместо него - VARCHAR(MAX). 5. Неплохо бы логгировать только данные, которые изменились. Хорошо в этом деле зарекомендовала себя конструкция FROM inserted i FULL JOIN deleted d ON i.ID=d.ID WHERE NOT EXISTS(SELECT i.Field1, ... , i.FieldN INTERSECT SELECT d.Field1, ... , d.FieldN), где ID - первичный ключ. 6. Логгировать можно только из deleted, так как inserted и так лежит в таблице. Всё настолько просто, что непонятно, что тут можно отлаживать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2018, 20:37 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
PisarevskiyRE, что вернет запрос? Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2018, 10:19 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
blonduser, функция возвращает число int. alexeyvg, спасибо за совет, но это нельзя осуществить так как база прода, на стейджах повторить не давалось. iap, спасибо, запомнил. StarikNavy, приложил скрин. *************************** Проблема решена. Оказалось все намного тривиальнее. Строки удаляет сервис после срабатывания триггера обычным delete. Чудес не бывает. Отменил вызов команды Рен-ТВ :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2018, 17:10 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
iap1. Никаких переменных в триггере! Ну, разве что переменную с обозначением команда, для которой вызван триггер.Почему? #Хэш= ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2018, 14:20 |
|
||
|
Поведение триггера AFTER INSERT,DELETE,UPDATE
|
|||
|---|---|---|---|
|
#18+
04cf9f9576a6f15iap1. Никаких переменных в триггере! Ну, разве что переменную с обозначением команда, для которой вызван триггер.Почему? #Хэш=Потому что в скалярную переменную можно поместить только одно значение (обычно мы это и наблюдаем в триггерах новичков), в то время как inserted и deleted - это таблицы с миллионами строк! (Специально утрирую). Скалярная переменная провоцирует новичка писать совершенно некорректный код для обработки таблиц inserted и deleted. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2018, 15:36 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39626933&tid=1689930]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
91ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
| others: | 256ms |
| total: | 457ms |

| 0 / 0 |
