close

由於最近常有使用者提出系統"自動"變更資料或刪除資料,雖然覺得不太可能,但一直苦無證據,就在我要檢查原因時,使用者就已經先變更資料了,最後更新日期與變更人員這兩個欄位的資料都也已經不是當時的資料了,所以一直沒辦法證實是使用者自行變更,所以在系統中增加使用者如果操作Update、Delete的動作,便新增一筆變更前的資料至備份資料庫中這個功能。


我使用資料庫的觸發程序來進行相關的儲存,另外為了怕使用者說是我用他們的帳號去修改資料,所以也順便增加了紀錄IP的欄位,Update這個動作比較簡單,比較奇怪的是Delete這個動作,因為最新的資料都會在原來資料表中,所以在執行Delete動作前,要先執行一小段Update的敘述句,為的就是把最後一次編輯的資料儲存到備份資料表中,這樣才可知道最後的刪除者是那個使用者。

另外也有想過將要Delete的資料,開個欄位標記這筆資料已經刪除就好了,但考慮了一下之後,覺得這些資料如果沒有要用(還是要留下來備查)何通通擠在同一張資料表中呢?所以不考慮這個方式,底下是刪除敘述句(SqlDataSource->DeleteCommand):


UPDATE XXX SET IP=@IP, UpdateDt = getDate() WHERE ID = @ID
DELETE XXX WHERE ID = @ID


XXX為資料表名稱,已經設定Update與Delete的觸發程序,但看一看應該沒有問題,但執行刪除動作時,卻出現以下的錯誤訊息:

指定的引數超出有效值的範圍。
參數名稱: value
描述: 在執行目前 Web 要求的過程中發生未處理的例外情形。請檢閱堆疊追蹤以取得錯誤的詳細資訊,以及在程式碼中產生的位置。
例外詳細資訊: System.ArgumentOutOfRangeException: 指定的引數超出有效值的範圍。
參數名稱: value

而且這個錯誤訊息很奇怪,如果我先新增二筆資料,刪除其中一筆資料是不會出現錯誤訊息的,但刪除剩下一筆之後卻會出現錯誤訊息,一直以為是觸發程序的問題,但清除觸發程序後,還是出現相同的情況,之後刪除敘述句加上兩行,變成:


SET NOCOUNT ON;

UPDATE XXX SET IP=@IP, UpdateDt = getDate() WHERE ID = @ID
DELETE XXX WHERE ID = @ID

SET NOCOUNT OFF;

就可以正常執行了,現在還不知道確切發生原因,等確定後會再說明。

arrow
arrow
    全站熱搜

    souts 發表在 痞客邦 留言(0) 人氣()