在本教程中,将学习如何使用SQL Server CREATE TRIGGER语句来创建新的触发器。

SQL Server CREATE TRIGGER语句简介

CREATE TRIGGER语句用于创建一个新的触发器,只要针对表发生INSERT,DELETE或UPDATE等事件,就会自动触发该触发器。

以下是CREATE TRIGGER语句的语法:

CREATE TRIGGER [schema_name.]trigger_name

ON table_name

AFTER {[INSERT],[UPDATE],[DELETE]}

[NOT FOR REPLICATION]

AS

{sql_statements}

在这个语法中:

schema_name是新触发器所属模式的名称。模式名称是可选的。

trigger_name是要创建触发器的用户定义名称。

table_name是触发器作用的表。

事件列在AFTER子句中。事件可以是INSERT,UPDATE或DELETE。单个触发器可以响应针对该表的一个或多个动作而触发。

NOT FOR REPLICATION选项指示SQL Server在复制过程中进行数据修改时不触发触发器。

sql_statements是一个或多个Transact-SQL,用于在事件发生后执行操作。

触发器的“虚拟”表:INSERTED和DELETED

SQL Server提供了两个专门用于名为INSERTED和DELETED表的触发器的虚拟表。 SQL Server使用这些表来捕获事件发生之前和之后修改行的数据。

下表显示了INSERTED和DELETED表每个事件之前和之后的内容:

DML事件

INSERTED表持有

DELETED表持有

INSERT

要插入的行

UPDATE

更新修改的新行

更新修改的现有行

DELETE

要删除的行

SQL Server CREATE TRIGGER示例

下面来看一个创建新触发器的示例,将使用示例数据库中的production.products表进行演示。

1. 创建用于记录更改的表

以下语句创建一个名为production.product_audits的表,以便在针对production.products表发生INSERT或DELETE事件时记录信息:

CREATE TABLE production.product_audits(

change_id INT IDENTITY PRIMARY KEY,

product_id INT NOT NULL,

product_name VARCHAR(255) NOT NULL,

brand_id INT NOT NULL,

category_id INT NOT NULL,

model_year SMALLINT NOT NULL,

list_price DEC(10,2) NOT NULL,

updated_at DATETIME NOT NULL,

operation CHAR(3) NOT NULL,

CHECK(operation = 'INS' or operation='DEL')

);

production.product_audits表包含production.products表中的所有列。 此外,它还有一些列来记录更改,例如:updated_at,operation和change_id。

2. 创建之后DML触发器

首先,要创建新触发器,请在CREATE TRIGGER子句中指定触发器所属的触发器和模式的名称:

CREATE TRIGGER production.trg_product_audit

接下来,在ON子句中指定触发器将在事件发生时触发的表的名称:

ON production.products

然后,列出将在AFTER子句中调用触发器的一个或多个事件:

AFTER INSERT, DELETE

触发器的主体以AS关键字开头:

AS

BEGIN

之后,在触发器的主体内部,将SET NOCOUNT设置为ON以禁止在触发触发器时返回受影响的消息行数。

SET NOCOUNT ON;

每当在production.products表中插入或删除行时,触发器都会在production.product_audits表中插入一行。 insert的数据通过UNION ALL运算符从INSERTED和DELETED表中提供:

INSERT INTO

production.product_audits

(

product_id,

product_name,

brand_id,

category_id,

model_year,

list_price,

updated_at,

operation

)

SELECT

i.product_id,

product_name,

brand_id,

category_id,

model_year,

i.list_price,

GETDATE(),

'INS'

FROM

inserted AS i

UNION ALL

SELECT

d.product_id,

product_name,

brand_id,

category_id,

model_year,

d.list_price,

getdate(),

'DEL'

FROM

deleted AS d;

以下将所有部分放在一起,构成一个完整的创建语句:

CREATE TRIGGER production.trg_product_audit

ON production.products

AFTER INSERT, DELETE

AS

BEGIN

SET NOCOUNT ON;

INSERT INTO production.product_audits(

product_id,

product_name,

brand_id,

category_id,

model_year,

list_price,

updated_at,

operation

)

SELECT

i.product_id,

product_name,

brand_id,

category_id,

model_year,

i.list_price,

GETDATE(),

'INS'

FROM

inserted i

UNION ALL

SELECT

d.product_id,

product_name,

brand_id,

category_id,

model_year,

d.list_price,

GETDATE(),

'DEL'

FROM

deleted d;

END

最后,执行整个语句以创建触发器。 创建触发器后,可以在表的触发器文件夹下找到它,如下图所示:

3. 测试触发器

以下语句在production.products表中插入一个新行:

INSERT INTO production.products(

product_name,

brand_id,

category_id,

model_year,

list_price

)

VALUES (

'产品测试(触发器)',

1,

1,

2019,

999

);

由于INSERT事件,production.products表的production.trg_product_audit触发器被触发。

下面来查看production.product_audits表的内容:

SELECT

*

FROM

production.product_audits;

执行上面查询语句,得到以下结果:

