最近在使用触发器实现数据同步,中间遇到两个问题
问题一 大字段不能出现在after定义的触发器的inserted,deleted表中,解决方法修改字段的属性值为nvarchar(max),但是instead of没有这个限制
问题二 instead of 与 after的区别
INSTEAD OF 触发器
用来代替通常的触发动作,即当对表进行INSERT、UPDATE 或 DELETE 操作时,系统不是直接对表执行这些操作,而是把操作内容交给触发器,让触发器检查所进行的操作是否正确。如正确才进行相应的操作。因此,INSTEAD OF 触发器的动作要早于表的约束处理。
INSTEAD OF 触发器的操作有点类似于完整性约束。在对数据库的操纵时,有些情况下使用约束可以达到更好的效果,而如果采用触发器,则能定义比完整性约束更加复杂的约束。有关触发器与约束的比较,请参见联机丛书。
INSTEAD OF 触发器不仅可在表上定义,还可在带有一个或多个基表的视图上定义,但在作为级联引用完整性约束目标的表上限制应用。
AFTER 触发器
定义了对表执行了 INSERT、UPDATE 或 DELETE 语句操作之后再执行的操作。比如对某个表中的数据进行了更新操作后,要求立即对相关的表进行指定的操作,这时就可以采用 AFTER 触发器。AFTER 触发器只能在表上指定,且动作晚于约束处理。
每一个表上只能创建一个 INSTEAD OF 触发器,但可以创建多个 AFTER 触发器。
CREATE TRIGGER t_dalii ON [dbo].[员工明细表]
FOR INSERT
AS
declare @v_char1 varchar(20),@v_char2 varchar(20),@v_char3 int,@v_char4 varchar(20),@v_char5 datetime
begin
set @v_char1=(select 所属部门 from inserted)
if @v_char1<>null
begin
if exists(select 部门号 from 部门状态表 where 部门=@v_char1)
set @v_char2=(select 部门号 from 部门状态表 where 部门=@v_char1)
else
set @v_char2=((select max(部门号) from 部门状态表 )+1)
end
set @v_char3=(select 编号 from inserted)
set @v_char4=(select 姓名 from inserted)
set @v_char5=(select 入厂时间 from inserted)
insert into 部门人员表 (部门号,部门,编号,姓名,员工属性,进部门时间,是否在职,是否下岗 )
values(@v_char2,@v_char1,@v_char3,@v_char4,''职员'',@v_char5,''是'',''否'')
end
---------------------------------------------------------------
create trigger tr_name on 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 ,inserted
deleted 和inserted 可以说是一种特殊的临时表,是在进行激活触发器时由系统自动生成的,其结构与触发器作用的表结构是一样的,只是存放 的数据有差异。
---------------------------------------------------------------
for update 修改时激发
for insert 插入数据时激发
for delete 删除数据时激发
deleted 有变动的数据的修改前数据集
inserted 有变动的数据的修改后数据集