台灣最大程式設計社群網站
線上人數
1245
 
會員總數:241740
討論主題:187051
歡迎您免費加入會員
討論區列表 >> MS SQL >> MS SQL Trigger 連續觸發問題
[ 變換順序 ]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
MS SQL Trigger 連續觸發問題
價值 : 50 QP  點閱數:287 回應數:6

樓主

Blake
門外漢
0 2
52 4
發送站內信


SQL server 2015資料庫有三個資料表分別為A、B、C,A資料表設有一個trigger 名為Ins_B 是寫入B資料表, B資料表設有一個trigger 名為Ins_C 是寫入C資料表,也就是當A資料表有變動時,會將資料寫入資料表B,但A資料表寫入B資料表後,資料表B上的trigger Ins_C卻沒將B資料表寫入C資料表內,請問各位高手,難道是無法作連續資料表的trigger處理嗎

搜尋相關Tags的文章: [ trigger ] ,
本篇文章發表於2017-11-20 11:16
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
把您的trigger 貼出來 才知道那裡有問題
本篇文章回覆於2017-11-21 08:54
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

Blake
檢舉此回應
不好意思,大致的資料表概念如下

[Table_A] 資料表欄位如下
FNO nvarchar(20)
FName nvarchar(100)
MID nvarchar(10)
UID nvarchar(10)
EResult nvarchar(2)


[Table_B] 資料表欄位如下
SNO 自動編號
FNO nvarchar(20)
MID nvarchar(10)
UID nvarchar(10)
EResult nvarchar(2)
DoDate datetime


[Table_C] 資料表欄位如下
SerialNo 自動編號
SNO int
FKind nvarchar(5)
DoDate datetime



當Table_A有資料寫入或更新時,會將資料寫入Table_B,示意如下

Create Trigger [dbo].[Ins_B]
on [dbo].[Table_A]
AFTER INSERT,UPDATE
as
BEGIN

SET NOCOUNT ON;
insert into [Table_B] (FNo,MID,UID,EResult,DoDate) select FNo,MID,UID,EResult,getdate() from inserted
END

這時資料會正確的寫入Table_B內,同時我在Table_B內在設一個Trigger Ins_C,當Table_B有資料寫入時,會立刻在寫入Table_C,但此時這段Trigger是沒被驅動的
Create Trigger [dbo].[Ins_C]
on [dbo].[Table_B]
AFTER INSERT
as
BEGIN
SET NOCOUNT ON;
insert into [Table_C] (SNO,FKind,DoDate) select SNO,FKind,DoDate from inserted
END

所以是要Table_A 有資料寫入時,會馬上寫入Table_B, 寫入Table_B時,又會立刻寫入Table_C,但為什麼不在Table_A設兩段trigger呢,主要是會有多個Table_A,而Table_C是會取得Table_B寫入資料時,產生的流水號,故須做連續資料表Trigger的動作,但不知是不是SQL Server 2015設定的問題,只有第一段Table_A 寫入 Table_B 有作用,Table_B 寫入Table_C 無反應
本篇文章回覆於2017-11-23 15:22
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
您的table_B
SNO 自動編號
FNO nvarchar(20)
MID nvarchar(10)
UID nvarchar(10)
EResult nvarchar(2)
DoDate datetime

reate Trigger [dbo].[Ins_C]
on [dbo].[Table_B]
AFTER INSERT
as
BEGIN
SET NOCOUNT ON;
insert into [Table_C] (SNO,FKind,DoDate) select SNO,FKind,DoDate from inserted
END

kfind欄位不見了
本篇文章回覆於2017-11-24 03:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

Blake
檢舉此回應
#真的有點難# 謝謝您撥空看我的問題,Fkind欄位應該是塞一個固定的值,是我寫錯了,正確如下


Create Trigger [dbo].[Ins_C]
on [dbo].[Table_B]
AFTER INSERT
as
BEGIN
SET NOCOUNT ON;
insert into [Table_C] (SNO,FKind,DoDate) select SNO,'1',DoDate from inserted
END

寫到Table_C的trigger有點寫錯,Table_C是有FKind欄位的, 我select inserted時是固定塞一個值進去的。

所以我的Trigger主要的目的是希望能Table_A 能 trigger 到 Table_B 後,再觸動Table_B的Trigger 寫到Table_C內。


本篇文章回覆於2017-11-27 10:41
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
你的Btable 的schema!?
本篇文章回覆於2017-11-27 19:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

Blake
檢舉此回應
[Table_A] 資料表欄位如下
FNO nvarchar(20)
FName nvarchar(100)
MID nvarchar(10)
UID nvarchar(10)
EResult nvarchar(2)


[Table_B] 資料表欄位如下
SNO 自動編號
FNO nvarchar(20)
MID nvarchar(10)
UID nvarchar(10)
EResult nvarchar(2)
DoDate datetime


[Table_C] 資料表欄位如下
SerialNo 自動編號
SNO int
FKind nvarchar(5)
DoDate datetime


資料表Table_A的Trigger如下
Create Trigger [dbo].[Ins_B]
on [dbo].[Table_A]
AFTER INSERT,UPDATE
as
BEGIN

SET NOCOUNT ON;
insert into [Table_B] (FNo,MID,UID,EResult,DoDate) select FNo,MID,UID,EResult,getdate() from inserted
END


資料表Table_B的Trigger如下
Create Trigger [dbo].[Ins_C]
on [dbo].[Table_B]
AFTER INSERT
as
BEGIN
SET NOCOUNT ON;
insert into [Table_C] (SNO,FKind,DoDate) select SNO,'1',DoDate from inserted
END

Table_A Trigger 後寫到 Table_B ,此時Table_B 再 Trigger 到 Table_C
本篇文章回覆於2017-11-29 16:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
[ 變換順序 ]   
1

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