触发器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
--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 @   kuuga  阅读(1048)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示