Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / A trigger returned a resultset and/or was running with SET NOCOUNT OFF / 25 сообщений из 33, страница 1 из 2
09.12.2021, 15:38
    #40118637
Nick74
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
Всем привет,

помогите, не знаю куда копать.
Есть некая процедура, которая добавляет записи в таблицы. В этих таблицах есть триггеры, которые тоже могут что-то добавлять и что-то проверять.
В одном из триггеров срабатывает RAISERROR по определенному условию.
В момент срабатывания RAISERROR MS SQL генерирует Exception
Код: sql
1.
A trigger returned a resultset and/or was running with SET NOCOUNT OFF while another outstanding result set was active 


и соответствующий вывод, который заменяет собой реальную причину. (Ну не заменяет, а идет первым в выводе, и именно его и хватает библиотека). В результате в программе выводится именно это вместо правильного сообщения об ошибке.

Во всех триггерах стоят 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 - разницы нет.
...
Рейтинг: 0 / 0
09.12.2021, 17:02
    #40118670
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
Nick74,

Вы скромно умолчали о самом главном - типе и версии драйвера, который использует пхп. Там может быть NTWDBLIB, и это кранты сразу (ну или почти сразу).

Вообще, такие вещи лучше у пехаперов спрашивать, ибо тут, если из SSMS все работает, значит виноваты либо настройки соединения, либо библиотека доступа.

Вы пробовали ставить SQL Profiler / XEvents на коннект из пхп и смотреть, что именно там отправляется и возвращается и рейзится? Это тоже может натолкнуть на мысли.
...
Рейтинг: 0 / 0
09.12.2021, 17:32
    #40118688
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
Nick74,

на закладке "сообщения" SSMS точно ничего не написано кроме
Выполнение команд успешно завершено.

Время выполнения:?
...
Рейтинг: 0 / 0
10.12.2021, 09:42
    #40118858
Nick74
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
Ennor Tiegael ,

Microsoft drivers for PHP, 5.6.1, в исходном виде файл обзывался php_sqlsrv_73_ts.dll. На php это функции, начинающиеся с sqlsrv_.
Как-то не подумал, что может быть виновата библиотека, сообщение же выдается триггером.
Настройки - да, но блин знать бы что можно включить чтобы такое получать...

Трейс лог есть, могу включить, но он здоровый, больше 2000 строк, и не факт, что нужные события выбраны, надо же знать на что смотреть.
Непосредственно сам момент вложил.

А есть способ посмотреть все флаги одновременно как-то?

Владислав Колосов ,
Время? Ну может пару секунд при включенном профайлере, без него быстрее.
...
Рейтинг: 0 / 0
10.12.2021, 09:57
    #40118864
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
Nick74, у меня немного не так и прога на дельфи.
В момент ошибки в триггере она падала по непонятной ошибке
Заменил в триггере raiserror на throw и в проге стало отображаться нормальное сообщение об ошибке
попробуйте
...
Рейтинг: 0 / 0
10.12.2021, 10:14
    #40118865
Nick74
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
HandKot,

На Delphi у меня тоже есть кусочек интерфейса, под ним пробовал, там все нормально выдается.
RAISERROR используется исторически, так как база данных еще с MS SQL 2000 вроде бы живет, а тогда THROW не было.
...
Рейтинг: 0 / 0
10.12.2021, 15:04
    #40118990
Nick74
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
Проверил опции по sp_configure - все совпадает.
Для всяких там ANSI_WARNINGS и пр. пробовал ставить в SSMS начальные настройки, которые выполняются при запуске PHP сессии, тоже не помогло. Как посмотреть их сразу все не знаю.
...
Рейтинг: 0 / 0
10.12.2021, 15:39
    #40119006
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
Nick74,

неправильно поняли, что-то еще написано, кроме
"Выполнение команд успешно завершено.

Время выполнения ..."
...
Рейтинг: 0 / 0
10.12.2021, 15:41
    #40119009
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
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.
SELECT
      CAST(@@OPTIONS AS VARCHAR(20)) AS "@@OPTIONS",
      CAST(SIGN(@@OPTIONS & 1) AS CHAR) AS "DISABLE_DEF_CNST_CHK",
      CAST(SIGN(@@OPTIONS & 2) AS CHAR) AS "IMPLICIT_TRANSACTIONS" ,
      CAST(SIGN(@@OPTIONS & 4) AS CHAR) AS "CURSOR_CLOSE_ON_COMMIT" ,
      CAST(SIGN(@@OPTIONS & 8) AS CHAR) AS "ANSI_WARNINGS" ,
      CAST(SIGN(@@OPTIONS & 16) AS CHAR) AS "ANSI_PADDING" ,
      CAST(SIGN(@@OPTIONS & 32) AS CHAR) AS "ANSI_NULLS" ,
      CAST(SIGN(@@OPTIONS & 64) AS CHAR) AS "ARITHABORT" ,
      CAST(SIGN(@@OPTIONS & 128) AS CHAR) AS "ARITHIGNORE" ,
      CAST(SIGN(@@OPTIONS & 256) AS CHAR) AS "QUOTED_IDENTIFIER" ,
      CAST(SIGN(@@OPTIONS & 512) AS CHAR) AS "NOCOUNT" ,
      CAST(SIGN(@@OPTIONS & 1024) AS CHAR) AS "ANSI_NULL_DFLT_ON" ,
      CAST(SIGN(@@OPTIONS & 2048) AS CHAR) AS "ANSI_NULL_DFLT_OFF" ,
      CAST(SIGN(@@OPTIONS & 4096) AS CHAR) AS "CONCAT_NULL_YIELDS_NULL" ,
      CAST(SIGN(@@OPTIONS & 8192) AS CHAR) AS "NUMERIC_ROUNDABORT" ,
      CAST(SIGN(@@OPTIONS & 16384) AS CHAR) AS "XACT_ABORT",
      CONVERT(VARCHAR(255), CONNECTIONPROPERTY('net_transport')) AS "net_transport",
      CONVERT(VARCHAR(255), CONNECTIONPROPERTY('protocol_type')) AS "protocol_type",
      CONVERT(VARCHAR(255), CONNECTIONPROPERTY('auth_scheme')) AS "auth_scheme",
      CONVERT(VARCHAR(255), CONNECTIONPROPERTY('physical_net_transport')) AS "physical_net_transport"
