日期:2014-05-18  浏览次数:20470 次

请大家帮帮忙
大家好,我用的是MS   SQL-Server数据库,我有一张表(sc)里面有三个属性:sno(学号)、cno(课程号)、grade(成绩)其中主键为(sno,cno)的复合主键。现在我想在数据库里面将这个复合主键的定义删除,而用触发器去实现每次插入新的数据的时候来检查是否符合主键的一致性约束(即不能重复插入相同的数据)。我自己尝试写了一个,可是不能满足要求,请大家看看,哪位高手能指点一下,并且解答下该如何完成,十分的感谢大家!
create   trigger   pk_sc   on   sc   for   insert
as
begin
declare   @sno   char(7),
                @cno   char(6)
set   @sno=(select   a.sno   from   inserted   a)
set   @cno=(select   a.cno   from   inserted   a)
    if   exists(select   a.sno  
                        from   inserted   a
                        where   a.sno   in(select   sno  
                                                      from   sc  
                                                      where   sc.cno=@cno))
        begin
          rollback   transaction
          raiserror( '违背了主键的一致性约束 ',16,1)
        end
    end

------解决方案--------------------
插入后触发时,inserted中的数据已经插入到表中,所以每次都rollback了,
可使用instead of触发此时数据没有插入到表中,判断才有效
create alter trigger pk_sc on sc instead of insert as
begin
if exists(select 0 from inserted where rtrim(sno)+ '- '+rtrim(cno)
in(select rtrim(sno)+ '- '+rtrim(cno) from sc))
begin
rollback transaction
raiserror( '违背了主键的一致性约束 ',16,1)
end
else
insert sc select * from inserted
end
要用插入后触发也可以
alter trigger pk_sc on sc for insert as
begin
if exists(select 0 from sc group by sno,cno having count(*)> 1)
begin
rollback transaction
raiserror( '违背了主键的一致性约束 ',16,1)
end
end