SQL Server 2019 数据库编程——触发器实验

一、相关知识点

SQL Server 触发器是一种特殊类型的存储过程,它在特定的表上执行并响应数据修改事件。触发器可以用于执行数据验证、数据转换、数据审计和其他业务逻辑操作。

以下是一些与 SQL Server 触发器相关的重要知识点:

1. 触发器类型:SQL Server 触发器分为两种类型,即行级触发器(Row-Level Triggers)和语句级触发器(Statement-Level Triggers)。行级触发器在每个受影响的行上都执行一次,而语句级触发器在每个语句上仅执行一次。

2. 触发器事件:触发器是针对特定的数据改变事件执行的。常见的触发器事件包括插入(INSERT)、更新(UPDATE)和删除(DELETE)。

3. 创建触发器:可以使用 CREATE TRIGGER语句来创建触发器。触发器可以在表级别上定义,以及定义为在 INSERT、UPDATE 或 DELETE 事件发生时执行。

4. 触发器的触发顺序:当多个触发器与一个表事件相关联时,SQL Server 按照它们的创建顺序执行这些触发器。在执行时,可以使用 sp_settriggerorder 存储过程进行顺序控制。

5. 触发器使用的伪表:在触发器的执行过程中,可以使用 INSERTED 和 DELETED 这两个特殊的伪表来访问触发器操作所影响的数据。INSERTED 表包含插入或更新的新值,而 DELETED 表包含更新或删除前的旧值。

6. 触发器的禁用和启用:可以使用 ALTER TABLE 语句的 ENABLE TRIGGER 和 DISABLE TRIGGER 子句来启用或禁用特定的触发器。

7. 触发器的性能影响:虽然触发器提供了强大的功能,但如果不正确使用,可能会对数据库性能产生负面影响。过多的触发器、复杂的触发器逻辑和频繁的触发器执行可能会导致性能下降。

二、软件版本

Microsoft SQL Server Management Studio(v18.7.1)

三、实验所用数据库

实验所基于的销售管理数据库中涉及以下表:

四、实验内容

1.  创建触发器trigger_delete,实现以下功能:当订单表的数据被删除时,显示提示信息“订单表记录被修改了”。

2.  对Sell_Order表创建名为reminder的触发器,当用户向Sell_Order表中插入或修改记录时,自动显示Sell_Order表中的记录。

3.  对Employee表中创建名为emp_updtri的触发器,实现如下功能:当修改姓名时,自动检查订单表,确定是否有该员工的订单,如果存在该员工,则撤销操作。

4.  创建一个INSERT触发器,当在Employee表中插入一条新员工记录时,如果是“人事部”的员工,则撤销该插入操作,并返回出错消息。

5.  创建一个product_order_delete的触发器,其功能是:当删除商品表中的商品记录时,同时删除订单表中相应的订单,并显示提示信息“有关商品已被删除”。

6.  创建一个名为employee_deleted的触发器,其功能是:当对Employee表进行删除操作时,首先检查订单表,如果删除的员工没有接收订单,可以删除该员工的消息,否则撤销删除,显示“无法修改”的信息。

五、实验过程及数据记录

1.  创建触发器trigger_delete,实现以下功能:当订单表的数据被删除时,显示提示信息“订单表记录被修改了”。

2.  对Sell_Order表创建名为reminder的触发器,当用户向Sell_Order表中插入或修改记录时,自动显示Sell_Order表中的记录。

3.  对Employee表中创建名为emp_updtri的触发器,实现如下功能:当修改姓名时,自动检查订单表,确定是否有该员工的订单,如果存在该员工,则撤销操作。

(1)定义触发器:

(2)尝试修改:

4.  创建一个INSERT触发器,当在Employee表中插入一条新员工记录时,如果是“人事部”的员工,则撤销该插入操作,并返回出错消息。

(1)定义触发器:

(2)尝试插入:

5.  创建一个product_order_delete的触发器,其功能是:当删除商品表中的商品记录时,同时删除订单表中相应的订单,并显示提示信息“有关商品已被删除”。

(1)定义触发器:

(2)删除操作:

6.  创建一个名为employee_deleted的触发器,其功能是:当对Employee表进行删除操作时,首先检查订单表,如果删除的员工没有接收订单,可以删除该员工的消息,否则撤销删除,显示“无法修改”的信息。

(1)定义触发器:

(2)尝试删除:

六、实验小结

1、instead of触发器是在insert、update、delete这些操作进行之前就被激活了,并且不再去执行原来的dml SQL操作,而是用触发器内部的SQL语句代替执行。所以用了instead of的表做任何dml操作,都只会执行触发器内部的语句,INSTEAD OF 触发器的主要优点是使不可被修改的视图能够支持修改。

例如,本次实验中的第5题,Product与Purchase_Order之间存在参照完整性约束,即Purchase_Order的ProductID是外码。如果想要删除Product中的元组必须先删除Purchase_Order中与之关联的信息。所以,使用instead of,先不删除Product中的信息,在触发器里先删除相关联的信息,再删除Product中的信息。

2、after触发器和instead of触发器的区别:

(1)after触发器是在操作成功后,所采取的一些动作;

(2)而对于instead of触发器,对数据库的操作只是一个“导火线”而已,真正起作用的是触发器里面的动作;往往触发器中会有很多分支判断语句在里面,根据不用的条件做不同的动作。

3、一般情况下采用的for触发器,是在进行操作时,采取的一些动作。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值