Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Плач ораклиста или как скомпенсировать безумие сторонней программы в триггере!
|
|||
|---|---|---|---|
|
#18+
Привет всем! Имеется некая msSql-база, не наша, но нам надлежит её администрировать и собирать изменения с целого множества "нативных" таблиц в созданную нами в ней таблицу cap_4_dwh. Имеется большое множество созданных нами триггеров примерно такого типа: Код: 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. Поля cmpcode, code, kmplevel имеют Unique-констрейнт (что-то типа неформального PK таблицы OAE_KOMPONENT!). Главное приложение системы абсолютно закрыто для нас, сделано в другой стране, и не то что попросить что-то поменять, спросить там даже некого! Приложение переезжает сейчас с Oracle на MsSQL (типа db-независимое.... ;-) ). Базу сейчас мигрируем. Наши старые работающие oracle-триггеры (все были row-based, если кому-то это тут что-то говорит) переписаны нами на mssql - типа вышеуказанного примера. Тригерры успешно оттестованы sql-DML-ями (типа "update DBO.OAE_KOMPONENT set ... where ..." ). Но когда начали тестовать глав.приложение полезли траблы! А именно, если скажем тестовый "update DBO.OAE_KOMPONENT ..." обновляет 3 строки и апдейт содержит поля указанные в "where d.cmpcode = i.cmpcode..." то MS-Studion (Microsoft SQL Server Management Studio) печатает примерно такие строки: Код: sql 1. 2. 3. Последние, понятное дело, из триггера (от вставки 3 старых и 3 новых = итого 6) записей в нашу cap_4_dwh. Пока всё хорошо. Однако если в апдейте только поля НЕ участвующие в нашем списке ("where d.cmpcode = i.cmpcode..."). То в Studio наблюдаем соответсвенно: Код: sql 1. 2. 3. Так вот, эксперементальным путём мы установили, что идиотское приложение очевидно как-то ловит этот 0 и выдаёт юзеру ошибку на "морду" типа: "не удалось обновить таблицу!" .... (жесть, да_! Но нам, как сказал, на это не повлиять, увы!) Вопрос: есть ли какое-то более приятное решение, чем отказаться совсем от "where d.cmpcode = i.cmpcode..." и протоколлировать все-все измения по-любым полям (хоть они и не нужны, дополнительно нагружают систему, жрут дисковое пространство и т.п.!) Без хороших знаний MS-SQL (а мы тут все ораклисты :-) ) шансов мало, ИМХО. Так что заранее благодарю за любую полезную инфу!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2019, 17:24 |
|
||
|
Плач ораклиста или как скомпенсировать безумие сторонней программы в триггере!
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. в триггер воткните. И пребудет с вами щастье. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2019, 17:31 |
|
||
|
Плач ораклиста или как скомпенсировать безумие сторонней программы в триггере!
|
|||
|---|---|---|---|
|
#18+
set nocount on в триггере в начало ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2019, 17:32 |
|
||
|
Плач ораклиста или как скомпенсировать безумие сторонней программы в триггере!
|
|||
|---|---|---|---|
|
#18+
И чо оракелисты так коряво и многосложно триггера то пишут? Код: 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.06.2019, 17:53 |
|
||
|
Плач ораклиста или как скомпенсировать безумие сторонней программы в триггере!
|
|||
|---|---|---|---|
|
#18+
DBAshnik, Вы не торопитесь писать код аналогичный ORACLE. То, что хорошо для Oracle, может быть нехорошо для MSSQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2019, 18:36 |
|
||
|
Плач ораклиста или как скомпенсировать безумие сторонней программы в триггере!
|
|||
|---|---|---|---|
|
#18+
DBAshnik, зачем в DWH триггеры? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2019, 20:38 |
|
||
|
Плач ораклиста или как скомпенсировать безумие сторонней программы в триггере!
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2019, 21:08 |
|
||
|
Плач ораклиста или как скомпенсировать безумие сторонней программы в триггере!
|
|||
|---|---|---|---|
|
#18+
DBAshnik, То, что вам нужно делается гораздо проще и с меньшим потреблением ресурсов. Примерно так: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2019, 22:48 |
|
||
|
Плач ораклиста или как скомпенсировать безумие сторонней программы в триггере!
|
|||
|---|---|---|---|
|
#18+
DBAshnik Код: sql 1. 2. 3. Так вот, эксперементальным путём мы установили, что идиотское приложение очевидно как-то ловит этот 0 и выдаёт юзеру ошибку на "морду" типа: "не удалось обновить таблицу!" .... (жесть, да_! Но нам, как сказал, на это не повлиять, увы!)Примените mssql profiler. Посмотрите, выполняет ли что приложение после запроса на изменение. Тогда станет менее неясно, что делать. Возможно, нужен костыль в каждом триггере, который будет эмулировать предположительно ожидаемое приложением значение @@rowcount. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2019, 09:22 |
|
||
|
Плач ораклиста или как скомпенсировать безумие сторонней программы в триггере!
|
|||
|---|---|---|---|
|
#18+
DBAshnikТак вот, эксперементальным путём мы установили, что идиотское приложение очевидно как-то ловит этот 0 и выдаёт юзеру ошибку на "морду" типа: "не удалось обновить таблицу!" .... (жесть, да_! Но нам, как сказал, на это не повлиять, увы!) Это дельфийские датасеты так зачастую делают при отправке изменений в базу - смотрят на сообщение rows affected, и если оно не равно 1, то выбрасывают ошибку. Обходится достаточно просто: Код: sql 1. 2. 3. в самом конце тела триггера/ХП. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2019, 11:55 |
|
||
|
Плач ораклиста или как скомпенсировать безумие сторонней программы в триггере!
|
|||
|---|---|---|---|
|
#18+
aleks222 Код: sql 1. в триггер воткните. И пребудет с вами щастье. огромное спасибо! (и Shakill-у тоже!). Ровно то что нам надо, оказывается!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2019, 12:46 |
|
||
|
Плач ораклиста или как скомпенсировать безумие сторонней программы в триггере!
|
|||
|---|---|---|---|
|
#18+
aleks222И чо оракелисты так коряво и многосложно триггера то пишут? Код: 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. Спасибо! Очень элегантно! (не знал, что except это аналог "нашего" MINUS) :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2019, 12:47 |
|
||
|
Плач ораклиста или как скомпенсировать безумие сторонней программы в триггере!
|
|||
|---|---|---|---|
|
#18+
invmDBAshnik, То, что вам нужно делается гораздо проще и с меньшим потреблением ресурсов. Примерно так: Код: 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. интересное решение. Спасибо! Не знал про таки вещи как: [function] и cross apply Ещё раз спасибо всем за участие! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2019, 12:48 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39831041&tid=1687627]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
81ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 251ms |
| total: | 427ms |

| 0 / 0 |
