SQL触发器语法参考
- 格式:doc
- 大小:234.00 KB
- 文档页数:15
SQLServer 触发器使用实例触发器是一个特殊的存储过程。
常见的有三种:分别使用于Insert , Update , Delete 事件。
一、Trigger语法:create trigger tr_nameon table/view{for | after | instead of } [update][,][insert][,][delete][with encryption]as {batch | if update (col_name) [{and|or} update (col_name)] }说明:1 tr_name :名称2 on table/view :触发器所作用的表。
一个触发器只能作用于一个表3 for 和after :同义4 after 和instead of :sql 2000新增项目afrer 和instead of 的区别After在触发事件发生以后才被激活,只可以建立在表上Instead of代替了相应的触发事件而被执行,既可以建立在表上也可以建立在视图上5 insert、update、delete:激活触发器的三种操作,可以同时执行,也可选其一6 if update (col_name):表明所作的操作对指定列是否有影响,有影响,则激活触发器。
此外,因为delete 操作只对行有影响,所以如果使用delete操作就不能用这条语句了(虽然使用也不出错,但是不能激活触发器,没意义)。
7 触发器执行时用到的两个特殊表:deleted ,inserteddeleted 和inserted 可以说是一种特殊的临时表,是在进行激活触发器时由系统自动生成的,其结构和触发器作用的表结构是一样的,只是存放的数据有差异。
二、实例:实例1(注意这里的关联,条件是如何关联,update中set的值是和谁关联。
这些都可以从【触发器的两个临时表:inserted、deleted】中得到答案)比如,这么两个表:Create Table Student( --学生表StudentID int primary key, --学号StudentName varchar(50),姓名)Create Table BorrowRecord( --学生借书记录表BorrowRecord int identity(1,1), --流水号StudentID int , --学号BorrowDate datetime, --借出时间ReturnDAte Datetime, --归还时间...)用到的功能有:1.如果我更改了学生的学号,我希望他的借书记录仍然和这个学生相关(也就是同时更改借书记录表的学号);2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。
sql 触发器语法一、什么是 SQL 触发器?SQL 触发器是一种特殊的存储过程,它在特定的数据库操作(如INSERT、UPDATE 或DELETE)执行时自动触发。
当满足特定条件时,触发器可以在表上执行操作或调用其他存储过程。
二、SQL 触发器的语法SQL 触发器的语法如下:CREATE TRIGGER trigger_name{BEFORE | AFTER} {INSERT | UPDATE | DELETE}ON table_name [FOR EACH ROW]BEGIN-- 触发器执行的 SQL 语句END;其中:- trigger_name:触发器名称,用户自定义。
- BEFORE/AFTER:指定触发时间,即在数据库操作之前或之后执行。
- INSERT/UPDATE/DELETE:指定触发事件,即在进行插入、更新或删除操作时执行。
- table_name:指定要监视的表名。
- FOR EACH ROW:可选参数,表示为每一行数据都会执行此触发器。
- BEGIN 和 END:包含了要执行的 SQL 语句。
三、SQL 触发器示例1. 创建一个在插入数据时自动更新修改日期的触发器:CREATE TRIGGER update_dateBEFORE INSERT ON usersFOR EACH ROWBEGINSET NEW.modify_date = NOW();END;2. 创建一个在删除订单时自动将订单中商品数量归零的触发器:CREATE TRIGGER reset_quantityAFTER DELETE ON ordersFOR EACH ROWBEGINUPDATE products SET quantity = 0 WHERE product_id = OLD.product_id;END;3. 创建一个在更新用户信息时自动记录修改日志的触发器:CREATE TRIGGER log_changesAFTER UPDATE ON usersFOR EACH ROWBEGININSERT INTO user_logs (user_id, change_date, change_type) VALUES (er_id, NOW(), 'update');END;四、SQL 触发器的注意事项1. 触发器应该尽可能简单,避免使用复杂的逻辑。
SQL SERVER中各类触发器的完整语法及参数说明这篇文章主要介绍了SQL SERVER中各类触发器的完整语法及参数,需要的朋友可以收藏下语法:Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)CREATE TRIGGER [ schema_name . ]trigger_nameON { table | view }[ WITH <dml_trigger_option> [ ,...n ] ]{ FOR | AFTER | INSTEAD OF }{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }[ WITH APPEND ][ NOT FOR REPLICATION ]AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > }<dml_trigger_option> ::=[ ENCRYPTION ][EXECUTE AS Clause ]<method_specifier> ::=assembly_name.class_name.method_nameTrigger on a CREATE, ALTER, DROP, GRANT, DENY, REVOKE, or UPDATE STATISTICS statement (DDL Trigger)CREATE TRIGGER trigger_nameON { ALL SERVER | DATABASE }[ WITH <ddl_trigger_option> [ ,...n ] ]{ FOR | AFTER } { event_type | event_group } [ ,...n ]AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier > [ ; ] }<ddl_trigger_option> ::=[ ENCRYPTION ][ EXECUTE AS Clause ]<method_specifier> ::=assembly_name.class_name.method_nameTrigger on a LOGON event (Logon Trigger)CREATE TRIGGER trigger_nameON ALL SERVER[ WITH <logon_trigger_option> [ ,...n ] ]{ FOR| AFTER } LOGONAS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier > [ ; ] }<logon_trigger_option> ::=[ ENCRYPTION ][ EXECUTE AS Clause ]<method_specifier> ::=assembly_name.class_name.method_name参数:schema_nameDML 触发器所属架构的名称。
sql查询触发器语句SQL触发器是一种特殊的数据库对象,它可以在特定的数据库操作(例如插入、更新、删除)发生时自动执行一些预定义的动作。
触发器可以用于实现复杂的业务逻辑和数据完整性约束。
下面列举了10个常见的SQL触发器语句:1. 在员工表上创建触发器,当有新员工加入时,自动在工资表中插入一条新记录:```sqlCREATE TRIGGER insert_employeeAFTER INSERT ON employeesFOR EACH ROWBEGININSERT INTO salaries (employee_id, salary) VALUES (NEW.employee_id, 0);END;```2. 在订单表上创建触发器,当订单状态更新为已发货时,自动更新库存表中对应商品的数量:```sqlCREATE TRIGGER update_inventoryAFTER UPDATE ON ordersFOR EACH ROWBEGINIF NEW.status = '已发货' THENUPDATE inventory SET quantity = quantity - NEW.quantity WHERE product_id = NEW.product_id;END IF;END;```3. 在学生表上创建触发器,当有新学生加入时,自动更新班级表中的学生人数:```sqlCREATE TRIGGER update_class_sizeAFTER INSERT ON studentsFOR EACH ROWBEGINUPDATE classes SET size = size + 1 WHERE class_id = NEW.class_id;END;```4. 在商品表上创建触发器,当商品数量低于阈值时,自动发送库存警报邮件:```sqlCREATE TRIGGER send_inventory_alertAFTER UPDATE ON productsFOR EACH ROWBEGINIF NEW.quantity < 10 THEN-- 发送邮件的逻辑END IF;END;```5. 在订单表上创建触发器,当订单被删除时,自动将对应的商品数量加回库存:```sqlCREATE TRIGGER restore_inventoryAFTER DELETE ON ordersFOR EACH ROWBEGINUPDATE inventory SET quantity = quantity + OLD.quantity WHERE product_id = OLD.product_id;END;```6. 在员工表上创建触发器,当员工的工资被更新时,自动记录工资变动历史:```sqlCREATE TRIGGER log_salary_changeAFTER UPDATE ON employeesFOR EACH ROWBEGININSERT INTO salary_history (employee_id, old_salary, new_salary, change_date) VALUES (NEW.employee_id, OLD.salary, NEW.salary, NOW());END;```7. 在订单表上创建触发器,当有新订单完成支付时,自动更新销售统计表中的数据:```sqlCREATE TRIGGER update_sales_statsAFTER INSERT ON ordersFOR EACH ROWBEGINIF NEW.status = '已支付' THENUPDATE sales_stats SET total_sales = total_sales +NEW.total_amount, order_count = order_count + 1;END IF;END;```8. 在学生表上创建触发器,当学生的成绩被更新时,自动计算并更新班级的平均成绩:```sqlCREATE TRIGGER update_class_avg_scoreAFTER UPDATE ON studentsFOR EACH ROWBEGINUPDATE classes SET avg_score = (SELECT AVG(score) FROM students WHERE class_id = NEW.class_id) WHERE class_id = NEW.class_id;END;```9. 在商品表上创建触发器,当商品被删除时,自动更新订单表中的商品信息:```sqlCREATE TRIGGER update_order_productAFTER DELETE ON productsFOR EACH ROWBEGINUPDATE orders SET product_id = NULL WHERE product_id = OLD.product_id;END;```10. 在员工表上创建触发器,当员工的状态从在职变为离职时,自动将该员工从项目表中移除:```sqlCREATE TRIGGER remove_employee_from_projectAFTER UPDATE ON employeesFOR EACH ROWBEGINIF NEW.status = '离职' THENDELETE FROM projects WHERE employee_id = NEW.employee_id;END IF;END;```以上是10个常见的SQL触发器语句的示例,它们展示了触发器的灵活应用,可以帮助我们实现复杂的业务逻辑和数据完整性约束。
sql 触发器的语法SQL触发器是用于在数据库中自动执行某些操作的一种机制。
它们可以在特定的数据库事件发生时触发,并执行预定义的操作。
SQL 触发器可以用于实现数据的验证、约束、日志记录等功能,从而提高数据库的安全性和可靠性。
SQL触发器的语法如下:```CREATE TRIGGER trigger_name{BEFORE | AFTER} {INSERT | UPDATE | DELETE}ON table_name[FOR EACH ROW]trigger_body```其中,trigger_name是触发器的名称,可以根据实际需求自行命名。
BEFORE和AFTER关键字指定了触发器在事件发生前还是事件发生后执行。
INSERT、UPDATE和DELETE关键字指定了触发器在插入、更新或删除数据时触发。
table_name是触发器所在的表名。
触发器可以在每一行数据上触发,也可以在整个表上触发。
通过FOR EACH ROW关键字来指定触发器的触发范围。
如果不指定FOR EACH ROW,则触发器将在整个表上触发。
trigger_body是触发器的主体部分,可以包含一系列的SQL语句。
触发器的主体部分可以包含SELECT、INSERT、UPDATE和DELETE等SQL语句,用于实现具体的操作。
例如,可以在触发器中插入一条记录到另一个表中,或者更新另一个表的数据。
下面是一个示例,演示了如何创建一个在用户表中插入数据时触发的触发器:```CREATE TRIGGER insert_user_triggerAFTER INSERTON userFOR EACH ROWBEGININSERT INTO log(user_id, action) VALUES(er_id, 'insert');END;```上述示例中,创建了一个名为insert_user_trigger的触发器,在每次向user表中插入数据时触发。
SQL触发器语法参考CreateTRIGGER trigger_nameON{table|view}[WITH ENCRYPTION]{{{FOR|AFTER|INSTEAD OF}{[Insert][,][Updat e]}[WITH APPEND][NOT FOR REPLICATION]AS[{IF Update(column)[{AND|or}Update(column)][...n]|IF(COLUMNS_UpdateD(){bitwise_operator}updated _bitmask){comparison_operator}column_bitmask[...n] }]sql_statement[...n]}}参数trigger_name是触发器的名称。
触发器名称必须符合标识符规则,并且在数据库中必须唯一。
可以选择是否指定触发器所有者名称。
Table|view是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。
可以选择是否指定表或视图的所有者名称。
WITH ENCRYPTION加密syscomments表中包含Create TRIGGER语句文本的条目。
使用WITH ENCRYPTION可防止将触发器作为SQL Server复制的一部分发布。
AFTER指定触发器只有在触发SQL语句中指定的所有操作都已成功执行后才激发。
所有的引用级联操作和约束检查也必须成功完成后,才能执如果仅指定FOR关键字,则AFTER是默认设置。
不能在视图上定义AFTER触发器。
INSTEAD OF指定执行触发器而不是执行触发SQL语句,从而替代触发语句的操作。
在表或视图上,每个Insert、Update或Delete语句最多可以定义一个INSTEAD OF触发器。
然而,可以在每个具有INSTEAD OF触发器的视图上定义视图。
INSTEAD OF触发器不能在WITH CHECK OPTION的可更新视图上定义。
SQLite 触发器的SQL语法CREATE TRIGGERsql-statement::=CREATE [TEMP | TEMPORARY] TRIGGER trigger-name[ BEFORE | AFTER ]database-event ON [database-name.]table-nametrigger-actionsql-statement::=CREATE [TEMP | TEMPORARY] TRIGGER trigger-nameINSTEAD OFdatabase-event ON [database-name.]view-nametrigger-actiondatabase-event::=DELETE |INSERT |UPDATE |UPDATE OF column-listtrigger-action::=[ FOR EACH ROW | FOR EACH STATEMENT ][ WHENexpression]BEGINtrigger-step ; [trigger-step ; ]*ENDtrigger-step::=update-statement|insert-statement|delete-statement|select-statementCREATE TRIGGER语句用于向数据库schema中添加触发器。
触发器是一些在特定的数据库事件(database-event) 发生时自动进行的数据库操作(trigger-action).触发器可由在特殊表上执行的DELETE, INSERT, UPDATE等语句触发,或UPDATE 表中特定的字段时触发。
现在SQLite仅支持FOR EACH ROW触发器,不支持FOR EACH STATEMENT触发。
因此可以不用明确说明FOR EACH ROW .FOR EACH ROW的意思是由trigger-steps 说明的SQL语句可能在(由WHEN子句决定的)数据库插入, 更改或删除的每一行触发trigger.WHEN子句和trigger-steps可以使用"NEW.column-name"和"OLD.column-name" 的引用形式访问正在被插入,更改或 删除的行的元素,column-name是触发器关联的表中的字段名。
sql触发器的使用及语法
数据库触发器(Database Trigger)是指在特定条件出发时,自
动执行由用户定义的sql语句或存储过程的数据库功能。
它和视图、
存储过程、函数、索引一样,都是数据库对象,也是定制数据库应用
系统优化的重要工具。
触发器是在特定事件(通常是在表上发生操作的时候)发生时,
自动触发执行的一系列sqldml语句,可以在预定的约束条件下实现完
整的逻辑校验功能,从而保证数据的有效性。
一个触发器的语法格式:`CREATE TRIGGER trigger_name` `ON table_name` `[AFTER|BEFORE]` `[INSERT|UPDATE|DELETE]` `AS`
`[FOR EACH ROW]` `BEGIN -- trigger body END`
它的各个部分的含义依次为:
创建触发器:`CREATE TRIGGER` 是触发器首部,用于声明开始
和结束触发器定义,并定义触发器的名称;
触发表:`ON table_name` 是触发器触发条件,即表上发生变动
时触发器才会被触发;
触发事件:`[AFTER|BEFORE] [INSERT|UPDATE|DELETE]` 是定义
触发器触发时间及操作,也就是定义在什么时候要触发(`AFTER` 或
`BEFORE`),用什么操作触发(`INSERT`、`UPDATE` 或 `DELETE`);
`AS`:用来标识触发器的有效范围,`FOR EACH ROW` 是指每笔
资料发生变化时都会触发;
触发体:`BEGIN -- trigger body END` 是定义具体要触发的操作。
sqlserver触发器语法SQL Server触发器是一种特殊类型的存储过程,它会在特定的数据库表上自动执行。
触发器可以在插入、更新或删除数据时触发,从而允许开发人员实现复杂的业务逻辑和数据完整性约束。
触发器的语法如下:sql.CREATE TRIGGER trigger_name.ON table_name.AFTER INSERT, UPDATE, DELETE.AS.BEGIN.-触发器逻辑。
END;其中,`trigger_name` 是触发器的名称,`table_name` 是触发器所绑定的表名。
`AFTER INSERT, UPDATE, DELETE` 指定了触发器在哪些操作之后执行。
`BEGIN` 和 `END` 之间是触发器的逻辑代码。
触发器可以根据需要在不同的操作后触发,例如,可以创建一个在插入数据后触发的触发器,以执行特定的业务逻辑。
触发器可以访问插入、更新或删除操作影响的数据,并根据需要对其进行修改。
在触发器的逻辑代码中,可以使用 INSERTED 和 DELETED 表来访问触发操作影响的数据。
INSERTED 表包含了插入或更新操作后的新数据,而 DELETED 表包含了更新或删除操作前的旧数据。
除了上述的基本语法,触发器还可以包括条件判断、事务处理和错误处理等逻辑。
需要注意的是,触发器的复杂性和执行频率应该被谨慎考虑,以避免对数据库性能产生负面影响。
总之,SQL Server触发器是一种强大的数据库对象,通过合理使用触发器,可以实现数据完整性约束、业务逻辑的复杂处理以及数据审计等功能。
在使用触发器时,需要充分理解其语法和行为,以确保数据库的稳定性和性能。
SQL触发器实例1. 什么是SQL触发器?在SQL中,触发器(Trigger)是一种特殊的存储过程,它会在指定的数据库操作(如插入、更新、删除)发生时自动执行。
触发器可以用于实现复杂的业务逻辑和数据完整性约束。
触发器通常与表相关联,当表上的指定操作被执行时,触发器会自动触发并执行相应的代码逻辑。
2. 触发器的语法下面是一个简单的创建触发器的语法:CREATE TRIGGER trigger_name{BEFORE | AFTER} {INSERT | UPDATE | DELETE}ON table_nameFOR EACH ROWBEGIN-- 触发器执行的代码逻辑END;其中: - trigger_name是触发器的名称,需要在数据库中唯一。
- BEFORE或AFTER指定了触发器执行的时间点,分别在操作之前或之后。
- INSERT、UPDATE或DELETE指定了要监视和响应的数据库操作类型。
- table_name是与触发器相关联的表名。
- FOR EACH ROW表示对每一行数据都会执行相应代码块。
3. 触发器示例3.1 在插入数据时更新相关表假设我们有两个表:用户表(users)和订单表(orders)。
当向订单表插入一条新记录时,我们希望自动更新用户表中的订单数量字段。
首先,我们创建一个触发器来实现这个逻辑:CREATE TRIGGER update_order_countAFTER INSERT ON ordersFOR EACH ROWBEGINUPDATE users SET order_count = order_count + 1 WHERE id = er_id; END;在上述触发器中,我们指定了在orders表上插入数据之后执行触发器逻辑。
每当插入一条新记录时,触发器会自动执行一个SQL语句来更新对应用户的订单数量。
3.2 在删除数据时进行级联操作假设我们有两个表:部门表(departments)和员工表(employees)。
SQL触发器语法参考语法CREATE TRIGGER trigger_nameON { table|view }[ WITH ENCRYPTION ]{{ { FOR| AFTER | INSTEAD OF } { [ INSERT ][ , ][ UPDATE ] }[ WITH APPEND ][ NOT FOR REPLICATION ]AS[ { IF UPDATE ( column )[ { AND | OR } UPDATE ( column ) ][ n ]|IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitma sk ){ comparison_operator } column_bitmask [ n ]} ]sql_statement [ n ]}}参数trigger_name是触发器的名称。
触发器名称必须符合标识符规则,并且在数据库中必须唯一。
可以选择是否指定触发器所有者名称。
Table | view是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。
可以选择是否指定表或视图的所有者名称。
WITH ENCRYPTION加密syscomments表中包含CREATE TRIGGER 语句文本的条目。
使用WITH ENCRYPTION 可防止将触发器作为SQL Server 复制的一部分发布。
AFTER指定触发器只有在触发SQL 语句中指定的所有操作都已成功执行后才激发。
所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。
如果仅指定FOR 关键字,则AFTER 是默认设置。
不能在视图上定义AFTER 触发器。
INSTEAD OF指定执行触发器而不是执行触发SQL 语句,从而替代触发语句的操作。
在表或视图上,每个INSERT、UPDATE 或DELETE 语句最多可以定义一个INSTEAD OF 触发器。
然而,可以在每个具有INSTEAD OF 触发器的视图上定义视图。
INSTEAD OF 触发器不能在WITH CHECK OPTION 的可更新视图上定义。
如果向指定了WITH CHECK OPTION 选项的可更新视图添加INSTEAD OF 触发器,SQL Server 将产生一个错误。
用户必须用ALTER VIEW 删除该选项后才能定义INSTEAD OF 触发器。
{ [DELETE] [,] [INSERT] [,] [UPDATE] }是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。
必须至少指定一个选项。
在触发器定义中允许使用以任意顺序组合的这些关键字。
如果指定的选项多于一个,需用逗号分隔这些选项。
对于INSTEAD OF 触发器,不允许在具有ON DELETE 级联操作引用关系的表上使用DELETE 选项。
同样,也不允许在具有ON UPDATE 级联操作引用关系的表上使用UPDATE 选项。
WITH APPEND指定应该添加现有类型的其它触发器。
只有当兼容级别是65 或更低时,才需要使用该可选子句。
如果兼容级别是70 或更高,则不必使用WITH APPEND 子句添加现有类型的其它触发器(这是兼容级别设置为70 或更高的CREATE TRIGGER 的默认行为)。
有关更多信息,请参见sp_dbcmptlevel。
WITH APPEND 不能与INSTEAD OF 触发器一起使用,或者,如果显式声明AFTER 触发器,也不能使用该子句。
只有当出于向后兼容而指定FOR 时(没有INSTEAD OF 或AFTER),才能使用WITH APPEND。
以后的版本将不支持WITH APPEND 和FOR(将被解释为AFTER)。
NOT FOR REPLICATION表示当复制进程更改触发器所涉及的表时,不应执行该触发器。
AS是触发器要执行的操作。
sql_statement是触发器的条件和操作。
触发器条件指定其它准则,以确定DELETE、INSERT 或UPDATE 语句是否导致执行触发器操作。
当尝试DELETE、INSERT 或UPDATE 操作时,Transact-SQL语句中指定的触发器操作将生效。
触发器可以包含任意数量和种类的Transact-SQL 语句。
触发器旨在根据数据修改语句检查或更改数据;它不应将数据返回给用户。
触发器中的Transact-SQL 语句常常包含控制流语言。
CREATE TRIGGER 语句中使用几个特殊的表:∙deleted和inserted是逻辑(概念)表。
这些表在结构上类似于定义触发器的表(也就是在其中尝试用户操作的表);这些表用于保存用户操作可能更改的行的旧值或新值。
例如,若要检索deleted 表中的所有值,请使用:∙SELECT *∙ FROM deleted∙如果兼容级别等于70,那么在DELETE、INSERT 或UPDATE 触发器中,SQL Server将不允许引用inserted和deleted表中的text、ntext或image列。
不能访问inserted和deleted表中的text、ntext和image值。
若要在INSERT 或UPDATE触发器中检索新值,请将inserted表与原始更新表联接。
当兼容级别是65 或更低时,对inserted或deleted表中允许空值的text、ntext或image列,将返回空值;如果这些列不可为空,则返回零长度字符串。
当兼容级别是80 或更高时,SQL Server 允许在表或视图上通过INSTEAD OF 触发器更新text、ntext或image列。
n是表示触发器中可以包含多条Transact-SQL 语句的占位符。
对于IF UPDATE (column)语句,可以通过重复UPDATE (column) 子句包含多列。
IF UPDATE (column)测试在指定的列上进行的INSERT 或UPDATE 操作,不能用于DELETE 操作。
可以指定多列。
因为在ON 子句中指定了表名,所以在IF UPDATE 子句中的列名前不要包含表名。
若要测试在多个列上进行的INSERT 或UPDATE 操作,请在第一个操作后指定单独的UPDATE(column) 子句。
在INSERT 操作中IF UPDATE 将返回TRUE 值,因为这些列插入了显式值或隐性(NULL) 值。
说明 IF UPDATE (column)子句的功能等同于IF、IF...ELSE 或WHILE 语句,并且可以使用BEGIN...END 语句块。
有关更多信息,请参见控制流语言。
可以在触发器主体中的任意位置使用UPDATE (column)。
column是要测试INSERT 或UPDATE 操作的列名。
该列可以是SQL Server 支持的任何数据类型。
但是,计算列不能用于该环境中。
有关更多信息,请参见数据类型。
IF (COLUMNS_UPDATED())测试是否插入或更新了提及的列,仅用于INSERT 或UPDATE 触发器中。
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是比较运算符。
使用等号(=) 检查updated_bitmask中指定的所有列是否都实际进行了更新。
使用大于号(>) 检查updated_bitmask 中指定的任一列或某些列是否已更新。
column_bitmask是要检查的列的整型位掩码,用来检查是否已更新或插入了这些列。
注释触发器常常用于强制业务规则和数据完整性。
SQL Server 通过表创建语句(ALTER TABLE 和CREATE TABLE)提供声明引用完整性(DRI);但是DRI 不提供数据库间的引用完整性。
若要强制引用完整性(有关表的主键和外键之间关系的规则),请使用主键和外键约束(ALTER TABLE 和CREATE TABLE 的PRIMARY KEY 和FOREIGN KEY 关键字)。
如果触发器表存在约束,则在INSTEAD OF 触发器执行之后和AFTER 触发器执行之前检查这些约束。
如果违反了约束,则回滚INSTEAD OF 触发器操作且不执行(激发)AFTER 触发器。
可用sp_settriggerorder 指定表上第一个和最后一个执行的AFTER 触发器。
在表上只能为每个INSERT、UPDATE 和DELETE 操作指定一个第一个执行和一个最后一个执行的AFTER 触发器。
如果同一表上还有其它AFTER 触发器,则这些触发器将以随机顺序执行。
如果ALTER TRIGGER 语句更改了第一个或最后一个触发器,则将除去已修改触发器上设置的第一个或最后一个特性,而且必须用sp_settriggerorder 重置排序值。
只有当触发SQL 语句(包括所有与更新或删除的对象关联的引用级联操作和约束检查)成功执行后,AFTER 触发器才会执行。
AFTER 触发器检查触发语句的运行效果,以及所有由触发语句引起的UPDATE 和DELETE 引用级联操作的效果。
触发器限制CREATE TRIGGER 必须是批处理中的第一条语句,并且只能应用到一个表中。
触发器只能在当前的数据库中创建,不过触发器可以引用当前数据库的外部对象。
如果指定触发器所有者名称以限定触发器,请以相同的方式限定表名。
在同一条CREATE TRIGGER 语句中,可以为多种用户操作(如INSERT 和UPDATE)定义相同的触发器操作。
如果一个表的外键在DELETE/UPDATE 操作上定义了级联,则不能在该表上定义INSTEAD OF DELETE/UPDATE 触发器。
在触发器内可以指定任意的SET 语句。
所选择的SET 选项在触发器执行期间有效,并在触发器执行完后恢复到以前的设置。