Двойные результаты для оператора обновления SQL - PullRequest
2 голосов
/ 05 марта 2012

Я уже несколько часов чесал голову этим ... Вот что происходит:

Я запускаю это утверждение

ВЫБРАТЬ СТАТУС FROM [dbo]. [TMP_TEST_CALL_LIST] где идентичность = '659303186000000000'

и я получаю следующий результат ( одна строка ):

'Y'

Тогда я запускаю это утверждение

обновление [dbo]. [TMP_TEST_CALL_LIST] установить статус = 'Z' где идентичность = '659303186000000000'

и я ЭТО получаю !!!:

(затронут 1 ряд)

(затронут 1 ряд)

Как будто 2 оператора были бы выполнены!

Но становится хуже ... даже если я запустил это так:

обновление [dbo]. [TMP_TEST_CALL_LIST] установить статус = 'Z' где идентичность = '659303186000000000' И статус = 'Y'

это даст мне такой же "двойной" результат. И если я запустю его с предложением WHERE, которое не соответствует ни одной записи, он сообщит мне, что затронуло 0 строк ... дважды.

(Еще больше) жуткая вещь в том, что это происходит с некоторыми таблицами в БД, а не с другими. Я не могу понять, в чем различия между таблицами.

H E L P! ! !

Спасибо.

Примечание: это SQL Server 2008 R2

1 Ответ

5 голосов
/ 05 марта 2012

Триггеры почти наверняка являются виновниками, особенно если вы обнаруживаете такое поведение только в определенных таблицах в базе данных.

Триггер - это код, который выполняется, когда запись ВСТАВЛЕНА, ОБНОВЛЕНА или УДАЛЕНА (любая или все из них). Обычно триггеры используются для реализации бизнес-правил, записи в таблицы аудита и т. Д. Это удобный способ универсального добавления такого рода поведения в приложение без необходимости переписывать много кода. Недостатком является, конечно, отсутствие прозрачности. Триггеры не всегда очевидны, если они запущены или даже существуют.

Если развернуть дерево tables в Management Studio, найдите одну таблицу, которая ведет себя таким образом, и разверните ее дальше. Там будет папка с именем triggers, которую можно развернуть, чтобы увидеть любые триггеры, определенные в таблице.

enter image description here

Вы также можете выполнить запрос для вывода списка триггеров, например:

SELECT trigger_name = sysobjects.name, trigger_owner = USER_NAME(sysobjects.uid),table_schema = s.name, table_name = OBJECT_NAME(parent_obj),
  isupdate = OBJECTPROPERTY( id, 'ExecIsUpdateTrigger'), isdelete = OBJECTPROPERTY( id, 'ExecIsDeleteTrigger'),
  isinsert = OBJECTPROPERTY( id, 'ExecIsInsertTrigger'), isafter = OBJECTPROPERTY( id, 'ExecIsAfterTrigger'),
  isinsteadof = OBJECTPROPERTY( id, 'ExecIsInsteadOfTrigger'),
  [disabled] = OBJECTPROPERTY(id, 'ExecIsTriggerDisabled') 
FROM sysobjects INNER JOIN sysusers ON sysobjects.uid = sysusers.uid
    INNER JOIN sys.tables t 
        ON sysobjects.parent_obj = t.object_id
    INNER JOIN sys.schemas s 
        ON t.schema_id = s.schema_id
WHERE sysobjects.type = 'TR'

* изображение взято с этого сайта: http://www.mssqltips.com/sqlservertip/1380/disable-triggers-in-sql-server-2005/

...