隨筆-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 一凡 閱讀(663) 評論(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?????????????????????????????????????????????????  回復  更多評論
            
          主站蜘蛛池模板: 城固县| 丰原市| 建始县| 临沭县| 南溪县| 泸定县| 乐平市| 准格尔旗| 渑池县| 海宁市| 江川县| 尖扎县| 武功县| 桑植县| 迭部县| 积石山| 棋牌| 霍林郭勒市| 达日县| 祁连县| 平罗县| 罗甸县| 前郭尔| 会东县| 兖州市| 芜湖县| 紫云| 涟源市| 新竹县| 苍山县| 无锡市| 华蓥市| 正蓝旗| 乐山市| 红桥区| 金乡县| 卫辉市| 从江县| 察雅县| 东丰县| 奉贤区|