Разработчики MS SQL Server 2008 открыто пишут в комментариях к коду о имеющихся багах

На работе мы внедряем SQL Server 2008, в частности распределенную базу через репликацию слиянием (merge replication) и в теле кода триггера, который автоматически генерируется сервером во всех реплицируемых базах видим следующее:

— Should use @@rowcount below but there is a bug because of which sometimes in the presence of

— other triggers on the table, the @@rowcount cannot be relied on.

Вольный перевод:

Хорошо бы использовать ниже функцию @@rowcount но есть баг, из-за которого в случае присутствия в таблице других триггеров, на @@rowcount нельзя надеяться.

Т.е. разработчики SQL 2008 открыто пишут — есть баг, поэтому не пользуйтесь этой функцией! :)

 

Кстати! Очень важная инфа по триггерам, то на что мы напоролись в своем внедрении, потому что тупо не внимательно читали справку. Когда есть реплицированная база со слиянием (merge replication) использовать команду полного отключения триггеров — НЕЛЬЗЯ!

DISABLE TRIGGER (Transact-SQL)

Внимание!

SQL Server создает триггеры в базах данных, опубликованных для репликации слиянием. Если в опубликованных базах данных указано значение ALL, то эти триггеры отключаются, что прерывает репликацию. Перед тем как задавать значение ALL, убедитесь, что текущая база данных не опубликована для репликации слиянием.

Когда отключаешь все триггеры в такой базе — отключаются ВСЕ триггеры, в т.ч. автоматически созданные самим сервером для поддержки репликации. В результате любые изменения в данных в таблицах с отключенными триггерами репликации выходят их из реплики и агент репликации их просто пропускает. В логах при этом отображается ошибка:

Unable to synchronize the row because the row was updated by a different process outside of replication.

Исправить это дело у нас не получилось никак, кроме как повторным разворачиваением снэпшота.

Добавить комментарий

*