注册 登录
编程论坛 SQL Server论坛

关于触发器的问题

fyz520 发布于 2010-07-24 02:18, 641 次点击
求高人帮我解释一下下面这段代码哦,我能看懂的后面都做注释了,红色部分是看不懂的,能给详细解释一下吗?跪谢了


为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


[ 本帖最后由 fyz520 于 2010-7-24 12:29 编辑 ]
4 回复
#2
fyz5202010-07-24 02:19
带???问号的都是看不懂的,怎么发上去的红色部分才两行,晕
#3
cnfarer2010-07-24 16:59
这是相当基础的东西,稍稍看下相关知识不难明白的!
#4
gameohyes2010-07-24 18:38
支持ls
lz去了解下:
定义变量.INSERTED,DELETED表,事务 ,RAISERROR用户定义错误信息
其它的都是相当基础的就不说了.
#5
dearwolf41282010-07-26 13:15
DECLARE @S_no VARCHAR(4), @S_cno INT     //声明 @S_no ,@S_cno 变量
SELECT @S_no= SNO, @S_cno=CNO            //给变量输值
FROM INSERTED                            //inserted为插入时的系统临时表,具体为插入时的某一行记录
IF (LEFT(@S_no,2)!='97')                 //left()为返回字符串中从左边开始指定个数的字符。词句为ascll码是否等于97  
BEGIN                                    //事务开始
ROLLBACK TRANSACTION                     //事务回滚
RAISERROR('输入的学号:%s不是97级的学生,请确认后重新录入!',16,1, @S_no)           //raiserror为生成错误消息并启动会话的错误处理
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)    //raiserror为生成错误消息并启动会话的错误处理

END
1