SQLServer之创建DML AFTER INSERT触发器

DML AFTER INSERT触发器创建原理

触发器触发时,系统自动在内存中创建deleted表或inserted表,内存中创建的表只读,不允许修改,触发器执行完成后,自动删除。

insert触发器工作原理:第一步执行insert插入语句,在表中插入数据行,第二步触发insert触发器,向系统临时表insert表中插入新行的备份(副本),第三部触发器检查insert表中插入的新行数据,确定是否要回滚或执行其他操作。

不能使用SSMS数据库管理工具直接创建DML添加触发器,可以使用T-SQL脚本创建DML添加触发器。

DML AFTER INSERT触发器创建

语法:包含参数释义

--声明数据库引用
use 数据库名;
go

--判断是否存在触发器,如果存在则删除
if exists(select * from sysobjects where name=触发器名)
drop trigger 触发器名;
go

--创建插入触发器
create
trigger --触发器标识符
 --DML 触发器所属架构的名称。 DML 触发器的作用域是为其创建该触发器的表或视图的架构。 不能为 DDL 或登录触发器指定
[架构名称.] 触发器名 --触发器的名称

--对其执行 DML 触发器的表或视图,有时称为触发器表或触发器视图。 可以根据需要指定表或视图的完全限定名称。 视图只能被 INSTEAD OF 触发器引用。 不能对局部或全局临时表定义 DML 触发器。
on [架构名称.] { 表名 | 视图名 }

with
--对 CREATE TRIGGER 语句的文本进行模糊处理。使用WITH ENCRYPTION可以防止将触发器作为SQL Server复制的一部分进行发布。不能为 CLR 触发器指定 WITH ENCRYPTION。
encryption,

--指示触发器已本机编译。 (只能应用于table)
--内存优化表上的触发器需要使用此选项。
--native_compilation,

--确保不能删除或更改触发器引用的表。 (只能应用于table)
--内存优化表上的触发器需要使用此选项,但此选项不支持传统表上的触发器。
schemabinding

--EXECUTE AS
--指定用于执行该触发器的安全上下文。 允许您控制 SQL Server 实例用于验证被触发器引用的任意数据库对象的权限的用户帐户。
--内存优化表上的触发器需要使用此选项。
--execute as clause

--FOR | AFTER
--AFTER 指定 DML 触发器仅在触发 SQL 语句中指定的所有操作都已成功执行时才被触发。 所有的引用级联操作和约束检查也必须在激发此触发器之前成功完成。
--如果仅指定 FOR 关键字,则 AFTER 为默认值。
--不能对视图定义 AFTER 触发器。
{ for | after }

--{ [DELETE] [,] [INSERT] [,] [UPDATE] }
--指定数据修改语句,这些语句可在 DML 触发器对此表或视图进行尝试时激活该触发器。 必须至少指定一个选项。 在触发器定义中允许使用上述选项的任意顺序组合。
--对于 INSTEAD OF 触发器,不允许对具有指定级联操作 ON DELETE 的引用关系的表使用 DELETE 选项。 同样,也不允许对具有指定级联操作 ON UPDATE 的引用关系的表使用 UPDATE 选项。
{ [insert] [,] [update] [,] [delete] }

--指定应该再添加一个现有类型的触发器。 WITH APPEND 不能与 INSTEAD OF 触发器一起使用。如果显式声明了 AFTER 触发器,则也不能使用该子句。
--仅当为了向后兼容而指定了 FOR 时(但没有 INSTEAD OF 或 AFTER)时,才能使用 WITH APPEND。 如果指定了 EXTERNAL NAME(即触发器为 CLR 触发器),则不能指定 WITH APPEND。
--with append

--指示当复制代理修改涉及到触发器的表时,不应执行触发器。
--not for replication

as
begin
  sql_statement
end
go

示例:

--声明数据库引用
use testss;
go

--判断是否存在触发器,如果存在则删除
if exists(select * from sysobjects where name=‘inserttri‘)
drop trigger inserttri;
go

