日期:2014-05-17  浏览次数:20778 次

关于SQL触发器创建的问题
学生选课表:学号SNO、课程号CNO、课程成绩Grade.
--约束:
--1.课程成绩介于0至100之间
--2.修改/删除某个学生时,同时修改/删除该学生对应选课信息
--3.修改某门课程时,同时修改该门课程的对应选课信息;
--4.删除某门课程时,如果已有学生选修该门课程,则不能执行该删除操作;
创建一个触发器,当修改学生课程成绩时,自动将相关信息写入GradeChange表。
------最佳解决方案--------------------

学生选课表:学号SNO、课程号CNO、课程成绩Grade.
--约束:
--1.课程成绩介于0至100之间(检查约束就能搞定)
--2.修改/删除某个学生时,同时修改/删除该学生对应选课信息(级联删除  更新就可以了)
--3.修改某门课程时,同时修改该门课程的对应选课信息;(级联更新)
--4.删除某门课程时,如果已有学生选修该门课程,则不能执行该删除操作;(把课程表的课程号设为主键  选课表的课程号设为外间  利用外键确保数据的引用完整性即可)
至于触发器  我想自己动动脑子就能解决吧  有什么不懂得再来问  不帮学生做题

--创建学生信息表
if OBJECT_ID('StuInfo') is not null
drop table StuInfo
go
create table StuInfo
(
StuId varchar(5) primary key,
StuName nvarchar(10),
StuSex nvarchar(1) check(StuSex in('男','女')),
StuAge smallint,
Tel varchar(11)
)
go
--创建课程表
if OBJECT_ID('CouInfo') is not null
drop table CouInfo
go
create table CouInfo
(
CouId varchar(5) primary key,
CouName nvarchar(20),
CouHours decimal(4,1)
)
go
--学生选课表:
if OBJECT_ID('CouChose') is not null
drop table CouChose
go
create table CouChose
(
Id int identity(1,1),
StuId varchar(5) 
foreign key references StuInfo(StuId) on delete cascade on update cascade,
CouId varchar(5) foreign key references CouInfo(CouId) on update cascade,
CouScoer int check(CouScoer between 0 and 100)

)
go

--创建触发器
if OBJECT_ID('tri_test') is not null
drop trigger tri_test
go
create trigger tri_test on CouChose
for update
as
     insert GradeChange select  *  from    INSERTED 
go

------其他解决方案--------------------
约束1:可以在列上做个约束,没必要弄触发器
2、3:有外键的话做级联更新和级联删除
4:这个做了级联的话就可以实现了。
总体来说,你那些约束没必要做触发器。做了反而影响性能。


CREATE TRIGGER Update_Student ON Student
     AFTER UPDATE
 AS
     INSERT  INTO GradeChange
             SELECT  *
             FROM    INSERTED 
 
------其他解决方案--------------------
CREATE TRIGGER Update_Grade ON Student      
AFTER UPDATE 
AS     
INSERT  INTO GradeChange  SELECT  *  FROM    INSERTED
 
------其他解决方案--------------------
如果按你发的题目,我更容易理解成前四个是在建表或建表后建约束,最后才是写个触发器
------其他解决方案--------------------

学生选课表:学号SNO、课程号CNO、课程成绩Grade.
--约束:
--1.课程成绩介于0至100之间(检查约束就能搞定)
--2.修改/删除某个学生时,同时修改/删除该学生对应选课信息(级联删除  更新就可以了)
--3.修改某门课程时,同时修改该门课程的对应选课信息;(级联更新)
--4.删除某门课程时,如果已有学生选修该门课程,则不能执行该删除操作;(把课程表的课程号设为主键