2008-09-16 107 views
0

我被要求實現一些代碼,這些代碼將更新MS SQL Server數據庫中的一行,然後使用存儲過程將更新插入到歷史記錄表中。由於我們不控制數據庫,因此我們無法添加存儲過程來執行此操作。我知道在存儲過程中,你可以做更新,然後調用另一個存儲過程執行。我可以將它設置爲使用一個SQL命令在代碼中執行此操作嗎?執行一個插入,然後登錄一個SQL命令

回答

1

要麼在同一個語句中運行它們(用分號分隔單獨的命令),要麼使用事務,以便在第二個語句失敗時可以回滾第一個語句。

+0

給你接受,因爲這促使我走下正確的道路。謝謝。 – osp70 2008-09-16 19:25:16

0

你也可以創建sql觸發器。

+0

如果他不能創建一個存儲過程,他幾乎肯定無法創建觸發器 – foxxtrot 2008-09-16 18:26:36

0

根據您的庫,通常可以將兩個查詢都放在一個命令字符串中,並用分號分隔。

+0

謝謝,這是用vb.net 2005年我會嘗試分號MS SQL。 – osp70 2008-09-16 18:28:41

0

信息不足 - 什麼SQL服務器?爲什麼要有歷史表?

觸發器會做這種事情。 MySQL的binlog可能對你更有用。

你說你不控制數據庫。你是否控制了訪問它的代碼?在那裏添加日誌並將其完全保留在SQL服務器之外。

+0

應用程序使用歷史記錄表來顯示項目的更新。不只是用於恢復的事務日誌。 – osp70 2008-09-16 18:29:31

1

你並不需要爲此存儲過程。這個問題真的歸結爲你是否可以控制所有的插入。如果實際上您可以訪問所有插入,則可以簡單地將插入包裝到數據表中,並在單個轉換中插入到歷史表中。這將確保兩者都完成以發生「成功」。但是,在事務中按順序訪問表時,您需要確保不鎖定歷史表,然後再將數據表鎖定,否則可能會出現死鎖情況。

但是,如果您無法控制插入,則可以將觸發器添加到某些數據庫系統,以便您訪問修改,插入或刪除的數據。它可能會也可能不會給你所有你需要的數據,比如誰做了插入,更新或刪除,但它會告訴你什麼改變了。

0

謝謝你的回覆,下面是我最終做的事情的簡介。現在要測試一下,如果trans發生故障,實際上是否會回滾。

sSQL = "BEGIN TRANSACTION;" & _ 
      " Update table set col1 = @col1, col2 = @col2" & _ 
      " where col3 = @col3 and " & _ 
      " EXECUTE addcontacthistoryentry @parm1, @parm2, @parm3, @parm4, @parm5, @parm6; " & _ 
      "COMMIT TRANSACTION;" 
+0

是的,在我的測試環境中刪除了存儲過程,當sql拋出錯誤時,更新必須已經回滾,因爲信息與開始時相同。感謝大家! – osp70 2008-09-16 19:24:23