触发器几乎肯定是罪魁祸首,尤其是如果你只发现数据库中的某些表此行为。
触发器是当记录被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'
*图像:http://www.mssqltips.com/sqlservertip/1380/disable-triggers-in-sql-server-2005/
检查是否有表上的更新触发器。另外,如果您已启用显示执行计划,则会产生额外的行集,并将信息发送给客户端 – Andomar 2012-03-05 17:29:47