一,实验目的
使学生理解用触发器实现数据完整性的重要性,掌握用触发器实现数据完整性的方法,掌握用触发器事先参照完整性的方法,并理解触发器与约束的不同。 二,实验内容
(1)为表建立触发器,实现域完整性,并激活触发器进行验证。
(2)为表建立级联更新的触发器,实现参照完整性,并激活触发器进行验证。 (3)比较约束与触发器的出现顺序。 三,实验指导
1.创建ZIKUI数据库的表S的INSERT触发器tri_INSERT_S,插入年龄在15-30之间的记录。
(1) 打开SQL Server Management Studio 窗口
(2)单击标准工具栏上的新建查询按钮,打开查询编辑器窗口
(3)在窗口中直接输入一下CREATE TRIGGER语句创建一个INSERT触发器。如下图:
USEJXGL
GO
CREATETRIGGERtri_INSERT_SONS
FORINSERT
AS
DECLARE@S_agetinyint SELECT@S_age=S.age
FROMS
IF@S_ageNOTBETWEEN 15 AND 30
ROLLBACKTRANSACTION
GO
图8.1 创建一个INSERT触发器
(2)在表中分别插入两行记录以激活该触发器,第一行年龄在15-30之内,第二行年龄的值在15-30以外。如下图:
USEJXGL
GO
INSERTINTOS
VALUES('40','王晓杰',21,'W','MA')
INSERTINTOS VALUES('41','邵庆国',14,'M','IS')
GO
图8.2 插入记录激活触发器
2.1创建JXGL数据库的表S的DELETTE触发器tgr_s_delete,当删除S表中的记录时触发该触发器。如下图:
USEJXGL
GO
CREATETRIGGERtgr_s_delete
ONS FORDELETE
AS
PRINT'备份数据中……'
IF(object_id('s_backup','U')isnotNULL) INSERTINTOS_backupSELECTsno,snamefromdeleted
ELSE
SELECT*INTOS_backupFROMdelected
PRINT'数据备份成功'
GO
图8.3删除记录触发该触发器
2.2 删除表S的记录.如下图:
useJGXL
go
deleteSwheresno='14'
select*fromS select*fromS_backup
go
图8.4删除表S的记录
2.3返回DDL触发器的对象标号.如下图:
selectOBJECT_ID fromsys.triggers
wherename='databasetriggerlog'
Go
图8.5返回DDL触发器的对象标号
2.4返回adventtureworks2008数据库中的production.workorder表的对象ID.如下图:
usemaster
go
selectOBJECT_ID('adventureworks2008.production.workorder')
as'object id'
go
图8.6返回adventtureworks2008数据库中的production.workorder表的对象ID
2.5通过验证表是否具有对象ID来检查制定表的存在。如果该表存在,将其删除;如果不存在,则不执行DROP TABLE语句。如下图:
usemaster
go
ifOBJECT_ID('dbo.awbuildversion','u')isnotnull
droptabledbo.awbuildversion
go
图8.6验证表是否具有对象ID来检查制定表的存在
2.6 使用sys.dm_db_index_operational_stats()函数返回adventureworks2008数据库中的person.address表的所有索引和区分信息。如下图:
usemaster
go
declare@db_idint declare@object_idint
set@db_id=DB_ID('adventureworks2008')
set@object_id=object_id('adventureworks2008.person.address')
if@db_idisnull
printN'invalid database' elseif@object_idisnull
printN'invalid object'
else
select*fromsys.dm_db_index_operational_stats(@db_id,@object_id,null,n
ull)
go
图8.7使用函数返回表中的索引和信息
3.在数据库JXGL中有3个表,即S,SC和C,其中,表SC的字段SNO作为外键与表S连接。如果要删除表S中的记录,需要创建触发器,先删除SC中与要删除记录级联的所有记录,再删除表S中的记录。 如下图:
USEJXGL
GO
CREATETRIGGERdelete_sc_sONS
INSTEADOFDELETE
AS
DELETE@s_nochar(9) SELECT@s_no=snoFROMdeleted
DELETEFROMSC WHEREsno=@s_no DELETEFROMS WHEREsno=@s_no
GO
图8.8删除表S的记录
因篇幅问题不能全部显示,请点此查看更多更全内容