SQL触发器
- 格式:doc
- 大小:91.00 KB
- 文档页数:14
在SQL Server 中,触发器(Trigger)是一种特殊的存储过程,它会在特定的数据修改操作(如INSERT、UPDATE 或DELETE)发生时自动执行。
你可以使用触发器来执行各种任务,如验证数据、执行审计、确保数据完整性等。
在触发器中,你可以使用 INSERTED 和 DELETED 这两个特殊的表来访问被修改的数据。
INSERTED 表包含新插入或修改后的数据,而 DELETED 表包含被删除或修改前的数据。
以下是一个简单的例子,展示了如何在触发器中使用条件判断:
假设我们有一个名为 Employees 的表,我们想在每次插入新员工时检查其工资是否低于某个值(例如2000)。
如果是,则触发器会阻止这次插入操作。
在上述触发器中,我们使用了 INSERTED 表来访问新插入的数据,并使用 ROLLBACK TRANSACTION 来撤销这次插入操作。
我们还使用了 RAISERROR 来抛出一个错误消息,告诉用户为什么插入操作被阻止。
sql 触发器if条件写法在SQL 中,触发器(Trigger)可以在表上执行自动化的操作,当满足特定事件(如插入、更新、删除)时触发。
在触发器中使用`IF` 条件通常涉及到使用`IF...THEN...ELSE` 结构或`CASE` 表达式,具体取决于你的数据库管理系统(DBMS)的支持和语法。
以下是一个简单的示例,展示了在触发器中使用`IF` 条件的一般写法:```sql-- 创建触发器CREATE TRIGGER example_triggerAFTER INSERT ON your_tableFOR EACH ROWBEGIN-- 使用IF 条件IF NEW.column_name = 'some_value' THEN-- 在此执行某些操作-- ...ELSE-- 在条件不满足时执行其他操作-- ...END IF;-- 或者使用CASE 表达式CASEWHEN NEW.column_name = 'some_value' THEN-- 在此执行某些操作-- ...ELSE-- 在条件不满足时执行其他操作-- ...END CASE;END;```在这个示例中:- `NEW.column_name` 表示插入操作中新插入的行的某个列的值。
- `AFTER INSERT ON your_table` 意味着触发器将在插入`your_table` 表中的数据后执行。
请注意,上述示例中的`IF` 条件和`CASE` 表达式中的条件和操作应根据实际需求进行修改。
具体的语法和功能可能会因使用的数据库管理系统而异,例如,MySQL、SQL Server、Oracle 等数据库系统可能具有不同的语法和支持程度。
SQL触发器语句的使用流程1. 触发器简介触发器是SQL中一种特殊的过程,它会在SQL语句执行之前或之后自动被触发执行。
通过触发器,我们可以在数据库中插入、更新或删除记录时执行一系列的操作。
本文将介绍SQL触发器语句的使用流程。
2. 创建触发器在SQL中,创建触发器需要使用CREATE TRIGGER语句。
下面是创建触发器的语法:CREATE TRIGGER trigger_nameAFTER/BEFORE INSERT/UPDATE/DELETE ON table_nameFOR EACH ROWBEGIN-- 触发器的操作语句END;•trigger_name为触发器的名称,可以根据具体需求自行命名。
•AFTER/BEFORE指定触发器是在SQL语句执行之前还是之后触发执行。
•INSERT/UPDATE/DELETE指定触发器是在插入、更新或删除记录时触发执行。
•table_name为触发器所属的表名。
•FOR EACH ROW表示触发器是逐行触发执行的。
3. 触发器的操作语句在触发器的BEGIN和END之间可以编写一系列的操作语句。
这些操作语句可以是SQL语句、条件语句、循环语句等。
下面是一个示例,创建一个触发器在插入记录时更新另一个表中的记录:CREATE TRIGGER update_another_tableAFTER INSERT ON table1FOR EACH ROWBEGINUPDATE table2 SET column1 =NEW.column1 WHERE id=NEW.id;END;在上述示例中,每当向table1表中插入一条记录时,触发器就会自动执行。
执行的操作是将插入的记录中的column1的值更新到table2表中对应记录的column1字段。
4. 激活和禁用触发器在某些情况下,我们可能需要临时禁用触发器或重新激活触发器。
可以使用DISABLE TRIGGER和ENABLE TRIGGER语句来完成这个操作。
在MSSQL中,触发器是一种特殊类型的存储过程,它会在特定的事件(如INSERT、UPDATE 或DELETE)发生时自动执行。
以下是一个简单的MSSQL触发器示例:假设我们有一个名为`employees`的表,其中包含员工的信息,如下所示:```sqlCREATE TABLE employees (id INT PRIMARY KEY,name NVARCHAR(50),department NVARCHAR(50),salary DECIMAL(10, 2));```现在,我们想要在向`employees`表中插入新员工时自动更新员工的xs。
为此,我们可以创建一个AFTER INSERT触发器,如下所示:```sqlCREATE TRIGGER trg_update_salaryON employeesAFTER INSERTASBEGIN--获取新插入的员工ID和部门DECLARE @new_employee_id INT;DECLARE @new_employee_department NVARCHAR(50);SELECT @new_employee_id = id, @new_employee_department = department FROM inserted;--根据部门计算新的xsDECLARE @new_salary DECIMAL(10, 2);IF @new_employee_department = 'IT'SET @new_salary = 6000.00;ELSE IF @new_employee_department = 'HR'SET @new_salary = 5000.00;ELSESET @new_salary = 4000.00;--更新新员工的xsUPDATE employeesSET salary = @new_salaryWHERE id = @new_employee_id;END;```这个触发器会在向`employees`表中插入新员工后自动执行。
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触发器触发器是⼀种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。
触发器主要是通过事件进⾏触发被⾃动调⽤执⾏的。
⽽存储过程可以通过存储过程的名称被调⽤。
Ø 什么是触发器触发器对表进⾏插⼊、更新、删除的时候会⾃动执⾏的特殊存储过程。
触发器⼀般⽤在check约束更加复杂的约束上⾯。
触发器和普通的存储过程的区别是:触发器是当对某⼀个表进⾏操作。
诸如:update、insert、delete这些操作的时候,系统会⾃动调⽤执⾏该表上对应的触发器。
SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语⾔语句⽽激发,这些语句有create、alter、drop语句。
DML触发器分为:1、 after触发器(之后触发)a、 insert触发器b、 update触发器c、 delete触发器2、 instead of 触发器(之前触发)其中after触发器要求只有执⾏某⼀操作insert、update、delete之后触发器才被触发,且只能定义在表上。
⽽instead of触发器表⽰并不执⾏其定义的操作(insert、update、delete)⽽仅是执⾏触发器本⾝。
既可以在表上定义instead of触发器,也可以在视图上定义。
触发器有两个特殊的表:插⼊表(instered表)和删除表(deleted表)。
这两张是逻辑表也是虚表。
有系统在内存中创建者两张表,不会存储在数据库中。
⽽且两张表的都是只读的,只能读取数据⽽不能修改数据。
这两张表的结果总是与被改触发器应⽤的表的结构相同。
当触发器完成⼯作后,这两张表就会被删除。
Inserted表的数据是插⼊或是修改后的数据,⽽deleted表的数据是更新前的或是删除的数据。
对表的操作Inserted逻辑表Deleted逻辑表增加记录(insert)存放增加的记录⽆删除记录(delete)⽆存放被删除的记录修改记录(update)存放更新后的记录存放更新前的记录Update数据的时候就是先删除表记录,然后增加⼀条记录。
sql触发器实例(原创版)目录1.SQL 触发器的概念2.SQL 触发器的分类3.SQL 触发器的实例4.SQL 触发器的使用场景5.SQL 触发器的优缺点正文1.SQL 触发器的概念SQL 触发器是一种在对数据库表执行某些操作(如插入、更新或删除数据)时自动执行的存储过程。
它可以在数据表发生变化时自动维护数据一致性,提高数据处理的效率。
2.SQL 触发器的分类根据触发时机,SQL 触发器可以分为以下三种类型:- BEFORE 触发器:在数据更改操作之前执行,可以用来验证数据是否符合要求。
- AFTER 触发器:在数据更改操作之后执行,可以用来记录数据变更历史。
- INSTEAD OF 触发器:在数据更改操作过程中执行,可以用来替代原始操作。
3.SQL 触发器的实例假设有一个名为“employees”的表,包含以下字段:id(主键)、name (姓名)、salary(工资)。
现在,我们希望在向该表插入新数据时,自动更新工资总额。
可以通过创建一个 AFTER 触发器来实现。
创建触发器的 SQL 语句如下:```sqlCREATE TRIGGER update_total_salaryAFTER INSERTON employees FOR EACH ROWBEGINUPDATE employeesSET total_salary = total_salary + NEW.salaryWHERE id = NEW.id;END;```4.SQL 触发器的使用场景SQL 触发器可以用于以下场景:- 强制数据一致性:例如,在更新某个字段时,确保其他相关字段也同时更新。
- 数据审计:记录数据变更历史,便于追踪和审计。
- 数据维护:在数据表中执行定期维护任务,如更新统计信息、删除无效数据等。
5.SQL 触发器的优缺点优点:- 可以提高数据处理效率,减少重复操作。
- 可以确保数据一致性,避免数据冲突和错误。
- 可以简化应用程序的开发,将业务逻辑与数据访问分离。
第16章SQL触发器前面已经介绍过了表、视图、存储过程以及函数的创建。
一般而言,创建这些对象后,需要配置一些对应的操作。
例如,执行SELECT语句查询数据,执行EXEC命令执行存储过程等。
SQL也支持自动执行的对象,对数据的更改作出反应,即触发器。
16.1触发器的基本概念触发器是一种特殊的存储过程,它在表的数据变化时发生作用。
触发器可以维护数据完整性。
16.1.1触发器简介触发器在数据库里以独立的对象存储,与存储过程不同的是,存储过程通过其他程序来启动运行,而触发器是由一个事件来启动运行。
即当某个事件发生时,触发器自动地隐式运行。
并且,触发器不能接收参数。
触发器对象定义了触发器的特征和被调用时采取的行动。
而这些动作是通过一个或多个SQL语句来实现的。
SQL支持3种类型的触发器:INSERT(插入)、UPDATE(更新)和DELETE(删除)。
当向表中插入数据、更新数据或删除数据时,触发器就被调用。
通过给表定义一个或多个触发器,可以指定哪个数据修改时,可以激发触发器。
16.1.2触发器执行环境触发器执行环境包含了触发器正确执行所必需的信息。
这些信息主要是触发器本身的细节和触发器所定义的目标表。
另外,触发器执行环境还包括一个或两个测试表,称之为INSERTED 表和DELETED表。
测试表是虚表,用于保存目标表更新、插入或删除的数据信息。
这些测试表用来测试数据修改的结果,以及设置触发器行动的条件。
用户不能直接修改测试表中的数据,但能在SELECT语句中,使用这些表来检测INSERT,UPDATE或DELETE 的结果。
各种类型触发器用到的测试表如图16.1所示(针对SQL Server数据库系统而言)。
第16章SQL触发器**…新数据INSERTt r i g g e r表I n s e r e d表**…被删除数据DELETEt r i g g er表D e l e t e d表**…被删除数据UPDATEt r i g g e r表D e l e t e d表新数据(修改的数据)I n s e r e d表修改的数据图16.1触发器测试表deleted表存放了DELETE和UPDA TE语句中相关行的副本。
SQL触发器的创建和使用SQL触发器(trigger)是用来更改或响应数据库系统中的特定动作或事件的数据库对象,可以定义它们在表中特定数据发生一定的变化时自动地执行的SQL语句,一旦被触发,触发器就会自动地执行被定义的SQL语句。
在SQL Server 2005中,可以创建触发器来实现数据库的安全性和完整性。
触发器的定义可以放置在视图之外,以便于管理,可以动态地添加,修改和删除触发器,也可以创建多种不同的触发器。
一.创建触发器在SQL Server 2005中,可以使用CREATE TRIGGER语句来创建触发器。
如下所示:SQLCREATE TRIGGER trg_Customer_InsertON Customer FOR INSERTASBEGIN-- Trigger logic goes hereEND上面的语句创建一个名为 trg_Customer_Insert 的触发器,作用在Customer 表上,当 INSERT 操作发生时,则自动执行 Trigger logic。
二.使用触发器一旦触发器被创建,有两种方法可以使其起作用,即:对表的INSERT操作对表的UPDATE操作在使用触发器之前,有必要检查它的权限问题,因为只有拥有ALTER 权限的用户才能执行CREATETRIGGER或ALTERTRIGGER的操作。
1.对表的INSERT操作当插入一条记录到表中时,触发器将会自动执行:SQLINSERT INTO Customers( CustomerID, CustomerName, Address, City, State, ZipCode )2.对表的UPDATE操作当更新表中的记录时,触发器将会自动执行:SQLUPDATE CustomersSET Address = '456 Main Street'三.其他常用语句1.删除触发器。
SQL数据库触发器、事务触发器类型有两种:1、AFTER(FOR)触发器在动作执⾏之后触发(增删改执⾏完成后,触发器中的代码再执⾏),不能为视图指定for触发器,只能为表指定该触发器。
2、instead of触发器可以理解为替代触发操作执⾏,写了这个之后,写的执⾏代码就没有⽤了,就被触发器的代码覆盖了同时DML 触发器使⽤ deleted 和 inserted 逻辑(概念)表。
它们在结构上类似于定义了触发器的表,即对其尝试执⾏了⽤户操作的表。
在 deleted 和 inserted 表保存了可能会被⽤户更改的⾏的旧值或新值。
⑴对于INSERT 操作,inserted保留新增的记录,deleted⽆记录⑵对于DELETE 操作,inserted⽆记录,deleted保留被删除的记录⑶对于UPDATE操作,inserted保留修改后的记录,deleted保留修改前的记录创建触发器create trigger Insert_Student --命名规范on student --针对于哪⼀个表for insert --针对于哪⼀个动作来触发as触发执⾏的代码段gocreate trigger Delete_Infoon infoinstead of deleteasgocreate trigger Delete_Nationon nationfor deleteasgoView Code注:触发器常⽤的为级联删除:create trigger delete_studenton studentinstead of deleteas--如果要删除student表数据,那么需要级联删除declare @sno varchar(20);set @sno = sno from deleted --deleted固定格式,为删除执⾏所能删除的数据,并没有执⾏删除,⽽是把他们显⽰出来,在这获得要删除的数据的sno,然后先删除其他表中此sno的数据delete from score where sno = @sno;delete from student where sno = @sno;gocreate trigger Delete_Infoon infoinstead of deleteasdeclare@c varchar(20)select@c= code from deleteddelete from work where infocode=@cdelete from family where infocode=@cdelete from info where code=@cgoView Code事务数据库事务(Database Transaction) 是指作为单个逻辑⼯作单元执⾏的⼀系列操作。
SQL触发器触发器是一种特殊类型的存储过程,不由用户直接调用。
创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行。
CREATE PROCEDURE 或CREATE TRIGGER 语句不能跨越批处理。
即存储过程或触发器始终只能在一个批处理中创建并编译到一个执行计划中。
用触发器还可以强制执行业务规则Microsoft® SQL Server™ 2000 提供了两种主要机制来强制业务规则和数据完整性:约束和触发器。
触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效。
唤醒调用触发器以响应INSERT、UPDATE 或DELETE 语句。
触发器可以查询其它表,并可以包含复杂的Transact-SQL 语句。
将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。
如果检测到严重错误(例如,磁盘空间不足),则整个事务即自动回滚。
触发器的优点如下:触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。
触发器可以强制比用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触发器语法语法CREATE TRIGGER trigger_nameON { table | view }[ WITH ENCRYPTION ]{{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ DELETE ] [ UPDATE ] }[ WITH APPEND ][ NOT FOR REPLICATION ]AS[ { IF UPDATE ( column )[ { AND | OR } UPDATE ( column ) ][ ...n ]| IF ( COLUMNS_UPDATED ( ) updated_bitmask )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 函数以从左到右的顺序返回位,最左边的为最不重要的位。