--创建插入触发器
create
trigger --触发器标识符
--[dbo.] --DML 触发器所属架构的名称。 DML 触发器的作用域是为其创建该触发器的表或视图的架构。 不能为 DDL 或登录触发器指定
dbo.inserttri --触发器的名称
on dbo.test1 --对其执行 DML 触发器的表或视图,有时称为触发器表或触发器视图。 可以根据需要指定表或视图的完全限定名称。 视图只能被 INSTEAD OF 触发器引用。 不能对局部或全局临时表定义 DML 触发器。

with
--对 CREATE TRIGGER 语句的文本进行模糊处理。使用WITH ENCRYPTION可以防止将触发器作为SQL Server复制的一部分进行发布。不能为 CLR 触发器指定 WITH ENCRYPTION。
encryption,

--指示触发器已本机编译。 (只能应用于table)
--内存优化表上的触发器需要使用此选项。
--native_compilation,

--确保不能删除或更改触发器引用的表。 (只能应用于table)
--内存优化表上的触发器需要使用此选项,但此选项不支持传统表上的触发器。
schemabinding

--EXECUTE AS
--指定用于执行该触发器的安全上下文。 允许您控制 SQL Server 实例用于验证被触发器引用的任意数据库对象的权限的用户帐户。
--内存优化表上的触发器需要使用此选项。
--execute as clause

--FOR | AFTER
--AFTER 指定 DML 触发器仅在触发 SQL 语句中指定的所有操作都已成功执行时才被触发。 所有的引用级联操作和约束检查也必须在激发此触发器之前成功完成。
--如果仅指定 FOR 关键字,则 AFTER 为默认值。
--不能对视图定义 AFTER 触发器。
for

--{ [DELETE] [,] [INSERT] [,] [UPDATE] }
--指定数据修改语句,这些语句可在 DML 触发器对此表或视图进行尝试时激活该触发器。 必须至少指定一个选项。 在触发器定义中允许使用上述选项的任意顺序组合。
--对于 INSTEAD OF 触发器,不允许对具有指定级联操作 ON DELETE 的引用关系的表使用 DELETE 选项。 同样,也不允许对具有指定级联操作 ON UPDATE 的引用关系的表使用 UPDATE 选项。
insert

--指定应该再添加一个现有类型的触发器。 WITH APPEND 不能与 INSTEAD OF 触发器一起使用。如果显式声明了 AFTER 触发器,则也不能使用该子句。
--仅当为了向后兼容而指定了 FOR 时(但没有 INSTEAD OF 或 AFTER)时,才能使用 WITH APPEND。 如果指定了 EXTERNAL NAME(即触发器为 CLR 触发器),则不能指定 WITH APPEND。
--with append

--指示当复制代理修改涉及到触发器的表时,不应执行触发器。
--not for replication

as
begin
declare @names nvarchar(50)=null;
set @names=(select top(1) name from dbo.test1 order by id desc );
if(select @names) is not null
begin
insert into dbo.test2(name) values(@names);
end
end
go

示例结果:

DML AFTER INSERT触发器优缺点

优点:

  1、在新增时可以实现比约束更为严格的约束检查。

  2、可以实现表之间复杂的业务逻辑关联。

  3、可以实现数据插入时自动添加日志表记录。

缺点:

  1、可移植性差。

  2、占用服务器资源,给服务器造成压力。

  3、执行速度主要取决于数据库服务器的性能与触发器代码的复杂程度。

原文地址:https://www.cnblogs.com/vuenote/p/9765156.html

时间: 2024-10-09 02:52:32

SQLServer之创建DML AFTER INSERT触发器的相关文章

SqlServer中创建Oracle连接服务器

转自太祖元年的:http://www.cnblogs.com/jirglt/archive/2012/06/10/2544025.html参考:http://down.51cto.com/data/910072SqlServer中创建Oracle连接服务器 第一种:界面操作 (1)展开服务器对象-->链接服务器-->右击“新建链接服务器”(2)输入链接服务器的IP (3)链接成功后 第二种:语句操作 注:需要提前安装Oracle客户端程序,重启机器.(如果没有Oracle客户端程序,提示“未找

