請教一個觸發器級聯更新問題,源代碼開放,請幫忙檢查,修改,分不夠可以再加,謝謝!

时间:2021-06-07 16:03:28
在婁據表中有一個部件駔成表(Group_List)和一個部件明細表(List),表結構如下:
Group_List                                       List
序號  編號  部件號  人工金額  耗材金額             序號   產品編號   人工金額  耗材金額
1     998   001     1000     1000                1      001        950     750
2     998   002     1000     1000                2      001        50      250
其中序號是關鍵字且為自增型,Group_List.部件號=List.產品編號
現將List中"序號"為1的"人工金額"950改為800"耗材金額"由750改為550 
Group中的"部件號"為001的"人工金額"由1000要變為850"耗材金額"由1000改為800
若將List中"產品編號"為001的全部刪除則Group_List中"部件號"為001的"人工金額""耗材金額"都為0
我用以下語句卻不能達到我想要的效果,請高手指點,謝謝!
CREATE TRIGGER List_Total
 ON List
FOR  UPDATE, DELETE 
AS
if update(人工金額)
begin
declare @ManPric as float
declare @Old_ManPric as float
select @ManPric=人工金額 from inserted
select @Old_ManPric=人工金額 from deleted
update Group_List
set Group_List.人工金額=Group_List.人工金額+@ManPric-@Old_ManPric
where Group_List.部件號 in (select 人工金額 from deleted )
end

21 个解决方案

#1



if update(人工金額)  ?????????


你更新时候,难道也没有变化吗?

#2


第一个修改的使用instead of 触发器
create trigger T1 on list   --修改触发器
instead of update
as 
if update(人工金额) or update(耗材金额)
begin 
update group_list
set 人工金额=(人工金额-b.人工金额+c.人工金额),耗材金额=(耗材金额-b.耗材金额+c.产品编号)
from group_list a
inner join list b
on a.部件号=b.产品编号
inner join inserted c
on a.部件号=c.产品编号
end

#3


第二个使用for触发器:
create trigger T2 on list  --删除触发器
for delete
as 
update group_list
set 人工金额=0,耗材金额=0
where 部件号=(select 产品编号 from deleted)

#4


create trigger T1 on list   --修改触发器
instead of update
as 
if update(人工金额) or update(耗材金额)
begin 
update group_list
set 人工金额=(人工金额-b.人工金额+c.人工金额),耗材金额=(耗材金额-b.耗材金额+c.产品编号)
from group_list a
inner join list b
on a.部件号=b.产品编号
inner join inserted c
on a.部件号=c.产品编号

update list
set 人工金额=b.人工金额,耗材金额=b.耗材金额
from list a
inner join inserted b
on a.产品编号=b.产品编号
end

#5


frankwong(黄梓钿--快乐ing新爸爸^_^),謝謝你,但我在運行Check Syntax時提示為Error 207:invalill column name'人工金額'
invalill column name'耗材金額'
下面還有若干行這樣的提示
這是為什麼,你這裡不要declare語句嗎?請指教

#6


create trigger TR_List on List
for delete,update
as
if not exists (select * from inserted)
update a set a.人工金額=0,a.耗材金額=0 from Group_List as a,deleted as d where a.部件號=d.產品編號
else if update (人工金額) or update(耗材金額)
update a set a.人工金額=a.人工金額-(d.人工金額-i.人工金額),a.耗材金額=a.耗材金額-(d.耗材金額-i.耗材金額) from Group_List as a,inserted as i,deleted as d where a.部件號=i.產品編號 and a.部件號=d.產品編號 and i.產品編號=d.產品編號

#7


你用declare語句 把inserted 及deleted 中的相应字段的值取出来再进行去处理也可以;也可以不用declare語句 而直接用表之间的关联直接进行

#8


vinsonshen(猪骨褒咸鱼->味道没得顶):謝謝你的指點,我用你的方法雖然解決了修改問題,但我想List新增一筆同一產蛙鳴蟬噪品編號的"人工金額"或"耗材金額"時,在 Group_List中卻沒有反應,在觸發器中我作了相應的修改
for insert,delete,update
as
if not exists (select * from inserted)
update a set a.人工金額=0,a.耗材金額=0 from Group_List as a,deleted as d where a.部件號=d.產品編號
else if update (人工金額) or update(耗材金額)
update a set a.人工金額=a.人工金額-(d.人工金額-i.人工金額),a.耗材金額=a.耗材金額-(d.耗材金額-i.耗材金額) from Group_List as a,inserted as i,deleted as d where a.部件號=i.產品編號 and a.部件號=d.產品編號 and i.產品編號=d.產品編號
else if insert (人工金額) or insert(耗材金額)
update a set a.人工金額=a.人工金額+(d.人工金額+i.人工金額),a.耗材金額=a.耗材金額+(d.耗材金額+i.耗材金額) from Group_List as a,inserted as i,deleted as d where a.部件號=i.產品編號 and a.部件號=d.產品編號 and i.產品編號=d.產品編號
這裡要怎樣修改才使它有效,謝謝!

