2012-03-05 132 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