При настройке репликации в Sql Server 2008 система создает триггеры для каждой реплицированной таблицы, чтобы облегчить передачу данных в подписные базы данных.Системные триггеры для репликации и опция NOCOUNT
Можно ли ожидать, что поведение системных триггеров будет использоваться SET NOCOUNT ON
, чтобы предотвратить их действия, влияющие на значение функции @@ROWCOUNT
?
фон
Я использую NHibernate с Sql серверной базы данных Server 2008. В базе данных включена репликация, которая создает сгенерированные системой триггеры в опубликованных таблицах для облегчения передачи данных подписчикам.
Без репликации все работает нормально, но с репликацией строки NHibernate повлияли на проверки проверки. Количество строк, которые ADO.Net говорит, что это повлияло, похоже, включает строки, затронутые связанным триггером, в дополнение к строкам, затронутым самой командой.
В исходном вопросе я упомянул функцию сервера Sql @@ROWCOUNT
, но я действительно имею в виду значение «rows affected», возвращаемое методом ADO.Net ExecuteNonQuery
. Я полагаю, что я работал над предположением (возможно, неправильно), что тот был подан первым.
В качестве временного решения мы модифицировали триггеры репликации, чтобы добавить SET NOCOUNT ON
перед любыми обновлениями и отменить это после завершения любых обновлений. В настоящее время это решает нашу проблему, но не является жизнеспособным постоянным решением. Согласно полученным советам и здравому смыслу, редактирование системных триггеров не рекомендуется.
Это, однако, указывает мне, что мы определили точную проблему. Строки, затронутые триггерами, включаются в итоговые строки, на которые ссылается счетчик для текущей команды. NHibernate ожидает, что будет затронуто только известное количество строк, оно не предусматривает каких-либо неизвестных (в отношении NHibernate) триггеров, добавляющих к этому счету.
В настоящее время мы изучаем варианты, которые включают расширение NHibernate, чтобы добавить способность справляться с этим или, по крайней мере, подавлять это. Наши ресурсы включают this SO question.
Я также нашел this post, который предположил, что сгенерированные системой триггеры уже установили опцию NOCOUNT в положение ON по умолчанию, отрицая необходимость их изменения. Для нас это определенно не так, поэтому я задавался вопросом, почему это может быть.
- Какова ситуация по умолчанию в отношении сгенерированных системой триггеров?
- Является ли поведение настраиваемым?
- Это зависит от типа репликации - слияния, транзакции?
Согласно книге онлайн, функция @@ ROWCOUNT обновляется, даже если SET NOCOUNT включен. Так что ваш вопрос неясен; у вас есть конкретная проблема? – Pondlife 2010-12-06 12:10:23
Да, у меня было ощущение, что это будет слишком кратковременно. У меня есть склонность к размышлениям в вопросах, но думаю, что на этот раз я пошел слишком далеко. Я разработаю ... – 2010-12-06 12:28:04