powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / A trigger returned a resultset and/or was running with SET NOCOUNT OFF
8 сообщений из 33, страница 2 из 2
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
    #40120409
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nick74,

при опции 0 сервер не будет выбрасывать исключение. Если по-прежнему Вы ловите исключение, то дело не в бобине, как говорится. То есть исключение Вы ловите в драйвере OLE DB провайдера. Разбирайтесь, что приходит от сервера. Может вам надо MARS включить, лучше уточните в конференции на C# или на чем пишете.
...
Рейтинг: 0 / 0
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
    #40120495
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nick74
msLex,

Нет, там пусто...


раз идет такая дискуссия х.п. о чем, то влепите в триггер
SET NOCOUNT ON

и как говорится отпешытесь тут
...
Рейтинг: 0 / 0
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
    #40120673
Фотография 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 одной записи из запроса А
в) выполнить процедуру Б, собственно добавляющую данные и вызывающую ошибку.

Без открытого запроса А и прочитанной первой строки никаких ошибок не генерируется. Запрос А должен достигать определенной сложности по исполнению, при уменьшении сложности запроса сначала ситуация становилась нестабильной (Иногда появляется ошибка, иногда нет), при дальнейшем упрощении ошибка исчезала.

Предполагаю, что проблема в том, что исполнение запроса для получения следующих строк идет асинхронно с основным потоком, т.е. одновременно с исполнением процедуры Б, которая каким-то боком воспринимает возвращаемые запросом А данные как возвращенные триггером.
Буду рад комментарию знающих механику происходящего людей, сам в этом не особо разбираюсь, увы.

Рекомендация (которая помогла):
Не выполнять процедуры, вызывающие изменения в данных, одновременно с наличием открытых и не до конца прочитанных запросов. Либо делать это в разных транзакциях. (Хотя последнее надо бы проверить, что-то я уже сомневаюсь).
То есть достаточно поменять шаги А, Б и В местами, и никаких ошибок больше не возникает. Либо между Б и В добавить чтение всех оставшихся записей запроса А.
...
Рейтинг: 0 / 0
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
    #40120686
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nick74,

так вы же должны вытянуть все данные, прежде, чем продолжать работу. У вас сессия-то занята получением данных. Вам лучше на форуме по PHP уточнить.
...
Рейтинг: 0 / 0
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
    #40120687
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 - почитайте уже немного, ё*т, это же не про ваши возвращаемые рекордсеты из триггеров и процедур
...
Рейтинг: 0 / 0
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
    #40120702
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

там nocount вообще не при чём.
...
Рейтинг: 0 / 0
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
    #40120817
Фотография Nick74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Nick74,

так вы же должны вытянуть все данные, прежде, чем продолжать работу. У вас сессия-то занята получением данных. Вам лучше на форуме по PHP уточнить.

Почему должен? В чем сложность в том же SSMS написать
Код: sql
1.
2.
3.
4.
declare cursor...
open ...
fetch next from ...
exec dbo.Procedure


Работает на ура...
Ну да, технически могут быть dirty reads, ну и фиг с ними.
И главное технически обеспечить запрет подобного действия (Если оно вдруг запретное) на уровне драйвера не просто легко, а очень легко. Не сделали же.
...
Рейтинг: 0 / 0
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
    #40120826
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nick74,

Почему должен? Писал выше, потому, что сеанс работает с одним потоком данных. Пока все данные не получены, вы не можете выполнять что-то еще, кроме получения данных. Если хотите в одном сеансе работать с несколькими наборами данных, то включайте MARS.

Что на ура, пока пакет не отработает и не отгрузит все данные на клиента Вы не можете выполнять другой пакет.

авторобеспечить запрет подобного действия
Так обеспечили, вы получаете исключение. Смотрите и не видите.
...
Рейтинг: 0 / 0
8 сообщений из 33, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / A trigger returned a resultset and/or was running with SET NOCOUNT OFF
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]