2018年11月16日SQL Server實驗內容(觸發器實驗)
阿新 • • 發佈:2018-11-16
--注意:先把studentmanager資料庫中的所有表用select into命令複製一份, --然後用複製後新表完成下面的實驗,同時,對每個觸發器都要進行驗證。 select *into department2 from department select *into course2 from course select *into class2 from class select *into teacher2 from teacher select *into t_c2 from t_c select *into s_c2 from s_c select *into student2 from student --1、建立觸發器tr_s1,在錄入學生資訊時同時顯示錶中的所有記錄,並執行測試語句。 create trigger tr_s1 on student2 for insert as select *from student2 go insert into student2(s_id,s_name) values('2016030303','aa') --2、建立觸發器tr_s2, --在錄入學生資訊時同時將此學生的學號及大學英語課程號錄入到成績表s_c中(大學英語是公共必修課), --同時顯示錄入的記錄資訊。 create trigger tr_s2 on student2 for insert as declare @v_sid char(10) declare @v_cid char(10) select @v_sid=(select s_id from inserted) select @v_cid= ( select distinct c.course_id from s_c2,course2 c where s_c2.course_id=c.course_id and course_name='大學英語' ) insert into s_c2(s_id,course2.course_id) values(@v_sid,@v_cid) select *from s_c2 where
[email protected]_sid go insert into student2(s_id,s_name) values('2016030305','bc') --3、建立觸發器tr_s3,在刪除一個畢業生的資訊的同時刪除這個學生的成績記錄。 --如果沒有此學生則給出提示資訊。 create trigger tr_s3 on student2 for delete as declare @v_sid char(10) select @v_sid=(select s_id from deleted) declare @v_c int select @v_c=(select COUNT(*)from s_c where[email protected]_sid) if @v_c=0 print '沒有此學生' else delete from s_c2 where [email protected]_sid go delete from student2 where s_id='2016030305' select *from s_c2 --4、 建立觸發器tr_s4,當更新某個學生的學號時更新這個學生的選課資訊。 create trigger tr_s4 on student2 for update as if (select s_id from inserted)!=(select s_id from deleted) update s_c2 set s_id=(select s_id from inserted) where s_id=(select s_id from deleted) go insert into student2(s_id,s_name) values('2016030310','dr') update student2 set s_id='2016030311' where s_id='2016030310' select *from s_c2 --5、建立觸發器tr_s5,在向學生表插入、更新記錄時檢測出生日期與入學日期的合法性, --即出生日期應早於入學日期,若不合法給出提示,並撤銷此操作。 create trigger tr_s5 on student2 for insert,update as if (select s_borndate from inserted )>=(select s_enrolldate from inserted) print 'error!出生日期應早於入學日期' rollback transaction go insert into student2(s_id,s_name,s_borndate,s_enrolldate) values('2016030313','dcc',2016-01-01,1998-10-16) --error!出生日期應早於入學日期 --訊息 3609,級別 16,狀態 1,第 1 行 --事務在觸發器中結束。批處理已中止。 --6、建立觸發器ts_s6,用來控制不能更新“姓名”列。 create trigger ts_s6 on student2 for update as if (select s_name from inserted)!=(select s_name from deleted) print '姓名不能更新' rollback transaction go update student2 set s_name='ccc' where s_id='2016030311' --姓名不能更新 --訊息 3609,級別 16,狀態 1,第 1 行 --事務在觸發器中結束。批處理已中止。 select*from student2 --7、分別使用管理平臺和SQL語句刪除、禁用、啟用觸發器 --(1)刪除觸發器tr_21 drop trigger 觸發器名 drop trigger tr_21 --(2)禁用觸發器tr_s1 alter table 表名 disable trigger 觸發器名 alter table student2 disable trigger tr_s1 --(3)啟用觸發器tr_s1 alter table 表名 enable trigger 觸發器名 alter table student2 enable trigger tr_s1
附錄:實驗過程中用到的知識:
1、使用CREATE TRIGGER語句定義觸發器,ALTER TRIGGER語句修改觸發器,DROP TRIGGER語句刪除觸發器。
2、如果觸發語句對應的表上有完整性約束,這些完整性約束必須不違背時,相應的觸發語句才能執行,然後才能觸發對應的觸發器。
3、SQL SERVER為每個觸發器都建立了兩個臨時表INSERTED表和DELETED表,這兩個表的邏輯結構與被觸發器作用的表一樣,使用者可以讀取這兩個表的內容,但不能對它們進行修改,觸發器執行完後,這兩個表也會自動刪除。當執行INSERT時,INSERTED表中儲存要向表中插入的所有行;當執行DELETE時,DELETED表中儲存要從表中刪除的所有行;當執行UPDATE時,修改前的行儲存在DELETED表中,修改後的行儲存在INSERTED行中。