SQL Update语句的双重结果

Ama*_*ndo 2 sql-server sql-server-2008-r2 dbal

我已经用这个问题抓了几个小时......这就是发生的事情:

我运行这个声明

SELECT STATUS FROM [dbo].[TMP_TEST_CALL_LIST]其中identity ='659303186000000000'

我得到以下结果(单行):

'Y'

然后我运行这个声明

更新[dbo].[TMP_TEST_CALL_LIST]设置状态='Z',其中identity ='659303186000000000'

我得到了这个!!!:

(1排受影响)

(1排受影响)

好像有2个语句已被执行!

但它变得更糟......即使我像这样运行它:

更新[dbo].[TMP_TEST_CALL_LIST]设置状态='Z',其中identity ='659303186000000000'AND status ='Y'

它会给我同样的"双重"结果.如果我使用与任何记录不匹配的WHERE子句运行它,它将告诉我0行受影响...两次.

(甚至更多)令人毛骨悚然的事情是,这发生在数据库中的某些表中,而不是其他表.我无法弄清楚表之间的区别是什么.

救命 !!!

谢谢.

注意:这是SQL Server 2008 R2

Cod*_*ian 5

触发器几乎肯定是罪魁祸首,特别是如果您只是在数据库中的某些表上发现此行为.

触发器是在记录为INSERTED,UPDATED或DELETED(任何或所有这些)时执行的代码.通常,触发器用于实现业务规则,写入审计表等.这是在应用程序中普遍添加此类行为的便捷方式,无需重写大量代码.当然,缺点是缺乏透明度.触发器并不总是很明显,它们正在运行甚至存在.

如果tables在管理工作室中展开树,请找到一个以这种方式运行的表并进一步扩展.将有一个文件夹triggers,您可以展开该文件夹以查看在表上定义的任何触发器.

在此输入图像描述

您还可以执行查询以列出这样的触发器:

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'
Run Code Online (Sandbox Code Playgroud)

*图片来自本网站:http://www.mssqltips.com/sqlservertip/1380/disable-triggers-in-sql-server-2005/