gpt4 book ai didi

sql-server - SQL 更新语句的双重结果

转载 作者:行者123 更新时间:2023-12-04 02:19:26 25 4
gpt4 key购买 nike

几个小时以来,我一直在为这个问题挠头……这就是正在发生的事情:

我运行这条语句

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

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

'Y'

然后我运行这条语句

update [dbo].[TMP_TEST_CALL_LIST] set status='Z' where identity = '659303186000000000'

我明白了!!!:

(1 row(s) affected)

(1 row(s) affected)

好像执行了 2 条语句!

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

update [dbo].[TMP_TEST_CALL_LIST] set status='Z' where identity = '659303186000000000' AND status ='Y'

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

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

嘿嘿! ! !

谢谢。

注意:这是 SQL Server 2008 R2

最佳答案

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

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

如果您在 management studio 中展开 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/

关于sql-server - SQL 更新语句的双重结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9571119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com