sql insert触发器 批量插入 游标

本人目前就职于一家B2C网站,今天在工作中碰到了一个问题,就是需要把有着几百万条数据的订单表table1数据复制到另一个提供给商户查看的表table2中,在插入到table2表时需要对新插入的数据进行分析分别录入到table3表和table4表中,同是table2表中数据保留.如果把查询出来的数据ctrl+c到table2中触发器会有效果,不过百十万的数据让我去粘的话,今天就可以歇着了! 当我们想要使用insert into table1 select * from table2时,触发器只会执

sqlserver 大数据量的insert、delete操作优化

http://blog.csdn.net/lanyuzhen/article/details/7547476 --大批量导出orders表:insert DBCC DROPCLEANBUFFERS  DBCC FREEPROCCACHE goSET NOCOUNT ON BEGIN TRANSACTION  INSERT INTO test.dbo.orders with(tablock) SELECT * FROM bak.dbo.OrdersWHERE ordertime BETWEEN '

Sql语句在SqlServer中创建数据库、表格并添加约束

通过Sql语句来创建数据库与架构 创建数据库 数据库的创建首先是要引用主数据库的,需要在master数据库的环境下进行创建.大致的语法如下: 1 -- 使用master数据库 2 use master 3 -- 创建数据库 4 create datebase [架构名.]数据库名 5 on [primary]--主文件数据描述 6 ( 7 name = '数据库逻辑名', --一般是数据库的名称 8 filename = '数据文件的名字',--全路径 9 size = 12mb, --数据文件

创建dml触发器

-实现删除学生信息时把该学生的成绩记录全部清空 --判断触发器是否存在 if exists(select * from sysobjects where name = 'delete_student') drop trigger delete_student go create trigger delete_student --在哪个表 on student --执行什么操作时触发 for insert as --sql程序 begin print '操作执行中' select * from i

SqlServer XML数据类型DML相关操作(图文结合)

XML操作很少用到,最近查询个语句,还得到官网查看用法.所以按照官方把相关的DML都操作一遍,作为记录!~ -- 测试数据 -- DROP TABLE #XMLTab CREATE TABLE #XMLTab(colxml XML) GO INSERT INTO #XMLTab SELECT N' <Record dt="2015-05-05"> <Exception type="RING_BUFFER_EXCEPTION"> <Tas

数据库基本操作(创建表和添加触发器)

测试(从头开始走一遍流程): 1)创建Person表: [sql] view plaincopy drop table person; create table person( id int NOT NULL AUTO_INCREMENT primary key, name varchar(8) not null, sex bit, age int check(age > 0 and age < 200), addr varchar(100) default '' not null ); se

SQLServer之创建视图

视图定义 视图是一个虚拟的表,是一个表中的数据经过某种筛选后的显示方式,视图由一个预定义的查询select语句组成. 使用SSMS数据库管理工具创建视图 1.连接数据库,选择数据库,展开数据库->右键视图->选择新建视图. 2.在添加表弹出框->选择要创建视图的表.视图.函数.或者同义词等->点击添加->添加完成后选择关闭. 3.在关系图窗格中->选择表与表之间关联的数据列->选择列的其他排序或筛选条件. 4.点击保存或者ctrl+s->刷新视图->查

SQLServer之创建Transact-SQL游标

什么是游标 结果集,结果集就是select查询之后返回的所有行数据的集合. 游标则是处理结果集的一种机制吧,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据. 一般复杂的存储过程,都会有游标的出现,他的用处主要有: 定位到结果集中的某一行. 对当前位置的数据进行读写. 可以对结果集中的数据单独操作,而不是整行执行相同的操作. 是面向集合的数据库管理系统和面向行的程序设计之间的桥梁. 游标使用三步曲:第一步创建游标,第二步打开游标,第三步使用游标. 游标