我被要求實現一些代碼,這些代碼將更新MS SQL Server數據庫中的一行,然後使用存儲過程將更新插入到歷史記錄表中。由於我們不控制數據庫,因此我們無法添加存儲過程來執行此操作。我知道在存儲過程中,你可以做更新,然後調用另一個存儲過程執行。我可以將它設置爲使用一個SQL命令在代碼中執行此操作嗎?執行一個插入,然後登錄一個SQL命令
回答
要麼在同一個語句中運行它們(用分號分隔單獨的命令),要麼使用事務,以便在第二個語句失敗時可以回滾第一個語句。
信息不足 - 什麼SQL服務器?爲什麼要有歷史表?
觸發器會做這種事情。 MySQL的binlog可能對你更有用。
你說你不控制數據庫。你是否控制了訪問它的代碼?在那裏添加日誌並將其完全保留在SQL服務器之外。
應用程序使用歷史記錄表來顯示項目的更新。不只是用於恢復的事務日誌。 – osp70 2008-09-16 18:29:31
你並不需要爲此存儲過程。這個問題真的歸結爲你是否可以控制所有的插入。如果實際上您可以訪問所有插入,則可以簡單地將插入包裝到數據表中,並在單個轉換中插入到歷史表中。這將確保兩者都完成以發生「成功」。但是,在事務中按順序訪問表時,您需要確保不鎖定歷史表,然後再將數據表鎖定,否則可能會出現死鎖情況。
但是,如果您無法控制插入,則可以將觸發器添加到某些數據庫系統,以便您訪問修改,插入或刪除的數據。它可能會也可能不會給你所有你需要的數據,比如誰做了插入,更新或刪除,但它會告訴你什麼改變了。
謝謝你的回覆,下面是我最終做的事情的簡介。現在要測試一下,如果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;"
是的,在我的測試環境中刪除了存儲過程,當sql拋出錯誤時,更新必須已經回滾,因爲信息與開始時相同。感謝大家! – osp70 2008-09-16 19:24:23
- 1. 上一個命令完成後執行下一個命令
- 2. 執行第一個命令後,我將如何執行另一個SELECT命令?
- 3. 在ssh登錄後執行命令
- 4. 我如何重複sqlite命令行中執行的最後一個sql命令?
- 5. 第一個命令...然後是
- 6. 循環通過多個文件夾來執行命令,然後寫入另一個目錄中的文件
- 7. 在第一個sshpass被執行後無法執行sshpass命令
- 8. AutoIt:完成前一個命令後運行下一個命令
- 9. 只執行一次Sql命令一次
- 10. 執行一個命令行.exe文件
- 11. 執行多個命令行一次
- 12. 在一行中執行兩個命令
- 13. 使用一個插入命令插入多行
- 14. 遞歸改變目錄,並在每個執行一個命令
- 15. 執行兩個命令到R中的一個命令中
- 16. SQL對於每一行執行命令
- 17. 將2插入到一個命令中
- 18. 插入到表或從一個命令
- 19. DOS命令執行一個目錄和子目錄中的所有SQL腳本
- 20. 在cmd中執行幾個命令。執行只有一個命令
- 21. SQL'執行爲'登錄命令和Linq到SQL
- 22. 來自命令行的Mysql:執行sql代碼,然後執行sql腳本
- 23. m4 - 執行一個shell命令
- 24. Speak.js - 只執行一個命令
- 25. 一次執行多個Python命令
- 26. 定時執行一個函數/命令
- 27. 執行一個終端命令
- 28. 執行linux中前一個命令的最後一個輸出行
- 29. 使用bash讀取一個文件,然後從單詞執行命令提取
- 30. 擊 - 打開然後一個新的終端標籤執行命令
給你接受,因爲這促使我走下正確的道路。謝謝。 – osp70 2008-09-16 19:25:16