tab_pers_info
pers_id 主键
pers_no
pers_name图书借阅登记
id 主键
学号
姓名
图书编号
是否归还现在我要级联修改,写了这样一个触发器
alter trigger alter_student_basicon dbo.tab_pers_info
for update
as if update(pers_no) or update(pers_name)
set nocount on
declare @student_number varchar(20)
set @student_number=(select pers_no from deleted)
declare @学号 varchar(20)
set @学号=(select pers_no from inserted)
declare @姓名 varchar(20)
set @姓名=(select pers_name from inserted)
update 图书借阅登记 set 借阅人学号=@学号,借阅人姓名=@姓名 where 借阅人学号=@student_number图书借阅登记里还有一个触发 器CREATE trigger trigger_update
on dbo.图书借阅登记
for update
as if update(是否归还)
set nocount on
DECLARE @借阅数量 tinyint
SET @借阅数量 = (SELECT 借阅数量 FROM Deleted)
DECLARE @借阅图书编号 varchar(20)
SET @借阅图书编号=(SELECT 借阅图书编号 FROM Deleted)
update 图书信息表 set 库存数量=库存数量+@借阅数量 where 图书编号=@借阅图书编号如果在图书借阅登记表里有重复学号,修改tab_pers_info时就会出现返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时
没有重复学号时可以修改
这个怎么解决?
pers_id 主键
pers_no
pers_name图书借阅登记
id 主键
学号
姓名
图书编号
是否归还现在我要级联修改,写了这样一个触发器
alter trigger alter_student_basicon dbo.tab_pers_info
for update
as if update(pers_no) or update(pers_name)
set nocount on
declare @student_number varchar(20)
set @student_number=(select pers_no from deleted)
declare @学号 varchar(20)
set @学号=(select pers_no from inserted)
declare @姓名 varchar(20)
set @姓名=(select pers_name from inserted)
update 图书借阅登记 set 借阅人学号=@学号,借阅人姓名=@姓名 where 借阅人学号=@student_number图书借阅登记里还有一个触发 器CREATE trigger trigger_update
on dbo.图书借阅登记
for update
as if update(是否归还)
set nocount on
DECLARE @借阅数量 tinyint
SET @借阅数量 = (SELECT 借阅数量 FROM Deleted)
DECLARE @借阅图书编号 varchar(20)
SET @借阅图书编号=(SELECT 借阅图书编号 FROM Deleted)
update 图书信息表 set 库存数量=库存数量+@借阅数量 where 图书编号=@借阅图书编号如果在图书借阅登记表里有重复学号,修改tab_pers_info时就会出现返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时
没有重复学号时可以修改
这个怎么解决?
on dbo.图书借阅登记
for update
as if update(是否归还)
set nocount on
update A Set 库存数量= A.库存数量+ B.借阅数量
From 图书信息表 A Inner Join (Select 借阅图书编号, SUM(借阅数量) As 借阅数量 From Deleted Group By 借阅图书编号) B
ON A.图书编号 = B.借阅图书编号
GO
SET @借阅数量 = (SELECT 借阅数量 FROM Deleted)最好將你的所有觸發器都做更改,這樣的寫法有問題。
这样写有什么缺点?
-----------------還沒發現?!看你的錯誤信息就知道了。如果一次更新一條沒問題,但是一旦更新多條就會出問題。
SET @借阅数量 = (SELECT 借阅数量 FROM Deleted)
------------錯誤提示的不是很明顯了?“返回的值多于一个”如果更新的數據超過一條,那麼
SELECT 借阅数量 FROM Deleted
這個子查詢的結果中的數據就不止一條,就會報錯了。
SET @借阅数量 = (SELECT 借阅数量 FROM Deleted)
是在update (是否归还)时才触发的
而
alter trigger alter_student_basicon dbo.tab_pers_info
for update
as if update(pers_no) or update(pers_name)
是更新 pers_no or pers_name
这个跟新并不触发图书借阅登记里的那个触发器
能不能帮我解释一下上面那个问题,我马上结贴
我试了一下,可以了,这几天谢谢paoluo(一天到晚游泳的鱼),又学到了新的东西
能不能帮我解释一下上面那个问题,我马上结贴
------------------這個問題,是由於你的基礎沒打好。如果if中包含多個語句,需要將語句放入begin...end中
CREATE trigger trigger_update
on dbo.图书借阅登记
for update
as if update(是否归还)
begin
set nocount on
DECLARE @借阅数量 tinyint
SET @借阅数量 = (SELECT 借阅数量 FROM Deleted)
DECLARE @借阅图书编号 varchar(20)
SET @借阅图书编号=(SELECT 借阅图书编号 FROM Deleted)
update 图书信息表 set 库存数量=库存数量+@借阅数量 where 图书编号=@借阅图书编号
end這樣的話,應該不會報錯。不過,還是提醒你,以後不要這樣寫觸發器DECLARE @借阅数量 tinyint
SET @借阅数量 = (SELECT 借阅数量 FROM Deleted)
Select @i = 1
if @i = 2
Select @i
Select @i = @i + 1
Print @i
GODeclare @i Int
Select @i = 1
if @i = 2
Begin
Select @i
Select @i = @i + 1
End
Print @i