【问题标题】:Double Results for a SQL Update StatementSQL 更新语句的双重结果
【发布时间】:2012-03-23 04:31:55
【问题描述】:

我已经为此苦恼了几个小时了......这就是发生的事情:

我运行这个语句

选择状态 来自 [dbo].[TMP_TEST_CALL_LIST] 其中身份 = '659303186000000000'

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

'是'

然后我运行这个语句

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

我明白了!!!:

(受影响的 1 行)

(受影响的 1 行)

好像两个语句会被执行!

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

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

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

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

H E L P ! ! !

谢谢。

注意:这是 SQL Server 2008 R2

【问题讨论】:

  • 检查表上是否有更新触发器。此外,如果您打开了显示执行计划,则会产生一个额外的行集,其中包含信息被发送到客户端

标签: sql-server sql-server-2008-r2 dbal


【解决方案1】:

触发器几乎肯定是罪魁祸首,尤其是当您仅在数据库中的某些表上发现此行为时。

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

如果您在 Management Studio 中展开 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'

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

【讨论】:

  • 是的!!!我在这两个表上都有触发器!你是个天才。我正在使用触发器来跟踪记录的最后更新日期时间。现在还有一个问题:你说“罪魁祸首”——有触发器有什么风险吗?还有其他方法可以实现吗?
  • 您好,从 2020 年开始。我刚刚接管了一个仍在生产中的旧数据库。这个答案目前与我非常相关!谢谢!
猜你喜欢
  • 2010-11-03
  • 1970-01-01
  • 2012-11-25
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多