`

浅谈SQL Server触发器的使用

阅读更多

浅谈SQL Server触发器的使用 收藏

来源:http://blog.csdn.net/zouhu562/archive/2009/08/01/4400812.aspx

 

<script type="text/javascript"> document.body.oncopy = function() { if (window.clipboardData) { setTimeout(function() { var text = clipboardData.getData(&quot;text&quot;); if (text &amp;&amp; text.length&gt;300) { text = text + &quot;\r\n\n本文来自CSDN博客,转载请标明出处:&quot; + location.href; clipboardData.setData(&quot;text&quot;, text); } }, 100); } } </script><script type="text/javascript">function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&amp;u='+escape(d.location.href)+'&amp;c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>

http://www.cftea.com/specials/trigger/

 

摘要: 触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由个事件来触发。本文将介绍SQL Server触发器的使用

触发器建立的代码

 

Create Trigger TG_ProjectName
On table1
After Update 
As
Update table2
Set [工程名]=b.工程名
from table2 a,inserted b
where a.ProjID = b.ID

关于触发器中Inserted和Deleted的解释。

inserted触发器语句中使用了两种特殊的表:deleted 表和 inserted 表。Microsoft® SQL Server 2000 自动创建和管理这些表。可以使用这两个临时的驻留内存的表测试某些数据修改的效果及设置触发器操作的条件;然而,不能直接对表中的数据进行更改。

inserted 和 deleted 表主要用于触发器中:

◆扩展表间引用完整性。

◆在以视图为基础的基表中插入或更新数据。

◆检查错误并基于错误采取行动。

◆找到数据修改前后表状态的差异,并基于此差异采取行动。

Deleted 表用于存储 DELETE 和 UPDATE 语句所影响的行的复本。在执行 DELETE 或 UPDATE 语句时,行从触发器表中删除,并传输到 deleted 表中。Deleted 表和触发器表通常没有相同的行。

Inserted 表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 inserted 表和触发器表中。Inserted 表中的行是触发器表中新行的副本。

更新事务类似于在删除之后执行插入;首先旧行被复制到 deleted 表中,然后新行被复制到触发器表和 inserted 表中。

在设置触发器条件时,应当为引发触发器的操作恰当使用 inserted 和 deleted 表。虽然在测试 INSERT 时引用 deleted 表或在测试 DELETE 时引用 inserted 表不会引起任何错误,但是在这种情形下这些触发器测试表中不会包含任何行。

说明

如果触发器操作取决于一个数据修改所影响的行数,应该为多行数据修改(基于 SELECT 语句的 INSERT、DELETE 或 UPDATE)使用测试(如检查 @@ROWCOUNT),然后采取相应的对策。

SQL Server 2000不允许AFTER 触发器引用 inserted 和 deleted 表中的 text、ntext 或 image 列;然而,允许 INSTEAD OF 触发器引用这些列。有关更多信息,请参见 CREATE TRIGGER。

在 INSTEAD OF 触发器中使用 inserted 和 deleted 表

传递到在表上定义的 INSTEAD OF 触发器的 inserted 和 deleted 表遵从与传递到 AFTER 触发器的 inserted 和 deleted 表相同的规则。inserted 和 deleted 表的格式与在其上定义 INSTEAD OF 触发器的表的格式相同。inserted 和 deleted 表中的每一列都直接映射到基表中的列。

有关引用带 INSTEAD OF 触发器的表的 INSERT 或 UPDATE 语句何时必须提供列值的规则与表没有 INSTEAD OF 触发器时相同:

不能为计算列或具有 timestamp 数据类型的列指定值。

不能为具有 IDENTITY 属性的列指定值,除非该列的 IDENTITY_INSERT 为 ON。当 IDENTITY_INSERT 为 ON 时,INSERT 语句必须提供一个值。 INSERT 语句必须为所有无 DEFAULT 约束的 NOT NULL 列提供值。
对于除计算列、标识列或 timestamp 列以外的任何列,任何允许空值的列或具有 DEFAULT 定义的 NOT NULL 列的值都是可选的。

当 INSERT、UPDATE 或 DELETE 语句引用具有 INSTEAD OF 触发器的视图时,数据库引擎将调用该触发器,而不是对任何表采取任何直接操作。即使为视图生成的 inserted 和 deleted 表中的信息格式与基表中的数据格式不同,该触发器在生成执行基表中的请求操作所需的任何语句时,仍必须使用 inserted 和 deleted 表中的信息。
传递到在视图上定义的 INSTEAD OF 触发器的 inserted 和 deleted 表格式与为该视图定义的 SELECT 语句的选择列表相匹配。例如:

 

CREATE VIEW EmployeeNames (EmployeeID, LName, FName) 
AS 
SELECT EmployeeID, LastName, FirstName 
FROM Northwind.dbo.Employees 

视图的结果集有三列:一个 int 列和两个 nvarchar 列。传递到在视图上定义的 INSTEAD OF 触发器的 inserted 和 deleted 表也具有名为 EmployeeID 的 int 列、名为 LName 的 nvarchar 列和名为 FName 的 nvarchar 列。

视图的选择列表还包含不直接映射到单个基表列的表达式。一些视图表达式(如常量调用或函数调用)可能不引用任何列,这类表达式会被忽略。复杂的表达 式会引用多列,但在 inserted 和 deleted 表中,每个插入的行仅有一个值。如果视图中的简单表达式引用具有复杂表达式的计算列,则这些简单表达式也有同样的问题。视图上的 INSTEAD OF 触发器必须处理这些类型的表达式。有关更多信息,请参见视图上 INSTEAD OF 触发器中的表达式和计算列。

顺便说一下,当对某张表建立触发器后,分3种情况讨论

1.插入操作(Insert)

Inserted表有数据,Deleted表无数据

2.删除操作(Delete)

Inserted表无数据,Deleted表有数据

3.更新操作(Update)

Inserted表有数据(新数据),Deleted表有数据(旧数据)

本章描述如何书写触发器函数。 触发器函数可以用 C 或者任何其它可用的过程语言编写。 目前不可能用 SQL 语言书写触发器。

32.1. 触发器行为概述

一个触发器函数可以再一个INSERTUPDATE , 或者 DELETE 命令之前或者之后执行,要么是对每个被修改的行一次, 要么是每条 SQL 一次。 如果发生触发器事件,那么将在合适的时刻调用触发器的函数以处理该事件。

触发器函数必须在创建触发器之前,作为一个没有参数并且返回trigger 类型的函数定义。 (触发器函数通过特殊的 TriggerData 结构接收其输入,而不是用普通函数参数那种形式。)

一旦创建了一个合适的触发器函数,触发器就用 CREATE TRIGGER 创建。同一个触发器函数可以用于多个触发器。

有两种类型的触发器:按行触发的触发器和按语句触发的触发器。在按行触发的触发器里, 触发器函数是为触发触发器的语句影响的每一行执行一次。相比之下,一个按语句触发的触发器是在每执行一次合适的语句执行一次的, 而不管影响的行数。特别是,一个影响零行的语句将仍然导致任何适用的按语句触发的触发器的执行。 这两种类型的触发器有时候分别叫做"行级别的触发器""语句级别的触发器"

语句级别的 "before" 触发器通常在语句开始做任何事情之前触发, 而语句级别的 "after" 触发器在语句的最后触发。 行级别的 "before" 触发器在对特定行进行操作的时候马上触发, 而行级别的 "after" 触发器在语句结束的时候触发(但是在任何语句级别的 "after" 触发器之前)。

按语句触发的触发器应该总是返回 NULL 。 如果必要,按行触发的触发器函数可以给调用它的执行者返回一表数据行(一个类型为 HeapTuple 的数值), 那些在操作之前触发的触发器有以下选择:

  • 它可以返回 NULL 以忽略对当前行的操作。 这就指示执行器不要执行调用该触发器的行级别操作(对特定行的插入或者更改))。

  • 只用于INSERTUPDATE 触发器: 返回的行将成为被插入的行或者是成为将要更新的行。 这样就允许触发器函数修改被插入或者更新的行。

一个无意导致任何这类行为的在操作之前触发的行级触发器必须仔细返回那个被当作新行传进来的同一行 (也就是说,对于 INSERTUPDATE 触发器而言,是 NEW 行, 对于 DELETE 触发器而言,是 OLD 行)。

对于在操作之后触发的行级别的触发器,其返回值会被忽略,因此他们可以返回NULL

如果多于一个触发器为同样的事件定义在同样的关系上, 触发器将按照由名字的字母顺序排序的顺序触发。 如果是事件之前触发的触发器,每个触发器返回的可能已经被修改过的行成为下一个触发器的输入。 如果任何事件之前触发的触发器返回 NULL 指针, 那么其操作被丢弃并且随后的触发器不会被触发。

通常,行的 before 触发器用于检查或修改将要插入或者更新的数据。 比如,一个 before 触发器可以用于把当前时间插入一个时间戳字段, 或者跟踪该行的两个元素是一致的。行的 after 触发器多数用于填充或者更新其它表, 或者对其它表进行一致性检查。这么区分工作的原因是, after 触发器肯定可以看到该行的最后数值, 而 before 触发器不能;还可能有其它的 before 触发器在其后触发。 如果你没有具体的原因定义触发器是 before 还是 after,那么 before 触发器的效率高些, 因为操作相关的信息不必保存到语句的结尾。

如果一个触发器函数执行 SQL 命令,然后这些命令可能再次触发触发器。 这就是所谓的级联触发器。对级联触发器的级联深度没有明确的限制。 有可能出现级联触发器导致同一个触发器的递归调用的情况; 比如,一个 INSERT 触发器可能执行一个命令, 把一个额外的行插入同一个表中,导致 INSERT 触发器再次激发。 避免这样的无穷递归的问题是触发器程序员的责任。

在定义一个触发器的时候,我们可以声明一些参数。 在触发器定义里面包含参数的目的是允许类似需求 的不同触发器调用同一个函数。 比如,我们可能有一个通用的触发器函数, 接受两个字段名字,把当前用户放在第一个,而当前时间戳在第二个。 只要我们写得恰当,那么这个触发器函数就可以和触发它的特定表无关。 这样同一个函数就可以用于有着合适字段的任何表的 INSERT 事件,实现自动跟踪交易表中的记录创建之类的问题。如果定义成一个 UPDATE 触发器,我们还可以用它跟踪最后更新的事件。

每种支持触发器的编程语言都有自己的方法让触发器函数得到输入数据。 这些输入数据包括触发器事件的类型(比如,INSERT 或者 UPDATE )以及所有在 CREATE TRIGGER 里面列出的参数。 对于低层次的触发器,输入数据也包括 INSERTUPDATE 触发器的 NEW 行,和/或 UPDATEDELETE 触发器的 OLD 行。 语句级别的触发器目前没有任何方法检查改语句修改的独立行。

分享到:
评论

相关推荐

    浅谈SQL Server触发器之使用.pdf

    在文档《浅谈SQL Server触发器之使用.pdf》中,作者Meng Qing-fang对SQL Server触发器的使用进行了详细讨论。文章发表在《Computer Knowledge and Technology》杂志上,具体为第10卷第32期,2014年11月发表的文章。...

    浅谈SQL Server触发器功能与应用技巧.pdf

    触发器是数据库系统中重要的功能组件,尤其在SQL Server这类关系型数据库管理系统中,触发器承担着维护数据完整性和实施业务逻辑的关键作用。触发器可以视为特殊类型的存储过程,它不是由用户直接调用执行,而是自动...

    浅谈SQL Server 2000触发器.pdf

    本文将详细介绍SQL Server 2000中触发器的类型、作用以及触发器的执行机制。 首先,触发器的主要作用包括: 1. 自动执行:触发器在数据库表中的数据发生变化之后立即被激活,无需手动调用。 2. 级联更改:触发器...

    浅谈SOL SERVER数据库触发器及应用.pdf

    在SQL Server数据库中,触发器的使用总结: - 触发器适用于强制数据完整性规则。 - 触发器在某些场景下可以替代存储过程和触发器业务逻辑。 - 触发器通过检查和维护数据表中的行变化,确保数据的正确更新。 - 触发器...

    浅谈SQL Server数据库的特点和基本功能.pdf

    SQL Server是微软公司开发的一款关系型数据库管理系统(RDBMS),它作为当前广泛使用的数据库产品之一,具有许多特点和基本功能,使其在不同行业中得到了广泛应用。 首先,SQL Server数据库的特点可以总结为以下几...

    浅谈SQL Server应用方法和技巧.pdf

    SQL Server是微软公司开发的一种关系型数据库管理系统,广泛应用于企业级数据存储和处理。该系统基于Windows NT操作系统,支持多个并发用户。在水利系统中,SQL Server被用于建立和管理多数水利信息数据库。本文档将...

    浅谈SQL Server 2000教学中的体会.pdf

    本文将从教学角度出发,分析在使用SQL Server 2000教学中遇到的几个关键点,以及如何克服教学过程中遇到的难题。 一、数据的完整性 数据完整性是指存储在数据库中数据的一致性和正确性。它包括实体完整性、域完整性...

    浅谈Sql Server数据库数据完整性.pdf

    SQL Server提供了规则(Rule)、约束(Constraint)和触发器(Trigger)来帮助实现用户定义的完整性。 在SQL Server中,数据完整性约束的实现可以通过创建数据库和表来举例说明。例如,在创建一个“学生管理数据库”的...

    浅谈SYBASE的SQL Server及其安装.pdf

    **浅谈SYBASE的SQL Server及其安装** SQL Server是由SYBASE公司开发的一种关系型数据库管理系统,它在客户/服务器架构中扮演着核心角色,支持SQL(结构化查询语言)进行数据管理和访问。本文将深入探讨SQL Server的...

    浅谈SQL SERVER表级数据恢复.pdf

    SQL Server数据库作为一款广泛使用的关系型数据库管理系统,提供了多种备份和恢复功能,包括完整备份、差异备份、文件备份、事务日志备份等。这些功能可以帮助数据库管理员在发生数据错误或损坏时,只恢复需要的部分...

    浅谈SQL Server数据库中存储过程的应用——以电子交易系统为例.pdf

    本文以大宗商品现货电子交易系统为例,探讨了SQL Server数据库存储过程的应用,以及触发器技术在电子交易系统中的运用。 首先,介绍SQL Server数据库系统。Microsoft SQL Server是一款可扩展、高性能的关系型数据库...

    浅谈应用程序从SQL Server向神通数据库的移植.pdf

    应用程序从SQL Server向国产神通数据库移植的过程涉及多个知识点,包括数据库基础知识、ODBC接口、数据处理等。下面将详细阐述这些知识点: 1. 数据库基础 数据库是存储、管理、处理和检索数据的系统。在数据库系统...

    浅谈Transact-SQL

    **Transact-SQL**,简称T-SQL,是SQL Server的核心语言,用于与SQL Server实例进行通信。不论应用程序的用户界面如何,所有与服务器交互的应用程序都会通过发送T-SQL语句来完成任务。T-SQL是ANSI SQL标准的一个实现...

    浅谈Datafactory

    **标题:“浅谈Datafactory”** Datafactory是一个强大的数据处理工具,它允许用户构建、部署和管理数据集成工作流。这个工具的核心理念是提供一个灵活的平台,以便于在不同的数据源之间移动、转换和清洗数据,从而...

    ASP.NET3.5从入门到精通

    7.2 使用SQL Server 2005 管理数据库 7.2.1 初步认识SQL Server 2005 7.2.2 创建数据库 7.2.3 删除数据库 7.2.4 备份数据库 7.2.5 还原数据库 7.2.6 创建表 7.2.7 删除表 7.2.8 创建数据库关系图 7.3 ADO.NET 连接...

    ASP.NET 3.5 开发大全11-15

    7.2 使用SQL Server 2005 管理数据库 7.2.1 初步认识SQL Server 2005 7.2.2 创建数据库 7.2.3 删除数据库 7.2.4 备份数据库 7.2.5 还原数据库 7.2.6 创建表 7.2.7 删除表 7.2.8 创建数据库关系图 7.3 ADO.NET连接SQL...

    ASP.NET 3.5 开发大全

    7.2 使用SQL Server 2005 管理数据库 7.2.1 初步认识SQL Server 2005 7.2.2 创建数据库 7.2.3 删除数据库 7.2.4 备份数据库 7.2.5 还原数据库 7.2.6 创建表 7.2.7 删除表 7.2.8 创建数据库关系图 7.3 ADO.NET连接SQL...

    ASP.NET 3.5 开发大全1-5

    7.2 使用SQL Server 2005 管理数据库 7.2.1 初步认识SQL Server 2005 7.2.2 创建数据库 7.2.3 删除数据库 7.2.4 备份数据库 7.2.5 还原数据库 7.2.6 创建表 7.2.7 删除表 7.2.8 创建数据库关系图 7.3 ADO.NET连接SQL...

    ASP.NET 3.5 开发大全word课件

    7.2 使用SQL Server 2005 管理数据库 7.2.1 初步认识SQL Server 2005 7.2.2 创建数据库 7.2.3 删除数据库 7.2.4 备份数据库 7.2.5 还原数据库 7.2.6 创建表 7.2.7 删除表 7.2.8 创建数据库关系图 7.3 ADO.NET连接SQL...

    ASPNET35开发大全第一章

    7.2 使用SQL Server 2005 管理数据库 7.2.1 初步认识SQL Server 2005 7.2.2 创建数据库 7.2.3 删除数据库 7.2.4 备份数据库 7.2.5 还原数据库 7.2.6 创建表 7.2.7 删除表 7.2.8 创建数据库关系图 7.3 ADO.NET连接SQL...

Global site tag (gtag.js) - Google Analytics