热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据库技术:SQLServer之创建DMLAFTERINSERT触发器

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

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

示例结果:

SQLServer之创建DML AFTER INSERT触发器

SQLServer之创建DML AFTER INSERT触发器

dml after insert触发器优缺点

优点:

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

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

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

缺点:

  1、可移植性差。

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

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

 

需要了解更多数据库技术:SQLServer之创建DML AFTER INSERT触发器,都可以关注数据库技术分享栏目—编程笔记


推荐阅读
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
author-avatar
九九九丶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有