SqlServer2012例項之觸發器的建立
阿新 • • 發佈:2019-02-05
一、觸發器實驗
注意:把studentmanager資料庫中的所有表用select into命令複製一份,然後用複製後新表完成下面的實驗,同時,對每個觸發器都要進行驗證。
SELECT * INTO department2 FROM department
SELECT * INTO class2 FROM class
SELECT * INTO course2 FROM course
SELECT * INTO s_c2 FROM s_c
SELECT * INTO student2 FROM student
SELECT * INTO teacher2 FROM teacher
SELECT * INTO t_c2 FROM t_c
1、使用SQL語句建立DML觸發器
(1)建立觸發器ts_sex,在錄入學生資訊時用以約束性別的值只能是“男”或者“女”
create trigger ts_sex
on student2
after insert
as
if exists(select * from student2 where s_sex not in('男','女'))
begin
raiserror ('學生性別只能為“男”或者“女”',16,1)
rollback transaction
end
insert into student2
values('2016020203','whp','男',NULL,NULL,NULL,NULL,'20160101')
(2)建立觸發器ts_name,用來控制不能更新“姓名”列
create trigger ts_name
on student2
for update
as
if(UPDATE(s_name))
begin
print'禁止更新性名列'
rollback transaction
end
UPDATE student2
set s_name='ghnhj'
(3)建立觸發器ts1,在錄入學生資訊時同時將此學生的學號及大學英語課程號錄入到成績表中(大學英語是公共必修課),同時顯示錄入的記錄資訊。
create trigger ts1
on student2
after insert
as
begin
declare @sno char(10),@cno char(10)
select @sno=s_id from inserted
select @cno=course_id from course where course_name='大學英語'
insert into s_c values(@sno,@cno,NULL)
select * from s_c where s_id [email protected]
end
insert into student2
values('2016020103','whp','男',NULL,NULL,NULL,NULL,'20160101')
(4)建立觸發器ts2,在刪除一個畢業生的資訊的同時刪除這個學生的成績記錄。如果沒有此學生則給出提示資訊。
create trigger ts2
on student2
after delete
as
begin
if exists(select s_id from deleted)
begin
delete from s_c
where s_id=(select s_id from deleted)
select * from student2
end
else
print '不存在此學生資訊'
end
delete from student2 where s_id ='2016020104'
(5)建立觸發器ts3,當更新某個學生的學號時更新這個學生的選課資訊。
create trigger ts3
on student2
after update
as
begin
if exists(select s_id from deleted)
begin
update s_c2 set s_id =(select s_id from inserted)
where s_id =(select s_id from deleted)
select s.s_id,s_name,result
from student2 s,s_c2 sc
where s.s_id=sc.s_id and s.s_id=(select s_id from inserted)
select * from s_c2
end
else
print '沒有這個學生的選課記錄'
end
update student set s_id='2016010106' where s_id ='2016010105'
(6)建立觸發器ts4,在向學生表插入、更新記錄時檢測出生日期與註冊日期的合法性,即出生日期應早於註冊日期,若不合法給出提示,並撤銷此操作。
create trigger ts4
on student2
after insert,update
as
begin
declare @date0 smalldatetime
declare @date1 smalldatetime
set @date0=(select s_borndate from inserted)
set @date1=(select s_enrolldate from inserted)
if @date0 > @date1
print'出生日期大於註冊日期,拒絕操作'
rollback transaction
end
update student2 set s_borndate='1983-05-03' where s_id='2016010101'
注意:把studentmanager資料庫中的所有表用select into命令複製一份,然後用複製後新表完成下面的實驗,同時,對每個觸發器都要進行驗證。
SELECT * INTO department2 FROM department
SELECT * INTO class2 FROM class
SELECT * INTO course2 FROM course
SELECT * INTO s_c2 FROM s_c
SELECT * INTO student2 FROM student
SELECT * INTO teacher2 FROM teacher
SELECT * INTO t_c2 FROM t_c
1、使用SQL語句建立DML觸發器
(1)建立觸發器ts_sex,在錄入學生資訊時用以約束性別的值只能是“男”或者“女”
create trigger ts_sex
on student2
after insert
as
if exists(select * from student2 where s_sex not in('男','女'))
begin
raiserror ('學生性別只能為“男”或者“女”',16,1)
rollback transaction
end
insert into student2
values('2016020203','whp','男',NULL,NULL,NULL,NULL,'20160101')
(2)建立觸發器ts_name,用來控制不能更新“姓名”列
create trigger ts_name
on student2
for update
as
if(UPDATE(s_name))
begin
print'禁止更新性名列'
rollback transaction
end
UPDATE student2
set s_name='ghnhj'
(3)建立觸發器ts1,在錄入學生資訊時同時將此學生的學號及大學英語課程號錄入到成績表中(大學英語是公共必修課),同時顯示錄入的記錄資訊。
create trigger ts1
on student2
after insert
as
begin
declare @sno char(10),@cno char(10)
select @sno=s_id from inserted
select @cno=course_id from course where course_name='大學英語'
insert into s_c values(@sno,@cno,NULL)
select * from s_c where s_id
end
insert into student2
values('2016020103','whp','男',NULL,NULL,NULL,NULL,'20160101')
(4)建立觸發器ts2,在刪除一個畢業生的資訊的同時刪除這個學生的成績記錄。如果沒有此學生則給出提示資訊。
create trigger ts2
on student2
after delete
as
begin
if exists(select s_id from deleted)
begin
delete from s_c
where s_id=(select s_id from deleted)
select * from student2
end
else
print '不存在此學生資訊'
end
delete from student2 where s_id ='2016020104'
(5)建立觸發器ts3,當更新某個學生的學號時更新這個學生的選課資訊。
create trigger ts3
on student2
after update
as
begin
if exists(select s_id from deleted)
begin
update s_c2 set s_id =(select s_id from inserted)
where s_id =(select s_id from deleted)
select s.s_id,s_name,result
from student2 s,s_c2 sc
where s.s_id=sc.s_id and s.s_id=(select s_id from inserted)
select * from s_c2
end
else
print '沒有這個學生的選課記錄'
end
update student set s_id='2016010106' where s_id ='2016010105'
(6)建立觸發器ts4,在向學生表插入、更新記錄時檢測出生日期與註冊日期的合法性,即出生日期應早於註冊日期,若不合法給出提示,並撤銷此操作。
create trigger ts4
on student2
after insert,update
as
begin
declare @date0 smalldatetime
declare @date1 smalldatetime
set @date0=(select s_borndate from inserted)
set @date1=(select s_enrolldate from inserted)
if @date0 > @date1
print'出生日期大於註冊日期,拒絕操作'
rollback transaction
end
update student2 set s_borndate='1983-05-03' where s_id='2016010101'