标题：触发器
触发器简介
触发器可以查询其他表，而且可以包含复杂的 SQL语句。它们主要用于强制服从复杂的业务规则或要求。例如：您可以根据客户当前的帐户状态，控制是否允许插入新订单。
触发器也可用于强制引用完整性，以便在多个表中添加、更新或删除行时，保留在这些表之间所定义的关系。然而，强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图，则可以在表之间创建关系以自动创建外键约束。DML触发器当数据库中表中的数据发生变化时，包括insert,update,delete任意操作，如果我们对该表写了对应的DML触发器，那么该触发器自动执行。DML触发器的主要作用在于强制执行业 务规则，以及扩展Sql Server约束，默认值等。因为我们知道约束只能约束同一个表中的数据，而触发器中则可以执行任意Sql命令。DDL触发器它是Sql Server2005新增的触发器，主要用于审核与规范对数据库中表，触发器，视图等结构上的操作。比如在修改表，修改列，新增表，新增列等。它在数据库结构发生变化时执行，我们主要用它来记录数据库的修改过程，以及限制程序员对数据库的修改，比如不允许删除某些指定表等。
创建SQL语法
DELIMITER |
CREATE TRIGGER `<databaseName>`.`<triggerName>`
< [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] > 
ON [dbo]<tableName> //dbo代表该表的所有者 
FOR EACH ROW
BEGIN 
--do something
END |
触发器的优点
[1]　触发器可通过数据库中的相关表实现级联更改，不过，通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制比用CHECK约束定义的约束更为复杂的约束。与 CHECK 约束不同，触发器可以引用其它表中的列。例如，触发器可以使用另一个表中的 SELECT 比较插入或更新的数据，以及执行其它操作，如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态，并根据其差异采取对策。一个表中的多个同类触发器（INSERT、UPDATE 或 DELETE）允许采取多个不同的对策以响应同一个修改语句。
比较触发器和约束
约束和触发器在特殊情况下各有优势。触发器的主要好处在于它们可以包含使用 Transact-SQL 代码的复杂处理逻辑。因此，触发器可以支持约束的所有功能；但它在所给出的功能上并不总是最好的方法。实体完整性总应在最低级别上通过索引进行强制，这些索引或是 PRIMARY KEY 和 UNIQUE 约束的一部分，或是在约束之外独立创建的。假设功能可以满足应用程序的功能需求，域完整性应通过 CHECK 约束进行强制，而引用完整性(RI) 则应通过 FOREIGN KEY 约束进行强制。在约束所支持的功能无法满足应用程序的功能要求时，触发器就极为有用。
例如：除非 REFERENCES 子句定义了级联引用操作，否则 FOREIGN KEY 约束只能以与另一列中的值完全匹配的值来验证列值。
CHECK 约束只能根据逻辑表达式或同一表中的另一列来验证列值。如果应用程序要求根据另一个表中的列验证列值，则必须使用触发器。约束只能通过标准的系统错误信息传递错误信息。如果应用程序要求使用（或能从中获益）自定义信息和较为复杂的错误处理，则必须使用触发器。
触发器可通过数据库中的相关表实现级联更改；不过，通过级联引用完整性约束可以更有效地执行这些更改。触发器可以禁止或回滚违反引用完整性的更改，从而取消所尝试的数据修改。当更改外键且新值与主键不匹配时，此类触发器就可能发生作用。例如，可以在 titleauthor.title_id 上创建一个插入触发器，使它在新值与 titles.title_id 中的某个值不匹配时回滚一个插入。不过，通常使用 FOREIGN KEY 来达到这个目的。
如果触发器表上存在约束，则在 INSTEAD OF 触发器执行后但在 AFTER 触发器执行前检查这些约束。如果约束破坏，则回滚 INSTEAD OF 触发器操作并且不执行 AFTER 触发器。
触发器到底可不可以在视图上创建 在 SQL Server™ 联机丛书中，是没有说触发器不能在视图上创建的， 并且在语法解释中表明：在 CREATE TRIGGER 的 ON 之后可以是视图。 然而，事实似乎并不是如此，很多专家也说触发器不能在视图上创建。我也专门作了测试，的确如此，不管是普通视图还是索引视图，都无法在上面创建触发器，真的是这样吗？
请点击详细，但是无可厚非的是：当在临时表或系统表上创建触发器时会遭到拒绝。
深刻理解 FOR CREATE TRIGGER 语句的 FOR 关键字之后可以跟 INSERT、UPDATE、DELETE 中的一个或多个，也就是说在其它情况下是不会触发触发器的， 包括 SELECT、TRUNCATE、WRITETEXT、UPDATETEXT。 
相关内容 一个有趣的应用我们看到许多注册系统在注册后都不能更改用户名，但这多半是由应用程序决定的， 如果直接打开数据库表进行更改，同样可以更改其用户名, 在触发器中利用回滚就可以巧妙地实现无法更改用户名……详细内容 触发器内部语句出错时…… 这种情况下，前面对数据更改操作将会无效。举个例子，在表中插入数据时触发触发器，而触发器内部此时发生了运行时错误，那么将返回一个错误值，并且拒绝刚才的数据插入。不能在触发器中使用的语句 触发器中可以使用大多数 T-SQL 语句，但如下一些语句是不能在触发器中使用的。
CREATE 语句，如：CREATE DATABASE、CREATE TABLE、CREATE INDEX 等。
ALTER 语句，如：ALTER DATABASE、ALTER TABLE、ALTER INDEX 等。
DROP 语句，如：DROP DATABASE、DROP TABLE、DROP INDEX 等。
DISK 语句，如：DISK INIT、DISK RESIZE。
LOAD 语句，如：LOAD DATABASE、LOAD LOG。
RESTORE 语句，如：RESTORE DATABASE、RESTORE LOG。
RECONFIGURE
TRUNCATE TABLE 语句在sybase的触发器中不可使用！
慎用触发器
触发器功能强大，轻松可靠地实现许多复杂的功能，为什么又要慎用呢。触发器本身没有过错，但由于我们的滥用会造成数据库及应用程序的维护困难。在数据库操作中，我们可以通过关系、触发器、存储过程、应用程序等来实现数据操作…… 同时规则、约束、缺省值也是保证数据完整性的重要保障。如果我们对触发器过分的依赖，势必影响数据库的结构，同时增加了维护的复杂程度。
Sqlserver示例
insert 触发器示例create trigger tri_insert
on student
for insert 
as 
declare @student_id char(10)
select @student_id=s.student_id from 
student s inner join inserted i
on s.student_id=i.student_id
if @student_id='0000000001' 
begin 
raiserror('不能插入1的学号!',16,8)
rollback tran 
end 
go 
update触发器示例create trigger tri_update
on student
for update 
as 
if update(student_id)
begin 
raiserror('学号不能修改!',16,8)
rollback tran 
end 
godelete触发器示例create trigger tri_delete
on student
for delete 
as 
declare @student_id varchar(10)
select @student_id=student_id from deleted
if @student_id='admin' 
begin 
raiserror('错误',16,8)
rollback tran 
end
触发器(12张)

