当前位置:首页 > 如何使用SQL语句创建触发器

如何使用SQL语句创建触发器

在这里插入图片描述

🎈个人主页:� :✨✨✨初阶牛✨✨✨。
🐻推荐专栏1: 🍔🍟🌯C语言初级。
🐻推荐专栏2: 🍔🍟🌯C语言进步。
🔑个人信条: 🌵知行合一。
🍉本篇简介:>记录SQL 创建server触发器的句子,并简要介绍.。

前言。

目录。

  • 前言。
  • 一、触发器介绍。
    • 1.1。 触发器。概念及定义:。
    • 1.2 、。触发器。的作用。
  • 二、使用SQL语句创建触发器实例。
    • 1.创建`after`融发器。
    • 2.创建`instead of`触发器。

一、触发器介绍。

1.1。 触发器。概念及定义:。

触发器。是一种特殊类型。存储过程。,它不同于我们之前介绍的存储过程。存储过程。语句可以直接调用,但是。触发器。它主要是通过触发事件而被执行的.。
例如,对某一表进行例如。UPDATE。(修改)、。INSERT。(插入)、。DELETE。(删除)这些操作时,SQL Server。 触发器定义将自动执行。SQL。句子,确保数据之间的相互关系,实时更新.。

1.2 、。触发器。的作用。

触发器。其主要作用是实现原因。主键。 和。外键。 复杂的参考完整性和数据的一致性是无法保证的。除此之外,󿀌触发器。还有许多其他不同的功能:

①、约束条件复杂。
触发器。CHECK可以实现比CHECK 句子的约束比较复杂。

②、确保数据的安全。

触发器。因为。触发器。自动触发数据库的相应操作。SQL。通过数据库中的操作,语句不允许数据库中未经许可的指定更新和变更。

③.级联式。

触发器。可以根据。数据库。内部操作,并自动影响整个地级联。数据库。各种内容。例如:对。A。操作表时,导致表。A。表上的。触发器。被触发,A。中的。触发器。包含对。B。表的数据操作(UPDATE。(修改)、。INSERT。(插入)、。DELETE。(删除)),而这个操作又导致了B表。触发器。被触发。

④.调用。存储过程。

为响应数据库更新,触发器。一个或多个可以调用。存储过程。.。

但总的来说,,触发器。性能通常相对较低。

三、。触发器。的种类。
SQL Server。一般支持以下两种触发器:。

  1. AFTER。触发器。

  。AFTER。触发器。只执行某一操作的要求(INSERT、UPDATE、DELETE)之后,触发器。触发󿀌且。只能在表。上定义。针对表的同一操作可以定义多个定义。触发器。。
2.。 INSTEAD OF。触发器。。

  。INSTEAD OF。触发器。表示不执行其定义的操作(INSERT、UPDATE、DELETE),而只是执行。触发器。本身。INSTEAD可以在表上定义 OF。触发器。,INSTEAD也可以在视图上定义 OF。触发器。,但是,INSTEAD只能定义为同一操作 OF。触发器。。

二、使用SQL语句创建触发器实例。

1.创建。after。融发器。

(1)在插入时创建触发器。sc_insert。,当向。sc。当表插入数据时,,必须确保插入的学号已经存在。student。表中存在󿀌还必须确保插入的课程号在。Course。表中存在﹔如果没有࿰,c;给出相应的提示信息,取消插入操作,提示信息要求指示插入信息是学号不符合条件还是课程号不符合条件;注意:首先取消Student表和sc表之间的外键约束。

句子实现:。

create。trigger。sc_insert。on。sc。after。insert。as。if。not。exists。(。select。*。from。student。,inserted。			where。student。.。sno。=inserted。.。sno。)。begin。print。'插入信息的学号不在学生表中! 'if。not。exists。(。select。*。from。course。,inserted。 where。course。.。cno。=inserted。.。cno。)。print。'插入信息的课程号不在课程表中!'rollback。end。else。begin。if。not。exists。(。select。*。from。course。,inserted。 where。Course。.。cno。=inserted。.。cno。)。begin。print。'插入信息的课程号不在课程表中! 'rollback。end。end。

在这里插入图片描述

执行:。

