if exists (select name from sysobjects where name='T_score')
drop trigger T_score
go
create trigger T_score
on score
for insert 
as 
declare @score int
select @score=course  from inserted
--if (exists (select * from inserted i,score s where i.course=s.course))
if(not exists (select * from score where course=@score))
begin
print '已执行'
select * from score
end
else 
begin
raiserror('输入重复',16,1)
rollback transaction
select * from score where course=@score
end
总是不能插入,难道有是if错了?

解决方案 »

  1.   

    trigger里面不能用rollback transaction语句
      

  2.   

    你插入后再判断有没有一样的,肯定有一样的啦,改成INSTEAD OF 触发器
      

  3.   

    既然是用的else那还用rollback干撒呢?
      

  4.   

    else是后来加上的,rollback也就没删。
    不是总错嘛,加else测一下。
      

  5.   

    你是INSERT 触发器,已经插入进去数据了你再来判断,那能行吗,改成INSTEAD OF 触发器
      

  6.   

    你是INSERT 触发器,已经插入进去数据了你再来判断,那能行吗,改成INSTEAD OF 触发器我再想想
    我觉得不是这样的。
    请前辈再考虑一下。
      

  7.   

    if(not exists (TRUE))
    begin
    print '已执行'
    select * from score
    end
    else 
    begin
    raiserror('输入重复',16,1)
    rollback transaction
    select * from score where course=@score
    end没试试在else里边加print? 我觉得它总跑到else里了呢?
      

  8.   

    输入score表里有的就可以插入,没有的反倒不可以了。
    跟我想要的正好相反。
      

  9.   

    CREATE TABLE TT(ID INT)GOCREATE TRIGGER TRI_IN ON TT FOR INSERT
    AS
     SELECT * FROM TT WHERE NOT EXISTS(SELECT 1 FROM INSERTED)
    GO
    INSERT TT SELECT 1
    /*
    ID          
    ----------- (所影响的行数为 0 行)很简单的测试,说明表里面已经有1这个数据了
      

  10.   

    after 触发器 是在你执行操作后触发的 所以表中已经存在你操作的记录行 也就是已经存在有INSERTED表里的记录 你无论如何判断都是存在的 你的需求不要出触发器 效率不好 在 course 列上 加个UNIQUE约束吧
      

  11.   

    alter table score add constraint un_corese unique (courese)
    这样就好了
      

  12.   

    他们是一样的吧?
    if(exists (select name from sysobjects where name='T_Topic'))
    drop trigger T_Topic
    go
    create trigger T_Topic 
    on Topic 
    after insert 
    as 
    if (exists (select UScore from users a,inserted i where a.uid = i.tuid and a.Uscore < i.Tscore)) 
    begin 
    Raiserror('您的积分不足',16,1) 
    Rollback transaction 
    end 
    else 
    select * from inserted
    update a set a.UScore=a.UScore- i.Tscore from Users a,inserted i where a.UId=i.TUid
    Go
      

  13.   


    改成这个就行了if exists (select name from sysobjects where name='T_score')
    drop trigger T_score
    go
    create trigger T_score
    on score
    INSTEAD OF insert 
    as 
    declare @score int
    select @score=course  from inserted
    --if (exists (select * from inserted i,score s where i.course=s.course))
    if(not exists (select * from score where course=@score))
    begin
    print '已执行'
    select * from score
    end
    else 
    begin
    raiserror('输入重复',16,1)
    rollback transaction
    select * from score where course=@score
    end
      

  14.   

    嗯。我知道了,我对触发器的作用和原理还不理解,
    对 AFTER和INSTEAD OF的区别更是不理解。
    谢谢前辈们的帮助