注册 登录
编程论坛 ASP.NET技术论坛

关于触发器的问题

fyz520 发布于 2010-07-24 12:31, 387 次点击

求高人帮我解释一下下面这段代码哦,我能看懂的后面都做注释了,红色部分是看不懂的,能给详细解释一下吗?跪谢了


为STUDENT表创建触发器S_insert,当向STUDENT表中插入数据时,要求学号必须以“97”开头,且课程号CNO必须在COURSE表中,否则取消插入操作,以下是代码:


CREATE TRIGGER S_insert  //创建触发器S_insert
ON STUDENT               //与触发器相关联的表的名字student
FOR INSERT AS            //当执行insert操作时将激发触发器
DECLARE @S_no VARCHAR(4), @S_cno INT     //???  
SELECT @S_no= SNO, @S_cno=CNO            //???  
FROM INSERTED                            //???
IF (LEFT(@S_no,2)!='97')                 //???   
BEGIN                                    //???
ROLLBACK TRANSACTION                     //???
RAISERROR('输入的学号:%s不是97级的学生,请确认后重新录入!',16,1, @S_no)           //???
END  
IF(@S_cno NOT IN (SELECT CNO FROM COURSE))                                          //???
BEGIN                                                                               //???
ROLLBACK TRANSACTION                                                                //???
RAISERROR('输入的课程号:%d在COURSE表中不存在,请确认后重新录入!',16,1, @S_cno)    //???
END

1 回复
#2
冰镇柠檬汁儿2010-07-24 14:36
CREATE TRIGGER S_insert  //创建触发器S_insert
ON STUDENT               //与触发器相关联的表的名字student
FOR INSERT AS            //当执行insert操作时将激发触发器
DECLARE @S_no VARCHAR(4), @S_cno INT     //定义变量,一个是@S_no是VARCHAR型的,另一个是@S_cno是整形的
SELECT @S_no= SNO, @S_cno=CNO            //查询SNO和CNO字段,并分别将值赋值给两个变量
FROM INSERTED                            //从INSERTED表
IF (LEFT(@S_no,2)!='97')                 //如果@S_no变量的值的左边起前两位不是“97”(可能这句我解释的有点出入)   
BEGIN                                    //开始执行
ROLLBACK TRANSACTION                     //回滚执行操作
RAISERROR('输入的学号:%s不是97级的学生,请确认后重新录入!',16,1, @S_no) //抛出错误信息,%s应该会被自动替换成变量@S_no的值
END  
IF(@S_cno NOT IN (SELECT CNO FROM COURSE)) //如果@S_cno的值不再SELECT CNO FROM COURSE的结果集中也会抛出错误信息
BEGIN                                                                               //???
ROLLBACK TRANSACTION                                                                //???
RAISERROR('输入的课程号:%d在COURSE表中不存在,请确认后重新录入!',16,1, @S_cno)    //???
END
1