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
触发器几乎肯定是罪魁祸首,特别是如果您只是在数据库中的某些表上发现此行为.
触发器是在记录为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/