<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>触发器</title>
	<atom:link href="https://www.aitaocui.cn/tag/268456/feed" rel="self" type="application/rss+xml" />
	<link>https://www.aitaocui.cn</link>
	<description>翡翠玉石爱好者聚集地</description>
	<lastBuildDate>Tue, 29 Nov 2022 05:31:29 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.1.1</generator>

<image>
	<url>https://www.aitaocui.cn/wp-content/uploads/2022/11/taocui.png</url>
	<title>触发器</title>
	<link>https://www.aitaocui.cn</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>触发器(数据库原理术语)</title>
		<link>https://www.aitaocui.cn/article/380821.html</link>
					<comments>https://www.aitaocui.cn/article/380821.html#respond</comments>
		
		<dc:creator><![CDATA[痞子张]]></dc:creator>
		<pubDate>Tue, 29 Nov 2022 05:31:29 +0000</pubDate>
				<category><![CDATA[知识]]></category>
		<category><![CDATA[触发器]]></category>
		<guid isPermaLink="false">https://www.aitaocui.cn/?p=380821</guid>

					<description><![CDATA[触发器（trigger）是个特殊的存储过程，它的执行不是由程序调用，也不是手工启动，而是由个事件来触发，比如当对一个表进行操作（insert，delete，update）时就会激活...]]></description>
										<content:encoded><![CDATA[</p>
<article>
<p>触发器（trigger）是个特殊的存储过程，它的执行不是由程序调用，也不是手工启动，而是由个事件来触发，比如当对一个表进行操作（insert，delete，update）时就会激活它执行。每个触发器都包含确定触发器激活条件的设置。</p>
</article>
<article>
<h1>触发器</h1>
<p>数据库领域名词触发器（trigger）是个特殊的存储过程，它的执行不是由程序调用，也不是手工启动，而是由个事件来触发，比如当对一个表进行操作（insert，delete，update）时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。触发器可以从DBA_TRIGGERS，USER_TRIGGERS数据字典中查到。</p>
<p>触发器可以查询其他表，而且可以包含复杂的SQL语句。它们主要用于强制服从复杂的业务规则或要求。例如：您可以根据客户当前的帐户状态，控制是否允许插入新订单。</p>
<p>触发器也可用于强制引用完整性，以便在多个表中添加、更新或删除行时，保留在这些表之间所定义的关系。然而，强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图，则可以在表之间创建关系以自动创建外键约束。</p>
<p>创建触发器的SQL语法delimiter | CREATE TRIGGER &#8220;.&#8220; &lt; [ BEFORE | AFTER ] &gt; &lt; [ INSERT | UPDATE | DELETE ] &gt; ON FOR EACH ROW BEGIN &#8211;do something END |</p>
<h1>工作原理</h1>
<p>触发器可以查询其他表，而且可以包含复杂的SQL语句。它们主要用于强制服从复杂的业务规则或要求。例如：您可以根据客户当前的帐户状态，控制是否允许插入新订单。</p>
<p>触发器也可用于强制引用完整性，以便在多个表中添加、更新或删除行时，保留在这些表之间所定义的关系。然而，强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图，则可以在表之间创建关系以自动创建外键约束。</p>
<p>SQLServer包括三种常规类型的触发器：DML触发器、DDL触发器和登录触发器。</p>
<h2 id="a-867b2994">DML触发器</h2>
<p>当数据库中表中的数据发生变化时，包括insert,update,delete任意操作，如果我们对该表写了对应的DML触发器，那么该触发器自动执行。DML触发器的主要作用在于强制执行业务规则，以及扩展SqlServer约束，默认值等。因为我们知道约束只能约束同一个表中的数据，而触发器中则可以执行任意Sql命令。</p>
<h2 id="a-afe77fe6">DDL触发器</h2>
<p>它是SqlServer2005新增的触发器，主要用于审核与规范对数据库中表，触发器，视图等结构上的操作。比如在修改表，修改列，新增表，新增列等。它在数据库结构发生变化时执行，我们主要用它来记录数据库的修改过程，以及限制程序员对数据库的修改，比如不允许删除某些指定表等。</p>
<h2 id="a-4c776bd3">登录触发器</h2>
<p>登录触发器将为响应LOGON事件而激发存储过程。与SQLServer实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。因此，来自触发器内部且通常将到达用户的所有消息（例如错误消息和来自PRINT语句的消息）会传送到SQLServer错误日志。如果身份验证失败，将不激发登录触发器。</p>
<h2 id="a-db19869a">触发器的优点</h2>
<p>触发器可通过数据库中的相关表实现级联更改，不过，通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制比用CHECK约束定义的约束更为复杂的约束。与CHECK约束不同，触发器可以引用其它表中的列。例如，触发器可以使用另一个表中的SELECT比较插入或更新的数据，以及执行其它操作，如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态，并根据其差异采取对策。一个表中的多个同类触发器（INSERT、UPDATE或DELETE）允许采取多个不同的对策以响应同一个修改语句。</p>
<h1>触发器的优点</h1>
<p>触发器可通过数据库中的相关表实现级联更改；不过，通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制比用CHECK约束定义的约束更为复杂的约束。与CHECK约束不同，触发器可以引用其它表中的列。例如，触发器可以使用另一个表中的SELECT比较插入或更新的数据，以及执行其它操作，如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态，并根据其差异采取对策。</p>
<p>一个表中的多个同类触发器（INSERT、UPDATE或DELETE）允许采取多个不同的对策以响应同一个修改语句。约束和触发器在特殊情况下各有优势。触发器的主要好处在于它们可以包含使用Transact-SQL代码的复杂处理逻辑。因此，触发器可以支持约束的所有功能；但它在所给出的功能上并不总是最好的方法。实体完整性总应在最低级别上通过索引进行强制，这些索引或是PRIMARY KEY和UNIQUE约束的一部分，或是在约束之外独立创建的。</p>
<p>假设功能可以满足应用程序的功能需求，域完整性应通过CHECK约束进行强制，而引用完整性(RI)则应通过FOREIGN KEY约束进行强制。在约束所支持的功能无法满足应用程序的功能要求时，触发器就极为有用。</p>
<p>例如：除非REFERENCES子句定义了级联引用操作，否则FOREIGN KEY约束只能以与另一列中的值完全匹配的值来验证列值。</p>
<p>CHECK约束只能根据逻辑表达式或同一表中的另一列来验证列值。如果应用程序要求根据另一个表中的列验证列值，则必须使用触发器。</p>
<p>约束只能通过标准的系统错误信息传递错误信息。如果应用程序要求使用（或能从中获益）自定义信息和较为复杂的错误处理，则必须使用触发器。</p>
<p>触发器可通过数据库中的相关表实现级联更改；不过，通过级联引用完整性约束可以更有效地执行这些更改。</p>
<p>触发器可以禁止或回滚违反引用完整性的更改，从而取消所尝试的数据修改。当更改外键且新值与主键不匹配时，此类触发器就可能发生作用。例如，可以在titleauthor.title_id上创建一个插入触发器，使它在新值与titles.title_id中的某个值不匹配时回滚一个插入。不过，通常使用 FOREIGN KEY 来达到这个目的。</p>
<p>如果触发器表上存在约束，则在 INSTEAD OF 触发器执行后但在 AFTER 触发器执行前检查这些约束。如果约束破坏，则回滚INSTEAD OF 触发器操作并且不执行 AFTER 触发器。</p>
<p>触发器到底可不可以在视图上创建 在 SQL Server?联机丛书中，是没有说触发器不能在视图上创建的，并且在语法解释中表明：在 CREATE TRIGGER 的 ON 之后可以是视图。然而，事实似乎并不是如此，很多专家也说触发器不能在视图上创建。我也专门作了测试，的确如此，不管是普通视图还是索引视图，都无法在上面创建触发器，真的是这样吗？请点击详细，但是无可厚非的是：当在临时表或系统表上创建触发器时会遭到拒绝。</p>
<p>深刻理解FOR CREATE TRIGGER语句的FOR关键字之后可以跟INSERT、UPDATE、DELETE中的一个或多个，也就是说在其它情况下是不会触发触发器的，包括SELECT、TRUNCATE、WRITETEXT、UPDATETEXT。相关内容一个有趣的应用我们看到许多注册系统在注册后都不能更改用户名，但这多半是由应用程序决定的，如果直接打开数据库表进行更改，同样可以更改其用户名,在触发器中利用回滚就可以巧妙地实现无法更改用户名……详细内容触发器内部语句出错时……这种情况下，前面对数据更改操作将会无效。</p>
<p>举个例子，在表中插入数据时触发触发器，而触发器内部此时发生了运行时错误，那么将返回一个错误值，并且拒绝刚才的数据插入。</p>
<p>不能在触发器中使用的语句：</p>
<p>触发器中可以使用大多数 T-SQL 语句，但如下一些语句是不能在触发器中使用的。</p>
<p>CREATE 语句，如：CREATE DATABASE、CREATE TABLE、CREATE INDEX 等。</p>
<p>ALTER 语句，如：ALTER DATABASE、ALTER TABLE、ALTER INDEX 等。</p>
<p>DROP 语句，如：DROP DATABASE、DROP TABLE、DROP INDEX 等。</p>
<p>DISK 语句，如：DISK INIT、DISK RESIZE。</p>
<p>LOAD 语句，如：LOAD DATABASE、LOAD LOG。</p>
<p>RESTORE 语句，如：RESTORE DATABASE、RESTORE LOG。</p>
<p>RECONFIGURE</p>
<p>Truncate Table 语句在sybase的触发器中不可使用！</p>
<p>慎用触发器，触发器功能强大，轻松可靠地实现许多复杂的功能，为什么又要慎用呢。触发器本身没有过错，但由于我们的滥用会造成数据库及应用程序的维护困难。在数据库操作中，我们可以通过关系、触发器、存储过程、应用程序等来实现数据操作……同时规则、约束、缺省值也是保证数据完整性的重要保障。如果我们对触发器过分的依赖，势必影响数据库的结构，同时增加了维护的复杂程序.</p>
<h1>触发器特性</h1>
<p>有三个基本特性：</p>
<p>(1)有两个稳态，可分别表示二进制数码0和1，无外触发时可维持稳态;</p>
<p>(2)外触发下，两个稳态可相互转换(称翻转)，已转换的稳定状态可长期保持下来，这就使得触发器能够记忆二进制信息，常用作二进制存储单元。</p>
<p>(3)有两个互补输出端，分别用Q和Q-表示。</p>
<h1>数字电路领域名词</h1>
<p>学名“双稳态多谐振荡器（Bistable Multivibrator）”。触发器（Flip Flop）是一种可以存储电路状态的电子元件。最简单的是由两个或非门，两个输入端和两个输出端组成的RS触发器（见图）。复杂一些的有带时钟（CLK）段和D（Data）端，在CLK端为高电平时跟随D端状态，而在CLK端变为低电平的瞬间锁存信号的D触发器。更常用的是两个简单D触发器级联而成的在时钟下跳沿所存信号的边缘D触发器，广泛应用于计数器、运算器、存储器等电子部件。</p>
<p>触发器的类型：</p>
<p>按逻辑功能不同分为：RS触发器、D触发器、JK触发器、T触发器。</p>
<p>按触发方式不同分为：电平触发器、边沿触发器和主从触发器。</p>
<p>按电路结构不同分为：基本RS触发器和钟控触发器。</p>
<p>按存储数据原理不同分为：静态触发器和动态触发器。</p>
<p>按构成触发器的基本器件不同分为：双极型触发器和MOS型触发器。</p>
<p>照明配件</p>
<p>用于高强度气体放电灯(H.I.D)的启动,型号繁多.由于高强度气体放电灯启动时需要一个高电压来使气体电离进入等离子态，因而需要一个高压发生器做为启动器。这就是触发器早期的机械型触发器已经淘汰。现在绝大多数触发器都是使用可控硅或高压触发二极管的电子触发器，常用的型号有：OSRAM的CD-7飞利浦的SI51 SN58爱伦的ALK400等</p>
<h1>Sqlserver示例</h1>
<p>insert 触发器示例</p>
<p>create trigger tri_insert</p>
<p>on student</p>
<p>for insert</p>
<p>as</p>
<p>declare @student_id char(10)</p>
<p>select @student_id=s.student_id from</p>
<p>student s inner join inserted i</p>
<p>on s.student_id=i.student_id</p>
<p>if @student_id=&#x27;0000000001&#x27;</p>
<p>begin</p>
<p>raierror(&#x27;不能插入1的学号!&#x27;,16,8)</p>
<p>rollback tran</p>
<p>end</p>
<p>go</p>
<p>update触发器示例</p>
<p>create trigger tri_update</p>
<p>on student</p>
<p>for update</p>
<p>as</p>
<p>if update(student_id)</p>
<p>begin</p>
<p>raiserror(&#x27;学号不能修改!&#x27;,16,8)</p>
<p>rollback tran</p>
<p>end</p>
<p>go</p>
<p>delete触发器示例</p>
<p>create trigger tri_delete</p>
<p>on student</p>
<p>for delete</p>
<p>as</p>
<p>declare @student_id varchar(10)</p>
<p>select @student_id=student_id from deleted</p>
<p>if @student_id=&#x27;admin&#x27;</p>
<p>begin</p>
<p>raiserror(&#x27;错误&#x27;,16,8)</p>
<p>rollback tran</p>
<p>end</p>
</article>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.aitaocui.cn/article/380821.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