注:可以多插入几行,再查询production.product_audits表中的数据。

接下来,执行以下语句从production.products表中删除一行,以测试删除记录时触发器的执行:

DELETE FROM

production.products

WHERE

product_id = 328;

正如预期的那样,触发器被触发并将已删除的行插入到production.product_audits表中:

SELECT

*

FROM

production.product_audits;

执行上面查询语句,得到以下结果:

在本教程中,学习了如何在SQL Server中创建触发器以响应一个或多个事件,例如插入和删除。

¥ 我要打赏

纠错/补充

收藏

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

java sql 创建触发器_SQL Server创建触发器相关推荐

  1. sql server update触发器_SQL Server 触发器

    T-SQL 触发器 触发器分为 BEFORE触发器*(SQL Server不支持,Oracle支持)在事件发生时触发. AFTER触发器是 SQLServer生成的最初用于自动相应数据修改的机制.在 ...

  2. php执行sql内存溢出_SQL Server 2017:SQL排序,溢出,内存和自适应内存授予反馈

    php执行sql内存溢出 This article explores SQL Sort, Spill, Memory and Adaptive Memory Grant Feedback mechan ...

  3. 对于数据给定范围sql取数_SQL Server中的报表–根据给定日期范围内提取的数据创建图表

    对于数据给定范围sql取数 介绍 ( Introduction ) I recently heard from a lady from overseas who wanted to find a qu ...

  4. sql分区表上创建索引_SQL Server中分区表和索引的选项

    sql分区表上创建索引 介绍 (Introduction) I work for a large, multinational financial institution. Like most com ...

  5. mysql查看索引创建进度_SQL Server查看索引重建、重组索引进度

    相信很多SQL Server DBA或开发人员在重建或重组大表索引时,都会相当郁闷,不知道索引重建的进度,这个对于DBA完全是一个黑盒子,对于系统负载非常大的系统或维护窗口较短的系统,你会遇到一些挑战 ...

  6. java编译sql存过_SQL SERVER 临时表导致存储过程重编译(recompile)的一些探讨

    SQLSERVER为了确保返回正确的值,或者处于性能上的顾虑,有意不重用缓存在内存里的执行计划,而重新编译执行计划的这种行为,被称为重编译(recompile).那么引发存储过程重编译的条件有哪一些呢 ...

  7. sql tempdb清理_SQL Server 2019中的内存优化的TempDB元数据

    sql tempdb清理 介绍 (Introduction) In-memory technologies are one of the greatest ways to improve perfor ...

  8. server sql 本月最后一天_SQL Server 获取最后一天(指定时间的月最后一天日期)...

    /* author OceanHo @ 2015-10-23 10:14:21 获取指定时间字符串指定日期的月最后一天日期 */ IF OBJECT_ID('get_LastDayDate') IS ...

  9. python中引入sql的优点_SQL Server 2017中的Python:增强的数据库内机器学习

    Microsoft SQL Server是一款优秀的关系型数据库管理系统,Python是目前流行的数据科学语言之一,拥有丰富的库生态系统.从SQL Server 2017的CTP 2.0版本开始,可以 ...

最新文章

  1. RedHat9.0下载地址
  2. win10系统配置apache 2.4的虚拟主机以及查看 apache的版本
  3. python画双折线图-Python Pandas 时间序列双轴折线图
  4. syslog数据接收并处理
  5. cygwin swoole_swoole入门--------基础概念
  6. matplotlib polar 雷达图
  7. SAP License:SAP消息
  8. linux下文件编码的查看与转换(转)
  9. Oracle的sql条件带有,oraclesql语句的if
  10. 如何把Backtrack 5安装到U盘/Backtrack 4安装方法
  11. Unity3d学习之路-简单打飞碟小游戏
  12. Rethinking Visual Geo-localization for Large-Scale Applications 论文阅读CosPlace
  13. BETTER FINE-TUNING BY REDUCING REPRESENTATIONAL COLLAPSE翻译
  14. win7做服务器性能如何,win7如何做服务器配置
  15. 【进阶5-1期】重新认识构造函数、原型和原型链
  16. 网易实况足球获取服务器信息,网易实况足球:游戏疑难杂症解惑,快速通过“老司机”的考核...
  17. 如何解决镜像过大的问题
  18. Mac 定时提醒应用 stretchly 配置
  19. MySQL表相关操作
  20. mjrefresh自动判断是否隐藏mj_footer

热门文章

  1. 获取电脑系统当前时间
  2. Mac下Intellij IDea发布Web项目详解一
  3. 如何修改opencart的模版适合为mycncart系统使用
  4. c#静态变量和静态属性的区别
  5. python小练——下载指定url中的图片
  6. MOSS项目开发 周记(第一周)
  7. (C#)如何使文本框响应回车
  8. 【报告分享】2020中国商业智能化发展研究报告.pdf(附下载链接)
  9. 【报告分享】数据大治理-毕马威阿里研究院.pdf(附下载链接)
  10. 绝对不可错过的图形学算法!迭代最近点算法——ICP算法