#9


為什麼用以上方法,刪除與新增都不行,這是為什麼?

#10


create trigger TR_List on List
for delete,update,insert
as
if not exists (select * from inserted)--删除
update a set a.人工金額=0,a.耗材金額=0 from Group_List as a,deleted as d where a.部件號=d.產品編號
else if not exists (select * from deleted)--插入
update a set a.人工金額=a.人工金額+i.人工金額,a.耗材金額=a.耗材金額+i.耗材金額 from Group_List as a,inserted as i where a.部件號=i.產品編號
else if update (人工金額) or update(耗材金額)--更新
update a set a.人工金額=a.人工金額-(d.人工金額-i.人工金額),a.耗材金額=a.耗材金額-(d.耗材金額-i.耗材金額) from Group_List as a,inserted as i,deleted as d where a.部件號=i.產品編號 and a.部件號=d.產品編號 and i.產品編號=d.產品編號

#11


楼主请注意:对于插入新数据那部分,我只是根据你大概意思写的(不知道是否符合你实际需求),你要根据你实际情况在“插入”那部分做适当修改吧

#12


frankwong(黄梓钿--快乐ing新爸爸^_^),謝謝你,但我在運行Check Syntax時提示為Error 207:invalill column name'人工金額'
invalill column name'耗材金額'
下面還有若干行這樣的提示
這是為什麼,你這裡不要declare語句嗎?請指教
//回楼主,错误提示是"人工金额"和"耗材金额"无效,你检查你的表是否有拼写错误.
无效用变量就可以不用呀

#13


学习! 没有使用就可能会报错

#14


為什麼用這樣的語句同時刪除或更新兩個表中相同的Item號時,總是提示為表中Item號太多:詳細錯誤信息是:Column name 'Item號' appears more than once in the result Column list,語法如下:
CREATE trigger ItemName
on MainItem_List 
for delete,update
as
if not exists (select * from inserted)--删除
delete a.Item號 from Zz_List_hp as a,inserted as i where a.Item號=i.產品編號
else if update (產品編號)
update a set a.Item號=d.產品編號,a.Item號=i.產品編號 from Zz_list_hp as a,inserted as i,deleted as d where a.Item號=i.產品編號 and a.Item號=d.產品編號 and i.產品編號=d.產品編號,
這個問題要怎樣解決,謝謝

#15


by i.產品編號
) s
where Group_List.產品編號 = s.產品編號
end
go

CREATE TRIGGER List_Total_d
 ON List
FOR   DELETE 
AS
begin
update Group_List
set 人工金額 =isnull(人工金額,0) - isnull(s.人工金額,0)
,耗材金額 =isnull(耗材金額,0)- isnull(s.耗材金額,0)
from (
select 產品編號 ,sum(人工金額) 人工金額 
,sum(耗材金額) 耗材金額
from delete 
group by 產品編號
) s
where Group_List.產品編號 = s.產品編號
end

#16


--你试试

CREATE TRIGGER List_Total_u
 ON List
FOR  UPDATE 
AS
if update(人工金額) or update(產品編號) or  update(耗材金額 )
begin
update Group_List
set 人工金額 =isnull(人工金額,0) + isnull(s.人工金額,0)
,耗材金額 =isnull(耗材金額,0)+ isnull(s.耗材金額,0)
from (
select i.產品編號 ,sum(i.人工金額-d.人工金額) 人工金額 
,sum(i.耗材金額 - d.耗材金額) 耗材金額
from delete d,insert i
where d.id=i.id
group by i.產品編號
) s
where Group_List.產品編號 = s.產品編號
end
go

CREATE TRIGGER List_Total_d
 ON List
FOR   DELETE 
AS
begin
update Group_List
set 人工金額 =isnull(人工金額,0) - isnull(s.人工金額,0)
,耗材金額 =isnull(耗材金額,0)- isnull(s.耗材金額,0)
from (
select 產品編號 ,sum(人工金額) 人工金額 
,sum(耗材金額) 耗材金額
from delete 
group by 產品編號
) s
where Group_List.產品編號 = s.產品編號
end

#17


"為什麼用這樣的語句同時刪除或更新兩個表中相同的Item號時,總是提示為表中Item號太多:詳細錯誤信息是:
Column name 'Item號' appears more than once in the result Column list"

-------------------------------------------------------------------
改成这样试试:
CREATE trigger ItemName
on MainItem_List 
for delete,update
as
if not exists (select * from inserted)--删除
-- delete a.Item號 from Zz_List_hp as a,inserted as i where a.Item號=i.產品編號  (语法有误:delete 表  where 条件)改成下面的:
delete a from Zz_List_hp as a,deleted as d where a.Item號=d.產品編號
else if update (產品編號)
/*
update a set a.Item號=d.產品編號,a.Item號=i.產品編號 from Zz_list_hp as a,inserted as i,deleted as d
 where a.Item號=i.產品編號 and a.Item號=d.產品編號 and i.產品編號=d.產品編號
*/--这句应该改成这样:
update a set a.Item號=i.產品編號 from Zz_list_hp as a,inserted as i,deleted as d
where a.Item號=i.產品編號 and a.Item號=d.產品編號 and i.產品編號=d.產品編號

--上面的我不知道你具体的需求,可以只大概改了成可以正确运行的SQL,操作结果是否满足你需求,楼主你自己适当改改吧。楼主,你SQL基本语法得再多多看看

#18


deodarsydn(deodar):謝謝你的指點,我的意思是刪除Group_Listk中部件號001時同時刪除List中兩個產品編號001,而不是你所說的數減少,是徹底刪除,

#19


frankwong(黄梓钿--快乐ing新爸爸^_^),謝謝你,但我在運行Check Syntax時提示為Error 207:invalill column name'人工金額'
invalill column name'耗材金額'
下面還有若干行這樣的提示
這是為什麼,你這裡不要declare語句嗎?請指教
//回楼主,错误提示是"人工金额"和"耗材金额"无效,你检查你的表是否有拼写错误.
无效用变量就可以不用呀


===================================
据我发现:“set 人工金额=(人工金额-b.人工金额+c.人工金额),耗材金额=(耗材金额-b.耗材金额+c.产品编号) ”
这句后面的算“耗材金额”是否错了,后面加的那个不是“c.产品编号” 而应该是“c.耗材金额”  

#20


vinsonshen(猪骨褒咸鱼->味道没得顶):謝謝你的指點和建義,刪除我用if not exists (select * from inserted)--删除
delete a from Zz_List_hp as a,deleted  as i where a.Item號=i.產品編號
已解決了但修改時用你的
else if update (產品編號)
            update a set a.Item號=i.產品編號 from Zz_list_hp as a,inserted as i,deleted as d
where a.Item號=i.產品編號 and a.Item號=d.產品編號 and i.產品編號=d.產品編號還是不行,再有就是在List沒有與Group_List中相同的產品編號時刪除,插入,修改都會報錯,這要在前面加一條什麼樣的判斷語句,謝謝!如果分不夠我再一個帖。

#21


up

#1



if update(人工金額)  ?????????


你更新时候,难道也没有变化吗?

#2


第一个修改的使用instead of 触发器
create trigger T1 on list   --修改触发器
instead of update
as 
if update(人工金额) or update(耗材金额)
begin 
update group_list
set 人工金额=(人工金额-b.人工金额+c.人工金额),耗材金额=(耗材金额-b.耗材金额+c.产品编号)
from group_list a
inner join list b
on a.部件号=b.产品编号
inner join inserted c
on a.部件号=c.产品编号
end

#3


第二个使用for触发器:
create trigger T2 on list  --删除触发器
for delete
as 
update group_list
set 人工金额=0,耗材金额=0
where 部件号=(select 产品编号 from deleted)

#4


create trigger T1 on list   --修改触发器
instead of update
as 
if update(人工金额) or update(耗材金额)
begin 
update group_list
set 人工金额=(人工金额-b.人工金额+c.人工金额),耗材金额=(耗材金额-b.耗材金额+c.产品编号)
from group_list a
inner join list b
on a.部件号=b.产品编号
inner join inserted c
on a.部件号=c.产品编号

update list
set 人工金额=b.人工金额,耗材金额=b.耗材金额
from list a
inner join inserted b
on a.产品编号=b.产品编号
end

#5


frankwong(黄梓钿--快乐ing新爸爸^_^),謝謝你,但我在運行Check Syntax時提示為Error 207:invalill column name'人工金額'
invalill column name'耗材金額'
下面還有若干行這樣的提示
這是為什麼,你這裡不要declare語句嗎?請指教

