触发器

--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   

  

posted @ 2013-10-29 17:04  kuuga  阅读(1047)  评论(0编辑  收藏  举报