|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Всем привет, помогите, не знаю куда копать. Есть некая процедура, которая добавляет записи в таблицы. В этих таблицах есть триггеры, которые тоже могут что-то добавлять и что-то проверять. В одном из триггеров срабатывает RAISERROR по определенному условию. В момент срабатывания RAISERROR MS SQL генерирует Exception Код: sql 1.
и соответствующий вывод, который заменяет собой реальную причину. (Ну не заменяет, а идет первым в выводе, и именно его и хватает библиотека). В результате в программе выводится именно это вместо правильного сообщения об ошибке. Во всех триггерах стоят SET NOCOUNT ON вначале. Никаких бесхозных SELECT, возвращающих результат тоже не нашел. При этом та же самая процедура, выполненная из под SSMS (Оригинал работает под PHP) возвращает только правильное сообщение об ошибке. Никаких варнингов не выдается, знаю, что они тоже рассматриваются как result set. Опции пытался сделать одинаковыми, не помогло. Запускал оба процесса под профайлером, из под PHP вижу несколько Exceptions вида "этой временной таблицы еще нет" (Видимо при компиляции плана) и сообщений Missing column statistics, но как outstanding result set, я так понимаю, это не должно рассматриваться. Подскажите как поймать этот вывод ну или хотя бы понять что это и как с ним бороться? И почему под SSMS этой ошибки не возникает? Включал "disallow results from triggers option", никаких сообщений не выдается, то есть по идее нигде нет возврата результатов. Проверял на MS SQL 2017 и 2019 - разницы нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2021, 15:38 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Nick74, Вы скромно умолчали о самом главном - типе и версии драйвера, который использует пхп. Там может быть NTWDBLIB, и это кранты сразу (ну или почти сразу). Вообще, такие вещи лучше у пехаперов спрашивать, ибо тут, если из SSMS все работает, значит виноваты либо настройки соединения, либо библиотека доступа. Вы пробовали ставить SQL Profiler / XEvents на коннект из пхп и смотреть, что именно там отправляется и возвращается и рейзится? Это тоже может натолкнуть на мысли. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2021, 17:02 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Nick74, на закладке "сообщения" SSMS точно ничего не написано кроме Выполнение команд успешно завершено. Время выполнения:? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2021, 17:32 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Ennor Tiegael , Microsoft drivers for PHP, 5.6.1, в исходном виде файл обзывался php_sqlsrv_73_ts.dll. На php это функции, начинающиеся с sqlsrv_. Как-то не подумал, что может быть виновата библиотека, сообщение же выдается триггером. Настройки - да, но блин знать бы что можно включить чтобы такое получать... Трейс лог есть, могу включить, но он здоровый, больше 2000 строк, и не факт, что нужные события выбраны, надо же знать на что смотреть. Непосредственно сам момент вложил. А есть способ посмотреть все флаги одновременно как-то? Владислав Колосов , Время? Ну может пару секунд при включенном профайлере, без него быстрее. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2021, 09:42 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Nick74, у меня немного не так и прога на дельфи. В момент ошибки в триггере она падала по непонятной ошибке Заменил в триггере raiserror на throw и в проге стало отображаться нормальное сообщение об ошибке попробуйте ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2021, 09:57 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
HandKot, На Delphi у меня тоже есть кусочек интерфейса, под ним пробовал, там все нормально выдается. RAISERROR используется исторически, так как база данных еще с MS SQL 2000 вроде бы живет, а тогда THROW не было. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2021, 10:14 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Проверил опции по sp_configure - все совпадает. Для всяких там ANSI_WARNINGS и пр. пробовал ставить в SSMS начальные настройки, которые выполняются при запуске PHP сессии, тоже не помогло. Как посмотреть их сразу все не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2021, 15:04 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Nick74, неправильно поняли, что-то еще написано, кроме "Выполнение команд успешно завершено. Время выполнения ..." ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2021, 15:39 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Nick74 Проверил опции по sp_configure - все совпадает. Для всяких там ANSI_WARNINGS и пр. пробовал ставить в SSMS начальные настройки, которые выполняются при запуске PHP сессии, тоже не помогло. Как посмотреть их сразу все не знаю. https://docs.microsoft.com/ru-ru/sql/t-sql/functions/options-transact-sql?view=sql-server-ver15 Скрипт от felix_ff Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2021, 15:41 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Владислав Колосов, Код: sql 1. 2. 3. 4.
Это все. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2021, 15:50 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Nick74, Ну так, у Вас возвращается ошибка бизнес правил, сгенерированная "программистом". ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2021, 15:54 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Nick74 Владислав Колосов, Код: sql 1. 2. 3. 4.
Это все. В SSMS по умолчанию результат работы выводиться в двух вкладках: Messages (как раз там ошибки) и Results. Есть ли что на вкладке Results? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2021, 15:55 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
PaulWist, В ССМС да. В PHP возвращается A trigger returned a resultset and/or was running... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2021, 16:19 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
msLex, Нет, там пусто... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2021, 16:20 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Опции сравнил. Совпадают. Далее выяснилось, что ошибка возникает в PHP только посередине странички, после выполнения двух десятков других запросов. Если исполнить из под PHP один конкретный вызов процедуры, то он возвращает корректную ошибку. Сижу в непонятках. Транзакций у меня явных нет. Как могут предыдущие запросы влиять на вызов процедуры, точнее подставлять ей какие-то неучтенные результаты? Сейчас попробую повторить всю цепочку вызовов PHP... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2021, 16:29 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Получил наконец минимальный кусок, который воспроизводит ошибку. Код: php 1. 2. 3.
То есть перед процедурой, которая вызывает ошибку, открывается запрос и делается выборка первой записи из него. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2021, 17:33 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Под SSMS повторить пока не смог. Любопытно, что если уменьшить количество выбираемых первым запросом полей, то ошибка становится неустойчивой. То есть то она есть, то ее нет. Такое ощущение, что какая-то часть первого запроса продолжает выполняться асинхронно и мешает второму запросу... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2021, 17:55 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Nick74, вы убедились, что триггеры не выполняют процедуры, которые могут вернуть набор данных? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2021, 18:53 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Владислав Колосов, Да. Вообще странно, я пытался под ССМС вызвать аналогичную ошибку, специально возвращая результат из процедуры или триггера. Неудачно. Такое ощущение, что ССМС плевать на эту проблему. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2021, 18:58 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Nick74 Вообще странно, я пытался под ССМС вызвать аналогичную ошибку, специально возвращая результат из процедуры или триггера. Неудачно. Такое ощущение, что ССМС плевать на эту проблему. Ненормально, что какие то библиотеки доступа не могут работать с возвращаемыми сервером данными. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2021, 14:33 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
alexeyvg, Странно то, что ошибка эта генерируется сервером, а не сторонней библиотекой, в противном случае я бы вряд ли увидел ее в профайлере. То есть, я так понимаю, у сервера есть некая скрытая (Ну может и не скрытая, но я ее не нашел) настройка, которая активируется библиотекой, и говорит серверу что-то типа "Во время эксепшена проверяй наличие возвращенных данных и генерируй вот такую ошибку мне"... Соответственно, теоретически, наверно можно и в ССМС включить такое поведение. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2021, 12:17 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Nick74, Выполните Код: sql 1. 2.
но это лишь спрячет проблему. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2021, 14:06 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Владислав Колосов, увы, проверял, не помогает. То есть если действительно возвращать результат из триггера, экспешен, конечно, появляется. Но в моем случае нет, то есть в реальности никаких возвратов из триггера нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2021, 16:25 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Владислав Колосов, понял, что непонятно написал. У меня изначально эта опция была отключена. Я пробовал ее включать в надежде, что где-то раньше, где есть какой-то вывод в триггере, появится новый ексепшен. Увы, не помогло, ничего нового не появилось. Эксепшен у этой опции несколько другой, поэтому спутать их сложно. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2021, 17:49 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Nick74 Владислав Колосов, Код: sql 1. 2. 3. 4.
Э то все . Другими словами: Это п-ц Может текст триггера посмотрим, ткскыть, развеемся? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2021, 18:54 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Nick74, при опции 0 сервер не будет выбрасывать исключение. Если по-прежнему Вы ловите исключение, то дело не в бобине, как говорится. То есть исключение Вы ловите в драйвере OLE DB провайдера. Разбирайтесь, что приходит от сервера. Может вам надо MARS включить, лучше уточните в конференции на C# или на чем пишете. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2021, 20:55 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Nick74 msLex, Нет, там пусто... раз идет такая дискуссия х.п. о чем, то влепите в триггер SET NOCOUNT ON и как говорится отпешытесь тут ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2021, 09:43 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
В общем по результатам исследований проблемы: 1. Проблема наблюдается только в PHP (Драйвер Microsoft SQL driver for PHP последней версии), повторить ситуацию в SSMS я не смог. Вообще не смог вызвать ни разу указанную ошибку, даже специально возвращая данные в триггерах. 2. Set nocount on, так же как и disallow results from triggers = 0 не помогают, так как никаких возвратов из триггеров, или из процедур, вызываемых из триггера, у меня нет, все проверил. При включенном disallow results from triggers = 1 SSMS сразу будет выдавать исключение при возврате данных из триггера, и в данном случае его (исключения) нет. 3. Как выяснилось, минимальный фрагмент на PHP, генерирующий ошибку, состоит из трех действий: а) открыть запрос А, выдающий несколько строк б) сделать fetch одной записи из запроса А в) выполнить процедуру Б, собственно добавляющую данные и вызывающую ошибку. Без открытого запроса А и прочитанной первой строки никаких ошибок не генерируется. Запрос А должен достигать определенной сложности по исполнению, при уменьшении сложности запроса сначала ситуация становилась нестабильной (Иногда появляется ошибка, иногда нет), при дальнейшем упрощении ошибка исчезала. Предполагаю, что проблема в том, что исполнение запроса для получения следующих строк идет асинхронно с основным потоком, т.е. одновременно с исполнением процедуры Б, которая каким-то боком воспринимает возвращаемые запросом А данные как возвращенные триггером. Буду рад комментарию знающих механику происходящего людей, сам в этом не особо разбираюсь, увы. Рекомендация (которая помогла): Не выполнять процедуры, вызывающие изменения в данных, одновременно с наличием открытых и не до конца прочитанных запросов. Либо делать это в разных транзакциях. (Хотя последнее надо бы проверить, что-то я уже сомневаюсь). То есть достаточно поменять шаги А, Б и В местами, и никаких ошибок больше не возникает. Либо между Б и В добавить чтение всех оставшихся записей запроса А. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2021, 15:49 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Nick74, так вы же должны вытянуть все данные, прежде, чем продолжать работу. У вас сессия-то занята получением данных. Вам лучше на форуме по PHP уточнить. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2021, 16:12 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Nick74 В общем по результатам исследований проблемы: 1. Проблема наблюдается только в PHP (Драйвер Microsoft SQL driver for PHP последней версии), повторить ситуацию в SSMS я не смог. Вообще не смог вызвать ни разу указанную ошибку, даже специально возвращая данные в триггерах. 2. Set nocount on, так же как и disallow results from triggers = 0 не помогают, так как никаких возвратов из триггеров, или из процедур, вызываемых из триггера, у меня нет, все проверил. При включенном disallow results from triggers = 1 SSMS сразу будет выдавать исключение при возврате данных из триггера, и в данном случае его (исключения) нет. 3. Как выяснилось, минимальный фрагмент на PHP, генерирующий ошибку, состоит из трех действий: а) открыть запрос А, выдающий несколько строк б) сделать fetch одной записи из запроса А в) выполнить процедуру Б, собственно добавляющую данные и вызывающую ошибку. Без открытого запроса А и прочитанной первой строки никаких ошибок не генерируется. Запрос А должен достигать определенной сложности по исполнению, при уменьшении сложности запроса сначала ситуация становилась нестабильной (Иногда появляется ошибка, иногда нет), при дальнейшем упрощении ошибка исчезала. Предполагаю, что проблема в том, что исполнение запроса для получения следующих строк идет асинхронно с основным потоком, т.е. одновременно с исполнением процедуры Б, которая каким-то боком воспринимает возвращаемые запросом А данные как возвращенные триггером. Буду рад комментарию знающих механику происходящего людей, сам в этом не особо разбираюсь, увы. Рекомендация (которая помогла): Не выполнять процедуры, вызывающие изменения в данных, одновременно с наличием открытых и не до конца прочитанных запросов. Либо делать это в разных транзакциях. (Хотя последнее надо бы проверить, что-то я уже сомневаюсь). То есть достаточно поменять шаги А, Б и В местами, и никаких ошибок больше не возникает. Либо между Б и В добавить чтение всех оставшихся записей запроса А. SET NOCOUNT ON - почитайте уже немного, ё*т, это же не про ваши возвращаемые рекордсеты из триггеров и процедур ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2021, 16:14 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Ролг Хупин, там nocount вообще не при чём. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2021, 16:36 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Владислав Колосов Nick74, так вы же должны вытянуть все данные, прежде, чем продолжать работу. У вас сессия-то занята получением данных. Вам лучше на форуме по PHP уточнить. Почему должен? В чем сложность в том же SSMS написать Код: sql 1. 2. 3. 4.
Работает на ура... Ну да, технически могут быть dirty reads, ну и фиг с ними. И главное технически обеспечить запрет подобного действия (Если оно вдруг запретное) на уровне драйвера не просто легко, а очень легко. Не сделали же. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2021, 20:56 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Nick74, Почему должен? Писал выше, потому, что сеанс работает с одним потоком данных. Пока все данные не получены, вы не можете выполнять что-то еще, кроме получения данных. Если хотите в одном сеансе работать с несколькими наборами данных, то включайте MARS. Что на ура, пока пакет не отработает и не отгрузит все данные на клиента Вы не можете выполнять другой пакет. авторобеспечить запрет подобного действия Так обеспечили, вы получаете исключение. Смотрите и не видите. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2021, 22:14 |
|
|
start [/forum/topic.php?all=1&fid=46&tid=1684003]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
124ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
others: | 237ms |
total: | 475ms |
0 / 0 |