#6


create trigger TR_List on List
for delete,update
as
if not exists (select * from inserted)
update a set a.人工金額=0,a.耗材金額=0 from Group_List as a,deleted as d where a.部件號=d.產品編號
else if update (人工金額) or update(耗材金額)
update a set a.人工金額=a.人工金額-(d.人工金額-i.人工金額),a.耗材金額=a.耗材金額-(d.耗材金額-i.耗材金額) from Group_List as a,inserted as i,deleted as d where a.部件號=i.產品編號 and a.部件號=d.產品編號 and i.產品編號=d.產品編號

#7


你用declare語句 把inserted 及deleted 中的相应字段的值取出来再进行去处理也可以;也可以不用declare語句 而直接用表之间的关联直接进行

#8


vinsonshen(猪骨褒咸鱼->味道没得顶):謝謝你的指點,我用你的方法雖然解決了修改問題,但我想List新增一筆同一產蛙鳴蟬噪品編號的"人工金額"或"耗材金額"時,在 Group_List中卻沒有反應,在觸發器中我作了相應的修改
for insert,delete,update
as
if not exists (select * from inserted)
update a set a.人工金額=0,a.耗材金額=0 from Group_List as a,deleted as d where a.部件號=d.產品編號
else if update (人工金額) or update(耗材金額)
update a set a.人工金額=a.人工金額-(d.人工金額-i.人工金額),a.耗材金額=a.耗材金額-(d.耗材金額-i.耗材金額) from Group_List as a,inserted as i,deleted as d where a.部件號=i.產品編號 and a.部件號=d.產品編號 and i.產品編號=d.產品編號
else if insert (人工金額) or insert(耗材金額)
update a set a.人工金額=a.人工金額+(d.人工金額+i.人工金額),a.耗材金額=a.耗材金額+(d.耗材金額+i.耗材金額) from Group_List as a,inserted as i,deleted as d where a.部件號=i.產品編號 and a.部件號=d.產品編號 and i.產品編號=d.產品編號
這裡要怎樣修改才使它有效,謝謝!

#9


為什麼用以上方法,刪除與新增都不行,這是為什麼?

#10


create trigger TR_List on List
for delete,update,insert
as
if not exists (select * from inserted)--删除
update a set a.人工金額=0,a.耗材金額=0 from Group_List as a,deleted as d where a.部件號=d.產品編號
else if not exists (select * from deleted)--插入
update a set a.人工金額=a.人工金額+i.人工金額,a.耗材金額=a.耗材金額+i.耗材金額 from Group_List as a,inserted as i where a.部件號=i.產品編號
else if update (人工金額) or update(耗材金額)--更新
update a set a.人工金額=a.人工金額-(d.人工金額-i.人工金額),a.耗材金額=a.耗材金額-(d.耗材金額-i.耗材金額) from Group_List as a,inserted as i,deleted as d where a.部件號=i.產品編號 and a.部件號=d.產品編號 and i.產品編號=d.產品編號

#11


楼主请注意:对于插入新数据那部分,我只是根据你大概意思写的(不知道是否符合你实际需求),你要根据你实际情况在“插入”那部分做适当修改吧

#12


frankwong(黄梓钿--快乐ing新爸爸^_^),謝謝你,但我在運行Check Syntax時提示為Error 207:invalill column name'人工金額'
invalill column name'耗材金額'
下面還有若干行這樣的提示
這是為什麼,你這裡不要declare語句嗎?請指教
//回楼主,错误提示是"人工金额"和"耗材金额"无效,你检查你的表是否有拼写错误.
无效用变量就可以不用呀

#13


学习! 没有使用就可能会报错

#14


為什麼用這樣的語句同時刪除或更新兩個表中相同的Item號時,總是提示為表中Item號太多:詳細錯誤信息是:Column name 'Item號' appears more than once in the result Column list,語法如下:
CREATE trigger ItemName
on MainItem_List 
for delete,update
as
if not exists (select * from inserted)--删除
delete a.Item號 from Zz_List_hp as a,inserted as i where a.Item號=i.產品編號
else if update (產品編號)
update a set a.Item號=d.產品編號,a.Item號=i.產品編號 from Zz_list_hp as a,inserted as i,deleted as d where a.Item號=i.產品編號 and a.Item號=d.產品編號 and i.產品編號=d.產品編號,
這個問題要怎樣解決,謝謝

#15


by i.產品編號
) s
where Group_List.產品編號 = s.產品編號
end
go

CREATE TRIGGER List_Total_d
 ON List
