读书人

SQL server 2005 触发器的一个有关问题

发布时间: 2012-04-17 15:06:33 作者: rapoo

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

读书人网 >SQL Server

热点推荐