insert。into。sc。values。(。'20110112','001','78')。

删除外键约束;

alter。table。sc。drop。constraint。FK_sc__sno__332C9D34。

(2)为。Course。表创建触发器。Course_del。,当删除了。Course。表中的课程信息时,同时将表。sc。删除表中相应的学生选课记录。

create。trigger。course_del。on。course。after。delete。as。if。exists。(。select。*。from。sc。,deleted。where。sc。.。cno。=deleted。.。cno。)。begin。delete。from。sc。where。sc。.。cno。 in。(。select。cno。 from。deleted。)。end。delete。from。Course。where。Cno。='003'

在这里插入图片描述

select。*。from。sc。

在这里插入图片描述

(3)在。Course。在表中添加一个平均分。avg_Grade。字段(记录每门课程的平均分),创建触发器。Grade_modify。,当。sc。当表中某学生的成绩发生变化时,则。Course。表中的平均成绩也可以及时相应地改变。

向。Course。在表中添加一个平均分。avg_Grade。字段。

alter。table。Course。add。avg_Grade。 smallint。

向。avg_Grade。添加数据。

update。course。set。avg_Grade。=(。select。AVG。(。Grade。)。from。sc。where。sc。.。Cno。=Course。.。Cno。)。

查看。Course。表:。

select。*。from。Course。

在这里插入图片描述

创建。Grade_modify。触发器。

create。trigger。Grade_modify。on。sc。after。update。as。if。update。(。grade。)。begin。update。course。set。avg_grade。=(。select。avg。(。grade。)。from。sc。 where。course。.。cno。=sc。.。cno。group。by。cno。)。end。update。sc。set。Grade。='90 'where。sno。='20050001'and。cno。='001'

2.创建。instead of。触发器。

(1)创建一个视图。Student_view。,包括学号、姓名、课程号、课程名、成绩等属性,在。Student_view。在上面创建触发器。Grade_moidfy。,当对。Student_view。修改中学生成绩时,SC中的相应记录实际修改。

创建。视图。:。

create。view。student_view。as。select。s。.。Sno。,Sname。 ,c。.。Cno。 ,Cname。 ,Grade。from。student s。 ,course c。,sc。where。s。.。Sno。=sc。.。sno。 and。c。.。Cno。=sc。.。cno。

创建。触发器。:。

create。trigger。Grade_moidfy。 on。student_viewinstead。 of。update。as。if。UPDATE。(。Grade。)。begin。update。sc。set。Grade。=(。select。Grade。 from。inserted。)。where。Sno。=(。select。sno。 from。inserted。)。and。Cno。=(。select。Cno。 from。inserted。)。End。update。student_viewset Grade。=40。where。Sno。='20110001'and。Cno。='002'

测试修改数据:。

select。*。from。student_view。

(2)在。sc。在表中插入一个。getcredit。字段(记录学生,所选课程获得的学分),创建触发器。ins_credit。,#xff08当变更;注:插入时)sc。表中的学生成绩,如果新成绩大于或等于60分,#xff0c;学生可以获得这门课的学分,而且这个学分必须和。Course。表中的值一致﹔如果新成绩小于60分,#xff0c;该生未能获得学分,修改值为0。

添加新字段。getcredit。:。

alter。table。sc。add。getcredit。 smallint。

创建触发器:。

create。trigger。sc_up。on。sc。after。insert。,update。as。declare。@xf。int。,@kch。char。(。3。)。,@xh。char。(。8。)。,@fs。int。select。@fs。=grade。,@kch。=cno。,@xh。=sno。 from。inserted。if。@fs。>=60。update。sc。 set。@xf。=(。select。credit。 from。course。 where。sc。.。Cno。=course。.。cno。)。where。sno。=@xh。and。cno。=@kch。else。update。sc。 set。@xf。=0where。sno。=@xh。and。cno。=@kch。修改数据:。update。sc。set。Grade。='90'where。Sno。='20050001'and。cno。='001'

以上是对触发器的基本理解。我希望它能帮助你.。

欢迎朋友私信与牛牛讨论问题,但牛牛的认知范围有限,目前只关注C语言、数据结构,C++等部分领域.。
在这里插入图片描述

分享到: