2012-03-05 71 views
2

我一直在抓我的头,这对情侣已经小时双人结果......这是怎么回事:用于SQL UPDATE语句

我运行该语句

选择状态 FROM [DBO] [TMP_TEST_CALL_LIST] 其中同一性= '659303186000000000'

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

'Y'

然后我运行该语句

更新[DBO]。[TMP_TEST_CALL_LIST] 设置状态= 'Z' 其中身份= '659303186000000000'

我得到这个!!!:

(1行(S)的影响)

(1行(S)的影响)

好像2个语句将被执行!

但它变得更糟糕......即使我运行它是这样的:

更新[DBO] [TMP_TEST_CALL_LIST] 设置状态= 'Z' 其中身份= '659303186000000000' 和状态= 'Y'

它会给我相同的“双倍”结果。如果我用WHERE子句运行它,它不会匹配任何记录,它会告诉我影响了0行(两次)。

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

H E L P! ! !

谢谢。

注:这是SQL Server 2008 R2的

+3

检查是否有表上的更新触发器。另外,如果您已启用显示执行计划,则会产生额外的行集,并将信息发送给客户端 – Andomar 2012-03-05 17:29:47

回答

5

触发器几乎肯定是罪魁祸首,尤其是如果你只发现数据库中的某些表此行为。

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

如果您在管理工作室中展开tables树,请找到一个表现为这种方式并进一步扩展的表。将会有一个名为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/

+0

是的!我在这两个表上触发了这种情况!你是个天才。我使用触发器来跟踪记录更新的最后日期时间。现在另一个问题:你说的“罪魁祸首” - 触发器有没有风险?有没有其他的方式来完成这一点? – Amarundo 2012-03-05 17:57:55