实验11 触发器Word格式.docx
- 文档编号:7568435
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:15
- 大小:156.14KB
实验11 触发器Word格式.docx
《实验11 触发器Word格式.docx》由会员分享,可在线阅读,更多相关《实验11 触发器Word格式.docx(15页珍藏版)》请在冰点文库上搜索。
SQL语句
实验11-1:
编写一触发器,在向产品表CP中添加记录时,得到该类产品的总价格(总价格=价格*库存量),并输出。
说明:
可使用Print@变量名来输出变量值。
USECPXS
IFEXISTS(SELECTnameFROMsysobjects--如果已经存在触发器则删除
WHEREname='
T_return_Total'
ANDtype='
TR'
)
DROPTRIGGERT_return_Total
GO
CREATETRIGGERT_return_Total--创建触发器
ONCP--基于表borrow
AfterINSERT--监视插入操作,针对其触发
Begin
--查询插入记录INSERTED中读者的类型
DECLARE@P_IDchar(6),
@P_Namechar(30),
@P_Pricefloat,
@P_Storageint,
@P_total_priceint
SET@P_ID=(SELECT产品编号FROMinserted)--inserted为临时表
SET@P_Name=(SELECT产品名称FROMinserted)
SET@P_Price=(SELECT价格FROMinserted)
SET@P_Storage=(SELECT库存量FROMinserted)
SET@P_total_price=@P_Price*@P_Storage
PRINT'
产品为:
'
+@P_Name+’总价格为:
’+convert(varchar(20),@P_total_price)
End
应用测试:
INSERTINTOCP(产品编号,产品名称,价格,库存量)
VALUES('
100016'
'
东风小汽车'
85728,9);
给出运行结果:
实验11-2:
对CPXS库中CP表的DELETE操作定义触发器。
仅当某产库存量为0时才能将该记录删除。
IFEXISTS(SELECTnameFROMsysobjects--如果已经存在触发器则删除
WHEREname='
CP_Del'
DROPTRIGGERCP_Del
CREATETRIGGERCP_Del--创建触发器
ONCP
FORDELETE
DECLARE@Storageint
SELECT@Storage=库存量
FROMdeleted
IF@Storage>
BEGIN
PRINT'
该产品记录不能删除!
还有'
+convert(char
(2),@Storage)+'
件没销完。
ROLLBACK--回滚操作,撒销删除操作
END
ELSE
该产品记录已被删除!
测试:
DELETECPWHERE产品名称='
太阳能热水器'
请给出执行结果:
练习:
(1)完成后,再执行Select*fromcp;
语句,查看产品名称='
的记录是否真的删除。
(2)执行如下语句,在CP表中插入一行库存量字段值为0的记录。
100017'
小汽车'
85788,0);
再执行删除语句:
;
而后再执行“Select*fromcp;
”语句,查看该记录是否删除,比较与
(1)的差别。
实验结果与
(1)没见本质区别。
11.2.创建DDL触发器
DDL触发器会为响应多种数据定义语言(DDL)语句而激发。
这些语句主要是以CREATE、ALTER和DROP开头的语句。
DDL触发器可用于管理任务,例如审核和控制数据库操作。
语法形式:
CREATETRIGGERtrigger_name
ON{ALLSERVER|DATABASE}[WITH<
ddl_trigger_option>
[,...n]]
{FOR|AFTER}{event_type|event_group}[,...n]
AS{sql_statement[;
][...n]|EXTERNALNAME<
methodspecifier>
[;
]}
其中:
<
:
=[ENCRYPTION]EXECUTEASClause]
method_specifier>
:
=assembly_name.class_name.method_name
实验11-3:
使用DDL触发器来防止数据库中的任一表被修改或删除。
CREATETRIGGERsafety
ONDATABASE
FORDROP_TABLE,ALTER_TABLE
YoumustdisableTrigger"
safety"
todroporaltertables!
ROLLBACK
试着对表进行删除或修改,看是否能修改成功。
11.3.触发器的其他操作
1.修改触发器
语法要点:
ALTERTRIGGER触发器名
2.删除触发器
DROPTRIGGER触发器名
实验11-4:
删除触发器:
请用T-SQL命令删除上一实验中创建的触发器safety。
请给出相应语句和执行结果:
droptriggersafety
ondatabase
3.查看触发器
可使用系统存储过程查看触发器相关信息,根据实验实际,将以下两处中的trigger_name和table_name换成具体的触发器名字和表名,放于查询分析器中执行,给出执行结果截图:
(1)查看触发器的具体内容:
sp_helptexttrigger_name
实验11-5:
查看触发器的定义:
(2)查看表中的触发器:
sp_helptriggertable_name
实验11-6:
查看定义在表中的触发器:
11.4.触发器练习
1. 练习:
编写一个触发器t_CP_bak,用以备份CP表的历史数据,若用户对表CP进行删除操作,则将被删除的数据转移到表CP_del,若用户对表CP进行更新操作,则将更新前的原始数据行转移到表CP_update中。
(注:
表CP_del和CP_update请先创建它,结构与CP相同,可用Select…Into…语句基于CP表创建。
请给程序源码:
createtriggert_CP_bak
oncp
afterdelete,update
as
ifexists(select1frominserted)andexists(select1fromdeleted)
begin
insertintocp_updateselect*fromdeleted
end
ifnotexists(select1frominserted)
insertintocp_delselect*fromdeleted
end
(1)试着在CP表中删除几行数据,而后查询CP_del中数据。
给出查询结果:
(2)试着在CP表中更新几行数据,而后查询CP_update中数据。
2.练习:
创建一触发器,当向CPXSB表插入一记录时,检查该记录的产品编号在CP表中是否存在,检查该记录的客户编号在XSS表中是否存在,若有一项为否,则不允许插入。
请给出源码和测试结果:
(1)源代码
createtriggert_cpxsb_insert
oncpxsb
forinsert
declare@cpbhchar(6),
@xsbhchar(6),
set@cpbh=(select产品编号frominserted)
set@xsbh=(select客户编号frominserted)
if(@cpbhnotin(select产品编号fromcp))
print'
插入数据中产品编号与CP表中产品编号不一致'
rollbacktransaction
else
插入一行数据成功'
if(@xsbhnotin(select产品编号fromxss))
插入数据中客户编号与XSS表中不一致'
(2)测试:
分别插入满足条件和不满足条件的记录,看数据是否能正常插入。
3.练习:
在CPXSB上创建一后触发器,若对产品编号列和客户编号列修改,则给出提示信息“产品编号列和客户编号列不能修改”,并取消修改操作(使用回滚语句,见前面实验)。
createtriggerupdate_afteronCPXSB
forupdate
ifupdate(产品编号)orupdate(客户编号)
raiserror('
不能修改'
16,1)
试着对CPXSB中产品编号列和客户编号数据进行修改,看是否能修成功。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验11 触发器 实验 11