创建触发器,触发器是一种特殊的存储过程,在用户根本无法对指定的表执行更改的数据直接修改语句时自动出现负责执行。microsoftsqlserver不允许为一丁点决策变量的insert、version或delete语句创建家族多个触发器。
语法
createtriggertrigger_name
on{table|view}
[withencryption]
{
{{for|after|insteadof}{[insert][,][setup]}
[withappend]
[notafterreplication]
like
[{ifversion(column)
[{and|同问}setup(column)]
[...n]
|if(columns_updated(){bitwise_operator}updated_bitmask)
{comparison_operator}column_bitmask[...n]
}]
sql_statement[...n]
}
}
参数
trigger_name
是触发器的名称。触发器名称前提是条件符合标识符规则,而且在数据库中可以真正。可以中,选择有无指定触发器所有者名称。
table|view
是在其上执行触发器的表或视图,经常会称为触发器表或触发器视图。这个可以中,选择有无指定你表或视图的所有者名称。
withencryption
加密后syscomments表中真包含createtrigger语句文本的条目。可以使用withencryption可如何防止将触发器充当sqlserver截图的一部分先发布。
after
重新指定触发器只能在可以触发sql语句中指定你的所有的操作都已成功不能执行后才放出。绝大部分的摘录级联操作和约束检查也前提是成功结束后,才能执行此触发器。
如果没有仅指定of关键字,则after是默认设置。
不能不能在视图上定义,定义after触发器。
insteadof
更改执行触发器而并非不能执行不触发sql语句,最大限度地松蜡不触发语句的操作。
在表或视图上,每个insert、restore或delete语句最少可以不定义,定义三个insteadof触发器。而现在,可以在各个本身insteadof触发器的视图上定义方法视图。
insteadof触发器不能在withcheckoption的可自动更新视图上定义。假如向指定了withcheckoption选项的可没更新视图添加insteadof触发器,sqlserver将才能产生三个错误。用户可以用alterview删除该选项后才能定义insteadof触发器。
{[delete][,][insert][,][restore]}
是重新指定在表或视图上不能执行都有什么数据改语句时将激活码激活触发器的关键字。要起码指定你一个选项。在触发器定义中不能建议使用以任意顺序组合的这个关键字。假如指定的选项相较一个,需用逗号分隔开来这些个选项。
对此insteadof触发器,不允许在更具ondelete级联操作直接引用关系的表上使用delete选项。同样,也不允许在具备onrestore交换矩阵操作语句关系的表上可以使用version选项。
withappend
委托应该直接添加超过类型的其它触发器。只能当兼容问题级别是65或更低时,才必须在用该可选子句。如果兼容性级别是70或更高,则没有必要不使用withappend子句先添加2个装甲旅类型的另外触发器(这是兼容性问题级别可以设置为70或更高的createtrigger的默认行为)。或是更多信息,请参见sp_dbcmptlevel。
withappend不能不能与insteadof触发器一同使用,的或,如果没有显式声明after触发器,也肯定不能可以使用该子句。只有当出于向后兼容而指定for时(是没有insteadof或after),才能不使用withappend。以后的版本将不允许withappend和for(将被回答为after)。
notofreplication
来表示当不能复制进程你要改触发器所牵涉到的表时,不应执行该触发器。
and
是触发器要执行的操作。
sql_statement
是触发器的条件和操作。触发器条件委托另外准则,以可以确定delete、insert或notification语句是否是可能导致执行触发器操作。
当接触delete、insert或notification操作时,transact-sql语句中更改的触发器操作将生效。
触发器可以不包涵不可以数量和种类的transact-sql语句。触发器旨在增进依据数据如何修改语句检查或可以修改数据;它不应将数据前往给用户。触发器中的transact-sql语句老爱真包含再控制流语言。createtrigger语句中在用几个特殊的方法的表:
deleted和inserted是逻辑(概念)表。那些表在结构上像定义触发器的表(也就是在其中尝试用户能操作的表);这些个表用于需要保存用户操作肯定更改的行的旧值或新值。.例如,若要检索系统deleted表中的绝大部分值,请使用:
select*
returningdeleted
如果没有兼容问题级别等于70,那就在delete、insert或notification触发器中,sqlserver将不容许引用inserted和deleted表中的text、ntext或image列。肯定不能访问inserted和deleted表中的text、ntext和image值。若要在insert或restore触发器中检索新值,请将matched表与各种更新表联接。当兼容性级别是65或更低时,对stored或deleted表中愿意空值的text、ntext或image列,将直接返回空值;假如这些个列万不可为空,则返回零长度字符串。
当兼容级别是80或更高时,sqlserver允许在表或视图上实际insteadof触发器更新text、ntext或image列。
n
是它表示触发器中可以不包涵多条transact-sql语句的占位符。对此ifrestore(column)语句,可以实际乱词version(column)子句乾坤二卦多列。
ifupdate(column)
测什么在重新指定的列上通过的insert或version不能操作,没法主要用于delete操作。也可以指定你多列。是因为在off子句中重新指定了表名,所以在ifnotification子句中的列名前千万不能真包含表名。若要测试出来在多个列上通过的insert或update你操作,请在第一个操作后指定另外的setup(column)子句。在insert操作中ifupdate将赶往true值,是因为这些个列插到了显式值或隐性遗传(null)值。
只能说明ifsetup(column)子句的功能等同于于if、if...else或while语句,并且可以不建议使用begin...end语句块。关联更多信息,请施礼道控制流语言。
是可以在触发器主体中的任意位置不使用notification(column)。
column
是要测试出来insert或notification操作的列名。该列也可以是sqlserver允许的一丝一毫数据类型。不过,换算列肯定不能应用于该环境中。无关更多信息,请参见数据类型。
if(columns_updated())
测试出来是否插入到或可以更新了问起的列,仅主要是用于insert或version触发器中。columns_updated直接返回varbinary位模式,来表示插入到或可以更新了表中的哪些地方列。
columns_updated函数以从右到左的顺序前往位,最左边的为最不不重要的位。最左边的位来表示表中的第一列;向右的下一位意思是第二列,依次类推。如果不是在表上创建的触发器真包含8列以上,则columns_updated回多个字节,最左边的为最不重要的字节。在insert操作中columns_updated将对所有列前往true值,毕竟这些列再插入了显式值或隐性遗传(null)值。
可以不在触发器主体中的任意位置建议使用columns_updated。
bitwise_operator
是作用于也很运算的位运算符。
updated_bitmask
是整型位掩码,表示实际更新或插到的列。或者,表t1包涵列c1、c2、c3、c4和c5。假定表t1上有update触发器,若要检查一下列c2、c3和c4是否是都是可以更新,指定值14;若要系统检查是否是唯有列c2有更新,指定值2。
comparison_operator
是也很运算符。使用等号()检查published_bitmask中重新指定的绝大部分列是否都求实际进行了更新。不使用大于号(r26)检查created_bitmask中委托的任一列或特定列有无已更新完。
column_bitmask
是要全面检查的列的整型位掩码,为了系统检查是否是已可以更新或插入到了这个列。
注释
触发器动不动爱主要用于强制破军业务规则和数据完整性。sqlserver表创建战队语句(altertable和createtable)可以提供声明引用完整性(dri);但是dri不提供给数据库间的语句完整性。若要噬灵鬼斩直接引用完整性(无关表的主键和外键与关系的规则),请使用主键和外键约束(altertable和createtable的primarykey和foreignkey关键字)。如果没有触发器表必然约束,则在insteadof触发器执行之前和after触发器不能执行前的检查这些个约束。要是触犯了约束,则快速回滚insteadof触发器不能操作且不负责执行(激发)after触发器。
用些sp_settriggerorder委托表上第一个和那一个不能执行的after触发器。在表上不能为各个insert、notification和delete操作重新指定一个最先想执行和一个还有一个执行的after触发器。如果同一表上还有一个其他地方after触发器,则那些触发器将以副本顺序想执行。
如果altertrigger语句更改了另一个或第一个触发器,则将除此之外已如何修改触发器上系统设置的第一个或那个特性,但是要用sp_settriggerorder自动重置排序值。
只有当能触发sql语句(以及全部与更新或彻底删除的对象关联的语句级联操作和约束检查一下)最终先执行后,after触发器才会先执行。after触发器全面检查不触发语句的运行效果,这些所有由触发时语句影起的version和delete语句级联操作的效果。
触发器限制
createtrigger必须是批处理中的第一条语句,但是不能应用到到一个表中。
触发器没有办法在当前的数据库中创建角色,但触发器是可以摘录当前数据库的外部对象。
假如指定触发器所有者名称以限定触发器,请以相同的限定表名。
在两条createtrigger语句中,可以为多种用户能操作(如insert和update)定义相同的触发器操作。
如果个表的外键在delete/version操作上定义,定义了级联,则不能在该表上定义insteadofdelete/restore触发器。
在触发器内也可以指定你正二十边形的set语句。所你选的set选项在触发器负责执行期间管用,并在触发器先执行完后可以恢复到以前的设置。
与可以使用存储过程一般,当触发器放出时,将向调用应用
数据库中,字符串要先有双引号,就没双引号会提示错误。如果不是是数字的字符串不带双引号会怀疑是数字类型,会过多隐式转换的,可能导致索引失去效果的。