台灣最大程式設計社群網站
線上人數
2328
 
會員總數:241178
討論主題:186829
歡迎您免費加入會員
討論區列表 >> MS SQL >> trigger失敗,可以讓資料正常寫入table,不要rollback嗎?
[ 變換順序 ]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
trigger失敗,可以讓資料正常寫入table,不要rollback嗎?
價值 : 100 QP  點閱數:816 回應數:21

樓主

studycode
門外漢
0 31
929 64
發送站內信

我在tableA有寫trigger,在insert及update時觸發,
假設在tableA新增一筆資料,但因trigger失敗造成 tableA的資料也新增不成功,
該如何讓 tableA 不管trigger 成功失敗,都照常 insert 呢?



搜尋相關Tags的文章: [ 觸發 ] , [ trigger ] , [ rollback ] ,
本篇文章發表於2017-04-18 15:45
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

風箏
檢舉此回應
參考參考



https://technet.microsoft.com/zh-tw/library/ms179296(v=sql.105).aspx




本篇文章回覆於2017-04-18 16:37
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

pilipala
檢舉此回應
DML 操作和 Trigger 都算在一個交易內,無法達到所說的 Trigger 失敗,但是 DML 操作仍然正常,
但可以試看看 Store Produre + Out 語法來取代 Trigger,這樣也許可以做到你要的需求
本篇文章回覆於2017-04-19 08:41
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

studycode
檢舉此回應
*原來SQL也有try catch 啊,手動執行OK,但放進Trigger一樣失敗後資料也insert不進去

*請問pilipala,Store Produre + Out 該怎麼取代Trigger 呢? 可以讓資料insert時自動去執行Store Produre嗎?
我試了把原本要trigger執行的sql另外寫在Store Produre裡(有try catch,Out錯誤代碼),然後在trigger裡呼叫,
一樣是insert失敗,不知pilipala說的是怎樣的方式??
本篇文章回覆於2017-04-19 09:31
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

pilipala
檢舉此回應
應該說是 output 語法,請參考 MSDN 文章下的範例說明
https://msdn.microsoft.com/zh-tw/library/ms177564.aspx
本篇文章回覆於2017-04-19 10:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

神來之筆
捐贈 VP 給 神來之筆 檢舉此回應
trigger跟原本inert/update是在同一交易
你既然不想把Table A和Trigger綁在一起, 就分開呼叫就好了
或是寫在同一Procedure
本篇文章回覆於2017-04-19 21:08
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

studycode
檢舉此回應
insert tableA 的部份我這邊無法做更改,因為是外包商寫的系統,
所以之前才會想自己寫trigger,
但怕是trigger失敗的話連insert的資料都被rollback,想查都無從查起~~

我有大概看一下output的用法,好像也是得去改廠商的insert語法,這我動不了。

將tableA與原本要trigger的處理分開....
是有想過設定schedule去檢查tableA新增哪些資料,再去做後續處理,
但最小的時間設定是十秒,不符我們需求。

目前好像也只能花錢請人家改insert語法....
本篇文章回覆於2017-04-20 09:46
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

風箏
檢舉此回應
那就換一個思維讓trigger不會失敗..
本篇文章回覆於2017-04-20 10:05
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
作者回應

studycode
檢舉此回應
風箏有什麼高見可讓Trigger不失敗嗎~~?
懇請賜教^^
本篇文章回覆於2017-04-20 10:48
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

studycode
檢舉此回應
啊~大概了解[風箏]的意思,是說trigger裡面的語法想辦法不要出現error嗎?
但就算想很多了,也總有意想不到的問題,偏偏try catch在trigger裡沒作用 ><
我不能承擔風險去讓tableA的insert資料被rollback
本篇文章回覆於2017-04-20 10:53
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

QOO
捐贈 VP 給 QOO 檢舉此回應
請問你的trigger是已經碰到什麼狀況,而導致失敗了嗎?? 

本篇文章回覆於2017-04-20 10:54
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
回應

風箏
檢舉此回應
舉例
trigger裡面如果你只是單純做LOG
那就比較容易遇到的是轉型上的失敗或者不允許null之類的錯誤
那可以考慮是否把欄位開成文字欄位允許null來寫入減少轉型上的失敗
本篇文章回覆於2017-04-20 11:00
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
作者回應

studycode
檢舉此回應
例如 tableA 有 seq,type,value三個欄位,
trigger要判斷type的值去更新不同的table,
是有碰到過欄位長度設太短字串就被截掉的錯誤,
但這是在sql management studio手動測試時測到的,才看得到錯誤訊息,
若是系統自己在跑,根本不知有什麼錯誤發生,然後insert資料就無聲無息自動消失了~
要更新的table太多,實在也無法完全掌握所有可能的錯誤~~
其實發生錯誤沒關係,我要是能記錄就好了,有記錄就可以做處理。
本篇文章回覆於2017-04-20 11:31
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
回應

風箏
檢舉此回應
tableA 有 seq,type,value三個欄位,
trigger要判斷type的值去更新不同的table,


這個問題感覺就算你trigger發生錯誤不阻斷
但你資料同步上會產生落差
你後面還是要修繕資料邏輯上的錯誤

感覺根本還是要回頭去改INSERT時候的邏輯
或者錯誤發生就要阻斷程序不讓髒資料產生
本篇文章回覆於2017-04-20 11:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
回應

劉詩雨
檢舉此回應
一路看下來好厲害,學習了。
推薦一款遊戲給你—[異能星域],科幻風格線上遊戲我在玩唷,如果你喜歡的話加我遊戲ID哦:詩雨,我也能拿到好康的。
本篇文章回覆於2017-04-20 11:48
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
作者回應

studycode
檢舉此回應
資料同步會產生落差沒關係,只要能記錄錯誤就可以去查問題並做後續處理,
我在測試時大都沒問題,就只是擔心某個時間發生了什麼未知的錯誤。

補說明一下trigger:
例如 tableA 有 seq,type,value三個欄位,
trigger要判斷type的值去抓取db1的table資料去更新相對應的db2 table資料
本篇文章回覆於2017-04-20 11:53
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
[ 變換順序 ]   

回覆
如要回應,請先登入.