隨筆-204  評論-90  文章-8  trackbacks-0
          觸發器自動啟用事務,這個事務的取消會造成整個語句執行的失敗

          在自己的機器上試了一下.我的環境是:
          WINDOWS SERVER2003 SP1 + SQLSERVER2000 SP4 + ACCESS2003
          觸發器很簡單,只有一行:
          create trigger trg_update on testtb
          for update
          as
          insert into openrowset('Microsoft.Jet.OLEDB.4.0', 'd:\test.mdb';'admin';'',table1)(id) select id from testtb
          go

          更新表testtb時報錯:
          請求的操作未能執行,因為 OLE DB 提供程序 'Microsoft.Jet.OLEDB.4.0' 不支持所需的事務接口。
          OLE DB 錯誤跟蹤[OLE/DB Provider 'Microsoft.Jet.OLEDB.4.0' IUnknown:ueryInterface returned 0x80004002]。
          -------------------------------------------------------------------------------------
          如果在insert into openrowset(...)之前加上commit則成功,例如:
          alter trigger trg_update on testtb
          for update
          as
          begin transaction /*啟用嵌套事務*/
          ... /*嵌套事務內操作*/
          commit /*提交嵌套事務*/
          commit /*提交觸發器本身的隱性事務(即最外層事務)*/
          insert into openrowset('Microsoft.Jet.OLEDB.4.0', 'd:\test.mdb';'admin';'',table1)(id) select id from testtb
          go
          這樣做的實質是觸發器中必須顯示地使用commit提交觸發器本身的隱性事務.缺點是向ACCESS插入行的操作不在事務的控制范圍內,如果向 ACCESS插入行的操作失敗,那么觸發器中所有的操作均無法被回滾,因為commit已經結束了觸發器的事務,操作已經被保存了.這樣的觸發器實際上只 是做到了實時性,卻無法保證SQLSERVER與ACCESS之間的數據一致性.

          posted on 2008-02-28 19:46 一凡 閱讀(662) 評論(3)  編輯  收藏 所屬分類: DATABASE

          評論:
          # re: sqlserver觸發oracle問題... 2008-03-11 17:52 | king81118@126.com
          只是在insert into openrowset('Microsoft.Jet.OLEDB.4.0', 'd:\test.mdb';'admin';'',table1)(id) select id from testtb
          go
          前家個commit 就可以了嗎??
            回復  更多評論
            
          # re: sqlserver觸發oracle問題... 2008-03-19 14:40 | 一凡
          不是在go前,而是在insert前  回復  更多評論
            
          # re: sqlserver觸發oracle問題...[未登錄] 2009-07-17 17:56 | hh
          哥們,標題是“sqlserver觸發oracle問題...”怎么沒有oracle而是access?????????????????????????????????????????????????  回復  更多評論
            
          主站蜘蛛池模板: 阿巴嘎旗| 山西省| 利津县| 垣曲县| 六安市| 无为县| 喀什市| 鹤山市| 定兴县| 京山县| 丰台区| 铁岭县| 芦溪县| 固镇县| 宿松县| 宝应县| 石渠县| 双峰县| 岳阳市| 太湖县| 永年县| 汕尾市| 寿宁县| 丽水市| 怀来县| 台北市| 溆浦县| 文安县| 灵石县| 修文县| 敦化市| 南部县| 正定县| 崇仁县| 乃东县| 读书| 铁岭县| 泰宁县| 仙桃市| 化州市| 蓬溪县|