FOR   DELETE 
AS
begin
update Group_List
set 人工金額 =isnull(人工金額,0) - isnull(s.人工金額,0)
,耗材金額 =isnull(耗材金額,0)- isnull(s.耗材金額,0)
from (
select 產品編號 ,sum(人工金額) 人工金額 
,sum(耗材金額) 耗材金額
from delete 
group by 產品編號
) s
where Group_List.產品編號 = s.產品編號
end

#16


--你试试

CREATE TRIGGER List_Total_u
 ON List
FOR  UPDATE 
AS
if update(人工金額) or update(產品編號) or  update(耗材金額 )
begin
update Group_List
set 人工金額 =isnull(人工金額,0) + isnull(s.人工金額,0)
,耗材金額 =isnull(耗材金額,0)+ isnull(s.耗材金額,0)
from (
select i.產品編號 ,sum(i.人工金額-d.人工金額) 人工金額 
,sum(i.耗材金額 - d.耗材金額) 耗材金額
from delete d,insert i
where d.id=i.id
group by i.產品編號
) s
where Group_List.產品編號 = s.產品編號
end
go

CREATE TRIGGER List_Total_d
 ON List
FOR   DELETE 
AS
begin
update Group_List
set 人工金額 =isnull(人工金額,0) - isnull(s.人工金額,0)
,耗材金額 =isnull(耗材金額,0)- isnull(s.耗材金額,0)
from (
select 產品編號 ,sum(人工金額) 人工金額 
,sum(耗材金額) 耗材金額
from delete 
group by 產品編號
) s
where Group_List.產品編號 = s.產品編號
end

#17


"為什麼用這樣的語句同時刪除或更新兩個表中相同的Item號時,總是提示為表中Item號太多:詳細錯誤信息是:
Column name 'Item號' appears more than once in the result Column list"

-------------------------------------------------------------------
改成这样试试:
CREATE trigger ItemName
on MainItem_List 
for delete,update
as
if not exists (select * from inserted)--删除
-- delete a.Item號 from Zz_List_hp as a,inserted as i where a.Item號=i.產品編號  (语法有误:delete 表  where 条件)改成下面的:
delete a from Zz_List_hp as a,deleted as d where a.Item號=d.產品編號
else if update (產品編號)
/*
update a set a.Item號=d.產品編號,a.Item號=i.產品編號 from Zz_list_hp as a,inserted as i,deleted as d
 where a.Item號=i.產品編號 and a.Item號=d.產品編號 and i.產品編號=d.產品編號
*/--这句应该改成这样:
update a set a.Item號=i.產品編號 from Zz_list_hp as a,inserted as i,deleted as d
where a.Item號=i.產品編號 and a.Item號=d.產品編號 and i.產品編號=d.產品編號

--上面的我不知道你具体的需求,可以只大概改了成可以正确运行的SQL,操作结果是否满足你需求,楼主你自己适当改改吧。楼主,你SQL基本语法得再多多看看

#18


deodarsydn(deodar):謝謝你的指點,我的意思是刪除Group_Listk中部件號001時同時刪除List中兩個產品編號001,而不是你所說的數減少,是徹底刪除,

#19


frankwong(黄梓钿--快乐ing新爸爸^_^),謝謝你,但我在運行Check Syntax時提示為Error 207:invalill column name'人工金額'
invalill column name'耗材金額'
下面還有若干行這樣的提示
這是為什麼,你這裡不要declare語句嗎?請指教
//回楼主,错误提示是"人工金额"和"耗材金额"无效,你检查你的表是否有拼写错误.
无效用变量就可以不用呀


===================================
据我发现:“set 人工金额=(人工金额-b.人工金额+c.人工金额),耗材金额=(耗材金额-b.耗材金额+c.产品编号) ”
这句后面的算“耗材金额”是否错了,后面加的那个不是“c.产品编号” 而应该是“c.耗材金额”  

#20


vinsonshen(猪骨褒咸鱼->味道没得顶):謝謝你的指點和建義,刪除我用if not exists (select * from inserted)--删除
delete a from Zz_List_hp as a,deleted  as i where a.Item號=i.產品編號
已解決了但修改時用你的
else if update (產品編號)
            update a set a.Item號=i.產品編號 from Zz_list_hp as a,inserted as i,deleted as d
where a.Item號=i.產品編號 and a.Item號=d.產品編號 and i.產品編號=d.產品編號還是不行,再有就是在List沒有與Group_List中相同的產品編號時刪除,插入,修改都會報錯,這要在前面加一條什麼樣的判斷語句,謝謝!如果分不夠我再一個帖。

#21


up