浅谈SQL Server 数据库之触发器

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:


触发器1_概念


触发器的特征:


1、 触发器是在对表进行增、删、改时, 自动执行的存储过程 。触发器常用于 强制业务规则 ,它是一种 高级约束 ,通过 事件 进行触发 而被执行。

2、触发器是一个特殊的事务单元,可以引用其他表中的列执行特殊的业务规则或数据逻辑关系。当出现错误时,可以执行rollback transaction操作将整个触发器以及触发它的T-SQL语句一并回滚(不需显示声明begin transaction)。


3、每个触发器将用到的两个临时表

    deleted 临时表: 用于临时存放被删除的记录行副本(包括delete和update语句所影响的数据行);
                  注意:被删除的记录行,首先从原始表中删除,并保存到触发器表。然后从触发器表中删除,再保存到deleted表。

    inserted临时表: 用于临时存放插入的记录行副本(包括insert和update语句所影响的数据行);

     deleted表和inserted表的特征:
    > 这两个表的表结构与该触发器作用的表相同;
    > 这两个表是逻辑表,并且由系统管理;
    > 这两个表是动态驻留在内存中的(不是存储在数据库中),当触发器工作完成后,它们也被删除;
    > 这两个表是只读的,即只能运用select语句查看(用户不能直接更改);

4、 所创建的 触发器(insert、delete、update)是在原表数据行已经修改完成后再触发 。所以,触发器是在约束检查之后才执行。


什么时候使用触发器?

a、 实现主外键关系所不能保证的 复杂参照完整性 数据的一致性。
    不过,通过 “级联引用完整性约束” 可以更有效地执行这些更改。

b、 防止恶意或错误的 INSERT、UPDATE 以及 DELETE 操作,并强制执行比 CHECK 约束定义的限制更为复杂的其他限制。
   > 与 CHECK 约束不同(check约束只能引用自身表中的列),DML 触发器可以引用其他表中的列
   > 触发器可以完成 所有约束的功能 ,但不一定是最佳方案;
   > 触发器能够使用 自定义信息 和较为 复杂的错误处理

c、 DML 触发器可以 评估数据修改前后表的状态 ,并根据该差异采取措施。

d、 一个表中的 同一个修改语句的DML触发器,允许被多个不同的操作 (INSERT、UPDATE 或 DELETE)来 响应


触发器的类型:

insert 触发器 ;(略)
delete 触发器 ;(略)
update 触发器 :在修改表中记录行或某列数据时触发执行;
注意:update(列)函数:实现检测某列是否被修改。

update 更新操作分为两步:
首先, “删除”更改前原有数据行 :删除的原有数据行将复制到deleted临时表中;
然后, “插入”更改后的新数据行 :插入新数据行到原始表,同时将新数据行保存到inserted临时表和触发器表中;


创建触发器的注意点:
1、 create trigger必须是批处理(go)的第一条语句;

2、 一个触发器语句只能用到一个表或一个视图中;
   on 表名/ 视图名

3、 一个触发器语句可以执行多个操作;
   for delete,insert,update -- 无先后顺序的任意组合

4、 建议DML触发器不返回任何结果。这是因为对这些返回结果的特殊处理必须写入每个允许对触发器表进行修改的应用程序中。
     若要防止从 DML 触发器返回任何结果,请不要在触发器定义中包含select语句或变量赋值;
     如果必须在触发器中进行变量赋值,则应该在触发器被触发之前使用set nocount on语句以避免返回任何结果集;

      注意:未来版本的SQL Server 中,将会删除从触发器返回结果集的功能。 

5、如果“触发器表”本身也存在约束,则在执行insert、delete、update触发器前,首先会检查“触发器表”上存在的约束。如果不满足约束,则不会执行其insert、delete、update触发器。


 

查看当前数据库中的所有触发器
select   *   from  sys.triggers

 

创建临时表 #tableName

create   table  #tableName



如何使用 SQL Server 触发器

 

触发器2_初始化环境SQL

初始化环境


触发器3_定义触发器的格式

定义触发器的格式


触发器4_insert 触发器SQL 

insert 触发器


触发器5_delete 触发器SQL 

delete 触发器


触发器6_update 触发器SQL 

update 触发器


 

触发器7_MSDN参考


加密 dml触发器定义
      若要确保其他用户不能查看触发器定义,可以使用with encryption子句加密 dml 触发器。
      使用with encryption子句后,触发器定义即以无法读取的格式进行存储。
      触发器定义加密后,无法进行解密。且任何人都无法进行查看,包括触发器的所有者和系统管理员。


update() 函数:
可用于确定 insert或 update语句是否影响表中的特定列。
无论何时为列赋值,该函数都将返回 true。