电路结构
逻辑功能，是指触发器的次态和现态及输入信号之间在稳态下的逻辑关系。这种逻辑关系可以用特性表、特性方程或状态转换图给出。
根据逻辑功能的不同特点，把触发器分为RS、JK、T、D等几种类型。
逻辑功能
电路结构，是指电路中门电路的种类及组合方式。
基本RS触发器、同步RS触发器、主从触发器、边缘触发器等是指电路结构的不同形式。由于电路结构形式的不同，带来了各不相同的动作特点。
同一种逻辑功能的触发器可以用不同的电路结构实现。反过来说，用同一种电路结构形式可以作成不同逻辑功能的触发器。
类型种类
按逻辑功能不同分为：RS触发器、D触发器、JK触发器、T触发器。
按触发方式不同分为：电平触发器、边沿触发器和主从触发器。
按电路结构不同分为：基本RS触发器和钟控触发器。
按存储数据原理不同分为：静态触发器和动态触发器。
按构成触发器的基本器件不同分为：双极型触发器和MOS型触发器。
照明配件
用于高强度气体放电灯(H.I.D)的启动,型号繁多.由于高强度气体放电灯启动时需要一个高电压来使气体电离进入等离子态，因而需要一个高压发生器做为启动器，这就是触发器。早期的机械型触发器已经淘汰。现在绝大多数触发器都是使用可控硅或高压触发二极管的电子触发器，常用的型号有：OSRAM 的 CD-7 飞利浦的 SI51 SN58 爱伦的ALK400等
双稳态形
基本电路如图1的上半部。它由两个反相器直接耦合而成。反相器1由晶体管T1和电阻Rc1R11及R12组成,反相器2由晶体管T2和电阻Rc2、R21及R22组成。反相器1的输出端Q即是反相器2的输入端，同样，反相器2的输出端悩也是反相器1的输入端,两级反相器是互相反馈的。这个电路具有两种稳定状态:  图1一种稳态是T1管导通、T2管截止，Q端为低电位、悩为高电位;另一种稳态是T1管截止、T2管导通，Q端为高电位、悩端为低电位。加上电压 Ec和-Eb后电路即进入一种稳定状态。若不加触发信号，电路则永远处于这个稳定状态。 
欲使电路从一种稳态转换到另一种稳态，必须外加触发信号。图1的下半部分是两个引导触发信号给各个反相器的电路。它们分别由微分电路R1C1、R2C2和隔离二极管D1、D2组成。 
当外加负触发脉冲作用于引导电路的“S”端时,通过微分电路R1C1使D1导通,b1点呈低电位。此时不论触发器原处何种状态T1管截止，Q点变为高电位,T2管导通，悩点变为低电位。这种稳态称为触发器的“置位”状态，“S”端称为“置位”端。反之,外加负触发脉冲作用于“R”端时,则使悩端为高电位,Q端为低电位。这种稳态为触发器的“复位”状态,“R”端称为“复位”端。具有置位、复位功能的触发器称为R-S触发器。 
双稳态触发器可用来构成各种计数器、分频器和寄存器等。
射极耦合
又称施密特触发器，其原理电路如图2。它也由两级反相器直接耦合而成。第一级反相器的输出端c1是第二级反相器的输入端。第一级反相器的输入端接输入触发电压ui，第二级反相器的输出端提供输出电压u0。两级反相器通过公共的发射极电阻Re耦合在一起，因而称射极耦合触发器。这种触发器也有两种稳定状态,一种稳态是T1管导通、T2管  图2截止,输出u0为高电位；另一种稳态是T1管截止,T2管导通,u0为低电位。触发器的稳定状态决定于输入u电位的高低，因此这种触发器具有电位触发特性。当输入ui为低电位时,T1管截止,c1点电位升高，使T2管导通,输出u0也是低电位。当ui为高电位时，T1管导通,c1点电位下降，使T2管截止,u也是高电位。射极耦合触发器可用于波形的整形和鉴幅。 
单稳态触发器
单稳态触发器也由两个反相器构成(图3a)。与图1 的双稳态触发器相比，由晶体管T2组成的反相器2完全相同,但由晶体管T1组成的反相器1中,用电容器C代替电阻器R11，且R12接向 Ec。另外，在T1管的b1点接有由D1、R1及C1组成的引导电路, ui即外加触发信号。触发器的状态电压由c1及c2点输出。 
图3b的波形表明单稳态触发器的工作过程。在外加负触发脉冲u到来以前（0～t1期间）,触发器处于稳定状态。由于b1点通过R12接向电压 Ec，T1导通,T2截止。c1点的电压uc1为低电位,c2点电压u为高电位,电容器C被充电。在t=t1瞬间,u到来,通过微分电路R1C1使D1导通,b1呈低电位，T1由导通变为截止,uc1上升为高电位；T2导通，uc2  图3下降为低电位。这时,电容器C通过T2放电形成暂时稳定状态(t1～t2期间)，称为暂稳态。随着电容器C的放电，b1点电位上升，当t=t2时，b1点的电位又使T1管导通,uc1下降为低电位，T2管又截止,uc2电位上升。在t2～t3期间，uc2因受Rc2C充电的影响而上升缓慢，形成恢复期。t3以后进入原来的稳定状态。单稳态触发器可用于脉冲整形和脉冲延时。 
各种触发器均可由分立元件构成，也可由集成电路来实现。但随着集成电路技术的发展，集成触发器品种逐渐增加，性能优良，应用日益广泛。基本触发电路有R-S触发器，T触发器，D触发器，J-K触发器等。