java sql 创建触发器_SQL Server创建触发器
在本教程中,将学习如何使用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创建触发器相关推荐
- sql server update触发器_SQL Server 触发器
T-SQL 触发器 触发器分为 BEFORE触发器*(SQL Server不支持,Oracle支持)在事件发生时触发. AFTER触发器是 SQLServer生成的最初用于自动相应数据修改的机制.在 ...
- php执行sql内存溢出_SQL Server 2017:SQL排序,溢出,内存和自适应内存授予反馈
php执行sql内存溢出 This article explores SQL Sort, Spill, Memory and Adaptive Memory Grant Feedback mechan ...
- 对于数据给定范围sql取数_SQL Server中的报表–根据给定日期范围内提取的数据创建图表
对于数据给定范围sql取数 介绍 ( Introduction ) I recently heard from a lady from overseas who wanted to find a qu ...
- sql分区表上创建索引_SQL Server中分区表和索引的选项
sql分区表上创建索引 介绍 (Introduction) I work for a large, multinational financial institution. Like most com ...
- mysql查看索引创建进度_SQL Server查看索引重建、重组索引进度
相信很多SQL Server DBA或开发人员在重建或重组大表索引时,都会相当郁闷,不知道索引重建的进度,这个对于DBA完全是一个黑盒子,对于系统负载非常大的系统或维护窗口较短的系统,你会遇到一些挑战 ...
- java编译sql存过_SQL SERVER 临时表导致存储过程重编译(recompile)的一些探讨
SQLSERVER为了确保返回正确的值,或者处于性能上的顾虑,有意不重用缓存在内存里的执行计划,而重新编译执行计划的这种行为,被称为重编译(recompile).那么引发存储过程重编译的条件有哪一些呢 ...
- sql tempdb清理_SQL Server 2019中的内存优化的TempDB元数据
sql tempdb清理 介绍 (Introduction) In-memory technologies are one of the greatest ways to improve perfor ...
- server sql 本月最后一天_SQL Server 获取最后一天(指定时间的月最后一天日期)...
/* author OceanHo @ 2015-10-23 10:14:21 获取指定时间字符串指定日期的月最后一天日期 */ IF OBJECT_ID('get_LastDayDate') IS ...
- python中引入sql的优点_SQL Server 2017中的Python:增强的数据库内机器学习
Microsoft SQL Server是一款优秀的关系型数据库管理系统,Python是目前流行的数据科学语言之一,拥有丰富的库生态系统.从SQL Server 2017的CTP 2.0版本开始,可以 ...
最新文章
- RedHat9.0下载地址
- win10系统配置apache 2.4的虚拟主机以及查看 apache的版本
- python画双折线图-Python Pandas 时间序列双轴折线图
- syslog数据接收并处理
- cygwin swoole_swoole入门--------基础概念
- matplotlib polar 雷达图
- SAP License:SAP消息
- linux下文件编码的查看与转换(转)
- Oracle的sql条件带有,oraclesql语句的if
- 如何把Backtrack 5安装到U盘/Backtrack 4安装方法
- Unity3d学习之路-简单打飞碟小游戏
- Rethinking Visual Geo-localization for Large-Scale Applications 论文阅读CosPlace
- BETTER FINE-TUNING BY REDUCING REPRESENTATIONAL COLLAPSE翻译
- win7做服务器性能如何,win7如何做服务器配置
- 【进阶5-1期】重新认识构造函数、原型和原型链
- 网易实况足球获取服务器信息,网易实况足球:游戏疑难杂症解惑,快速通过“老司机”的考核...
- 如何解决镜像过大的问题
- Mac 定时提醒应用 stretchly 配置
- MySQL表相关操作
- mjrefresh自动判断是否隐藏mj_footer