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

SQL server 2005 触发器的一个问题,高手帮忙看看
有三张表
student(stuId,stuName)
course(courseId,courseName)
select_course(stuId,courseId)

写一个触发器实现
--9.更改一个学生的学号时,自动修改相应的选课记录的学号。
Create TRIGGER UpdateId_Trigger
ON student
 INSTEAD OF UPDATE
as
BEGIN
--SET NOCOUNT ON
if update(stuId)
  begin
  declare 
  @newstuid nchar(20),
  @oldsid nchar(20)
   
set @newstuid=(select stuId from inserted)
set @oldsid=(select stuId from deleted)
update select_course set stuId=@newstuid where stuId=@oldsid

  end
else
begin
 print '没有更改学生的学号'
end
END
Go
-----------------------------------
以上编译成功
--------------------------------------
想验证一下下,然后执行如下代码
update student set stuId= 's6' WHERE stuName='Sally'
Go
select * from select_course



但是出现了错误:
消息 547,级别 16,状态 0,过程 UpdateId_Trigger,第 15 行
UPDATE 语句与 FOREIGN KEY 约束"FK__select_co__stuId__4CF5691D"冲突。该冲突发生于数据库"master",表"dbo.student", column 'stuId'。
语句已终止。
--------------------------------
怎么解决呢? 有外码约束不能先修改student,那触发器怎么能实现这个功能呢??



------解决方案--------------------
可以把表外键关系去掉;

------解决方案--------------------
级联更新不就行了嘛
------解决方案--------------------
SQL code
不需要触发器,外键级联更新就能做到.

--1.删除原外键约束:
alter table select_course drop constraint FK__select_co__stuId__4CF5691D
go

--2.重新建立带级联更新删除的外键约束:
alter table select_course add foreign key (stuid) references student(stuid) on update cascade on delete cascade;
go