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时就会出现返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时
没有重复学号时可以修改
这个怎么解决?

解决方案 »

  1.   

    图书借阅登记的觸發器改為CREATE trigger trigger_update
      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
      

  2.   

    另外,你的表中所有觸發器如果都是這樣寫法DECLARE @借阅数量 tinyint
    SET @借阅数量 = (SELECT 借阅数量 FROM Deleted)最好將你的所有觸發器都做更改,這樣的寫法有問題。
      

  3.   

    hongjiajie() ( ) 信誉:100  2007-08-06 09:06:36  得分: 0  
     
     
       这样写有什么缺点?
      
     
    -----------------還沒發現?!看你的錯誤信息就知道了。如果一次更新一條沒問題,但是一旦更新多條就會出問題。
      

  4.   

    DECLARE @借阅数量 tinyint
    SET @借阅数量 = (SELECT 借阅数量 FROM Deleted)
    ------------錯誤提示的不是很明顯了?“返回的值多于一个”如果更新的數據超過一條,那麼
    SELECT 借阅数量 FROM Deleted
    這個子查詢的結果中的數據就不止一條,就會報錯了。
      

  5.   

    但是 DECLARE @借阅数量 tinyint
    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
    这个跟新并不触发图书借阅登记里的那个触发器
      

  6.   

    我试了一下,可以了,这几天谢谢paoluo(一天到晚游泳的鱼),又学到了新的东西 
    能不能帮我解释一下上面那个问题,我马上结贴
      

  7.   

    hongjiajie() ( ) 信誉:100  2007-08-06 14:30:51  得分: 0  
     
     
       我试了一下,可以了,这几天谢谢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)
      

  8.   

    為了讓你看到區別,你可以對比下這段代碼的結果Declare @i Int
    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