...
Рейтинг: 0 / 0
10.12.2021, 15:50
    #40119015
Nick74
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
Владислав Колосов,

Код: sql
1.
2.
3.
4.
сообщение: 50000, уровень: 16, состояние: 1, процедура: dbo.FSM_VacationGraph_UpdateRows, строка: 62 [строка начала пакета: 22]
---Окончание отпуска должно быть до даты истечения срока контракта

Время выполнения: 2021-12-10T15:49:31.1266501+03:00


Это все.
...
Рейтинг: 0 / 0
10.12.2021, 15:54
    #40119019
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
Nick74,

Ну так, у Вас возвращается ошибка бизнес правил, сгенерированная "программистом".
...
Рейтинг: 0 / 0
10.12.2021, 15:55
    #40119020
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
Nick74
Владислав Колосов,

Код: sql
1.
2.
3.
4.
сообщение: 50000, уровень: 16, состояние: 1, процедура: dbo.FSM_VacationGraph_UpdateRows, строка: 62 [строка начала пакета: 22]
---Окончание отпуска должно быть до даты истечения срока контракта

Время выполнения: 2021-12-10T15:49:31.1266501+03:00



Это все.

В SSMS по умолчанию результат работы выводиться в двух вкладках: Messages (как раз там ошибки) и Results.

Есть ли что на вкладке Results?
...
Рейтинг: 0 / 0
10.12.2021, 16:19
    #40119033
Nick74
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
PaulWist,

В ССМС да. В PHP возвращается A trigger returned a resultset and/or was running...
...
Рейтинг: 0 / 0
10.12.2021, 16:20
    #40119034
Nick74
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
msLex,

Нет, там пусто...
...
Рейтинг: 0 / 0
10.12.2021, 16:29
    #40119039
Nick74
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
Опции сравнил. Совпадают.

Далее выяснилось, что ошибка возникает в PHP только посередине странички, после выполнения двух десятков других запросов.
Если исполнить из под PHP один конкретный вызов процедуры, то он возвращает корректную ошибку.

Сижу в непонятках. Транзакций у меня явных нет. Как могут предыдущие запросы влиять на вызов процедуры, точнее подставлять ей какие-то неучтенные результаты?
Сейчас попробую повторить всю цепочку вызовов PHP...
...
Рейтинг: 0 / 0
10.12.2021, 17:33
    #40119066
Nick74
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
Получил наконец минимальный кусок, который воспроизводит ошибку.
Код: php
1.
2.
3.
   $q =  $this->sql->OpenSQL( "select * from dbo.FSM_VacationGraph_GetCombinedData('1022') order by mmonth, mday " );
   $this->sql->FetchRow( $q, SQLSRV_FETCH_ASSOC );
   $this->sql->ExecSQL( "exec dbo.FSM_VacationGraph_UpdateRows '1022', '2.9.2.28' " );



То есть перед процедурой, которая вызывает ошибку, открывается запрос и делается выборка первой записи из него.
...
Рейтинг: 0 / 0
10.12.2021, 17:55
    #40119076
Nick74
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
Под SSMS повторить пока не смог.
Любопытно, что если уменьшить количество выбираемых первым запросом полей, то ошибка становится неустойчивой. То есть то она есть, то ее нет. Такое ощущение, что какая-то часть первого запроса продолжает выполняться асинхронно и мешает второму запросу...
...
Рейтинг: 0 / 0
10.12.2021, 18:53
    #40119083
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
Nick74,

вы убедились, что триггеры не выполняют процедуры, которые могут вернуть набор данных?
...
Рейтинг: 0 / 0
10.12.2021, 18:58
    #40119085
Nick74
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
Владислав Колосов,

Да. Вообще странно, я пытался под ССМС вызвать аналогичную ошибку, специально возвращая результат из процедуры или триггера. Неудачно. Такое ощущение, что ССМС плевать на эту проблему.
...
Рейтинг: 0 / 0
11.12.2021, 14:33
    #40119225
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
Nick74
Вообще странно, я пытался под ССМС вызвать аналогичную ошибку, специально возвращая результат из процедуры или триггера. Неудачно. Такое ощущение, что ССМС плевать на эту проблему.
Что тут странного? Это штатная функциональность сервера, и неудивительно, что SSMS успешно с сервером работает, это же утилита от производителя сиквела.
Ненормально, что какие то библиотеки доступа не могут работать с возвращаемыми сервером данными.
...
Рейтинг: 0 / 0
13.12.2021, 12:17
    #40119604
Nick74
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
alexeyvg,

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

Выполните
Код: sql
1.
2.
sp_configure 'disallow results from triggers', '0'
reconfigure



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

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

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

Код: sql
1.
2.
3.
4.
сообщение: 50000, уровень: 16, состояние: 1, процедура: dbo.FSM_VacationGraph_UpdateRows, строка: 62 [строка начала пакета: 22]
---Окончание отпуска должно быть до даты истечения срока контракта

Время выполнения: 2021-12-10T15:49:31.1266501+03:00


Э то все .


Другими словами: Это п-ц

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


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