3

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

我运行这个语句

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

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

'是'

然后我运行这个语句

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

我明白了!!!:

(1 行受影响)

(1 行受影响)

好像两个语句会被执行!

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

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

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

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

帮助 !!!

谢谢。

注意:这是 SQL Server 2008 R2

4

1 回答 1

6

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

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

如果您tables在 management studio 中展开树,请找到一个以这种方式运行的表并进一步展开它。将有一个名为的文件夹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/

于 2012-03-05T17:42:13.063 回答