使用if update() 子句示例:

if update()子句示例

注意:  
      由于 delete 语句无法只对某列进行删除,
      因此不能将if update()子句应用于delete 语句。

 

columns_updated() 函数:
也可用于检查 insert或 update语句更新了表中的哪些列。
此函数使用整数位掩码指定要测试的列。

使用columns_updated() 函数示例:

columns_updated()函数示例



本文转自钢钢博客园博客,原文链接:http://www.cnblogs.com/xugang/archive/2010/02/20/1669619.html,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
16天前
|
SQL 数据库 数据安全/隐私保护
SQL Server数据库Owner导致事务复制log reader job无法启动的解决办法
【8月更文挑战第14天】解决SQL Server事务复制Log Reader作业因数据库所有者问题无法启动的方法:首先验证数据库所有者是否有效并具足够权限;若非,使用`ALTER AUTHORIZATION`更改为有效登录名。其次,确认Log Reader使用的登录名拥有读取事务日志所需的角色权限。还需检查复制配置是否准确无误,并验证Log Reader代理的连接信息及参数。重启SQL Server Agent服务或手动启动Log Reader作业亦可能解决问题。最后,审查SQL Server错误日志及Windows事件查看器以获取更多线索。
|
18天前
|
SQL Java 数据库
jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上
该博客文章介绍了在JSP应用中使用Servlet查询SQL Server数据库的表信息,并通过JavaBean封装图书信息,将查询结果展示在Web页面上的方法。
jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上
|
7天前
|
SQL 数据库
Microsoft SQL Server 2014如何来备份数据库
Microsoft SQL Server 2014如何来备份数据库
10 3
|
13天前
|
SQL 关系型数据库 MySQL
SQL数据库和 SQLserver数据库
【8月更文挑战第19天】SQL数据库和 SQLserver数据库
26 2
|
13天前
|
SQL 存储 安全
SQL Server数据库创建
【8月更文挑战第19天】SQL Server数据库创建
23 1
|
15天前
|
SQL 关系型数据库 数据库
数据库空间之谜:彻底解决RDS for SQL Server的空间难题
【8月更文挑战第16天】在管理阿里云RDS for SQL Server时,合理排查与解决空间问题是确保数据库性能稳定的关键。常见问题包括数据文件增长、日志文件膨胀及索引碎片累积。利用SQL Server的动态管理视图(DMV)可有效监测文件使用情况、日志空间及索引碎片化程度。例如,使用`sp_spaceused`检查文件使用量,`sys.dm_db_log_space_usage`监控日志空间,`sys.dm_db_index_physical_stats`识别索引碎片。同时,合理的备份策略和文件组设置也有助于优化空间使用,确保数据库高效运行。
30 2
|
18天前
|
SQL Java 关系型数据库
应用DriverManager类创建sqlserver数据库连接实例 JSP中使用数据库
该博客文章介绍了在JSP中使用JDBC连接SQL Server数据库的方法,包括加载数据库驱动、建立数据库连接的过程,并提供了一个使用DriverManager类创建数据库连接的Java示例代码。
|
17天前
|
存储 SQL 数据库
触发器的设计、掌握存储过程的基本概念和创建、执行、删除方法。掌握数据库备份的方法和数据库恢复的方法。
这篇文章介绍了数据库中触发器的设计概念,包括创建、修改、删除触发器的方法,并通过实验内容教授如何使用SQL命令创建DML触发器以及如何利用触发器实现数据的完整性和自动化处理。
触发器的设计、掌握存储过程的基本概念和创建、执行、删除方法。掌握数据库备份的方法和数据库恢复的方法。
|
9天前
|
SQL 数据库 Windows
【应用服务 App Service】当使用EntityFrameWorkCore访问Sql Server数据库时,在Azure App Service会出现Cannot create a DbSet for ** because this type is not included in the model for the context的错误
【应用服务 App Service】当使用EntityFrameWorkCore访问Sql Server数据库时,在Azure App Service会出现Cannot create a DbSet for ** because this type is not included in the model for the context的错误
|
10天前
|
SQL 网络协议 数据库连接
"解锁数据连接新技能:Python携手SqlServer,轻松驾驭企业级数据库挑战!"
【8月更文挑战第21天】本文介绍如何在Python中连接SqlServer数据库。首先,需安装`pyodbc`库:`pip install pyodbc`。接着配置数据库详情如服务器地址、端口等。示例代码展示如何建立连接、执行查询及处理结果。务必确认TCP/IP已启用并使用合适ODBC驱动。了解这些步骤可助您更好地利用Python进行数据管理。
23 0

热门文章

最新文章

下一篇
云函数