触发器

--1.在数据库studentcourse中创建存储过程。存储过程名为proc_1,



if exists(select name from sysobjects where

name='proc_1' and type='p')

drop procedure proc_1

go

create proc proc_1

@stsno varchar(6)

as

select s.学号,s.姓名,s.性别,SC.成绩,SC.课程号,c.课程名 from s 

,sc,c where s.学号=@stsno and SC.学号=s.学号 and SC.课程号=c.课程号

go

execute proc_1 J0401



--2.在数据库studentcourse中创建存储过程,存储过程名为proc_2,





if exists (select name from sysobjects where

name='proc_2' and type='p')

drop procedure proc_2

go

create proc proc_2

@cno varchar(10)

as 

select c.课程号,c.课程名,s.学号,s.姓名,s.系,

s.性别 from s,c,sc where s.学号=SC.学号 and 

SC.课程号=c.课程号 and c.课程号=@cno

go

execute proc_2 c01



--3.在数据库studentcourse中创建触发器,触发器名为trigger_1,





if exists (select name from sysobjects where

name='trigger_1' and type='tr')

drop trigger trigger_1

go

create trigger trigger_1

on c after insert,update,delete

as begin

   print ('课程表被修改了')

  end

go



update c set c.学分=5 where c.课程号='c03'



--4.在数据库studentcourse中创建触发器,触发器名为trigger_2,



if exists (select name from sysobjects where

name='trigger_2' and type='tr')

drop trigger tirgger_2

go

create trigger trigger_2

on c 

after delete

as begin

  declare @cno char(7)

  select @cno=deleted.课程号 from deleted

  delete sc where sc.课程号=@cno

  end

  go

  --5.在数据库studentcourse中创建触发器,触发器名为trigger_3

  if exists (select name from sysobjects where 

  name='trigger_3' and type='tr')

    drop trigger trigger_3

    go 

    create trigger trigger_3

    on c

    after update

    as begin

      update sc

      set 课程号=(select 课程号 from sc)

      where 课程号 in(select 课程号 from c)

     end

 6.创建向课程数据表C添加新记录的存储过程cadd。

 if exists(select name from sysobjects where

name='cadd' and type='p')

drop procedure cadd

go

 create procedure cadd

 @cno char(3),@cname varchar(20),

 @socre smallint,@prcno char(3),

 @teacher char(8)

 as 

    begin

    insert into C(课程号,课程名,学分,预选课程号,教师)values(@cno,

    @cname,@socre,

    @prcno,@teacher)

    end

    go



exec cadd 'C06','C#',7,'C01','黎明'    

 select * from c 

 

 7.创建修z丈课程数据表C扒L录的存储过程cupdate

  if exists(select name from sysobjects where

name='cupdate' and type='p')

drop procedure cupdate

go

create procedure cupdate

 @cno char(3),@cname varchar(20),

 @socre smallint,@prcno char(3),

 @teacher char(8)

  as begin

  update c set 课程号=@cno,

  课程名=@cname,学分=@socre,

  预选课程号=@prcno,教师=@teacher

  end

  go

  

  8. 创建存储过程cdeleted,要求删除课程数据表C中指定课

  程号的记录。

 if exists(select name from sysobjects where

name='cdeleted' and type='p')

drop procedure cdeleted

go

create procedure cdeleted

@cno char(3)

as begin 

   delete from c where c.课程号=@cno

   end

   go

9.创建存储过程avgc,查询指定课程的平均成绩,

如果平均成绩大于80分,则返回状态代码1;否则,返回状态代码2。

if exists(select name from sysobjects where

name='avgc' and type='p')

drop procedure avgc

go

create procedure avgc

@cno char(3),@back smallint output

as begin

   select @back=AVG(SC.成绩) from SC 

   where SC.课程号=@cno

   if(@back>80)

      return 1

   else 

      return 2

   end

   go

  

  exec avgc c01,1

   10.显示存储过程cupdate的参数,数据类型.

   存储过程源代码和存储过程相关的数据库对象。

   

   

   sp_help 'cupdate'

   

   11.在数据库studentcourse中建立一个名为LOOK_g的存储

   过程,用于检索指定课程不及格的学生的姓名与学号。

   

   if exists(select name from sysobjects where

name='LOOK_g' and type='p')

drop procedure avgc

go

create procedure LOOK_g

@cno char(6)

as begin

  if exists(select s.姓名,s.学号 from

  s,SC where s.学号=SC.学号 and SC.成绩<60)

    select s.姓名,s.学号 from s,SC

    where s.学号=SC.学号 and SC.成绩<60

    else 

      print '没有不及格学生'

      end



   12.将存储过程cupdate的名称改为course_update,

   删除LOOK_g存储过程。

   sp_rename cupdate,course_update

   go

   drop procedure LOOK_g

   

   13. 定义一个存储过程,查询数据库中指定同学各门功课的

   成绩。显示时按照课程号顺序显示。

   create procedure LOOK

   @name char(6)

   as begin

   select s.姓名,c.课程号,SC.成绩 from SC,s,c

   where s.学号=SC.学号 and SC.课程号=c.课程号 and

   s.姓名=@name

   group by c.课程号,s.姓名,SC.成绩

   end

   

   go

   

   exec lOOK @name='李丽'

14.在学生选课数据库中,建立触发器c1_trigger,当向

学生选课数据表SC中添加一条记录时,要求新记录的课程号值在

课程数据表C中存在,如果不存在,则拒绝向

学生选课数据表SC添加这条记录。



create trigger c1_trigger

on sc after insert

as begin

   if(select count(*)from inserted join c on inserted.课程号=c.课程号)=0

     begin

       rollback tran

       print '插入无效'

     end

     

    end

 15.在学生选课数据库中,建立触发器c2_trigger,

 修改课程数据表C中的课程号的值,该字段在学生选课数据表

 SC中的值也相应修改。

    create trigger c2_trigger

    on c after update

    as begin

      update sc

      set 课程号=(select 课程号 from inserted 

      where 课程号 in(select 课程号 from deleted))

    end

    go

 16.在学生选课数据库中,建立触发器c3_trigger,删除课程

 数据表C中的一条记录,如果该条记录的课程号值在学生选课数

 据表SC中存在,则不允许删除;否则可以删除。

   create trigger c3_trigger

   on c for delete

   as begin

     if exists (select * from deleted c where

     c.课程号 in(select sc.课程号 from sc))

     begin

       raiserror('不可删除',16,1)

      end

    end

    

    17.删除c3_trigger触发器。

    drop trigger c3_trigger      

    

   18. 创建一触发器c4_trigger,如果修改、删除和插入学生选

   课数据表SC中的任何数据

   ,则将向客户显示一条信息“不得对数据表进行任何修改!”

   If exists(select name from sysobjects 

   where name='c4_trigger' and type='tr')

   drop trigger c4_trigger

   go

   create trigger c4_trigger

   on sc for insert,update,delete

   as begin

      raiserror('不得对数据表进行任何修改',16,10)

  end   

  

你可能感兴趣的:(触发器)