sqlserver事务复制发布 订阅端如何启用触发器

服务器A上的m表数据变化,通过事务复制可以将m表与服务器B上的n表进行同步,n表被同步的同时,能否激发n表的触发器或是某个存储过程?

第1个回答  2014-08-11
n表的触发器是否激发,这个具体要看n表里所定义的触发器来定。
触发器一般是三种:DML、DDL、LOGON。
DML类的是被insert、update、delete等触发;
DDL类的是被Create、Alter等触发;
LOGON类的是被登录事件触发;

你所提到的m表到n表的同步,这种同步一般是数据同步;
因此,若n表的触发器是DDL、LOGON类型的不会触发;
是DML类的,若未发生数据变化,或发生的数据变化与触发器定义不符合,也不会触发(比如定义了insert触发器,数据同步时,是发生update/delete,而非insert,不会触发)。否则会触发。追问

肯定是指有数据插入的情况下。 但目前发现同步过来的数据,没有触发inserted触发器。

追答

如果有insert触发器定义,只要有数据新增,是会触发的。
你检查下:
1、n表的insert触发器定义正确否?
2、n表的数据同步是否是新增而非更新?
3、检查下,是否禁用了触发器?
4、触发器的处理逻辑是否正确?

我不清楚你怎么判断未触发的,如果只是看数据是否变化,是不对的。是否触发,首先的,是不要看数据是否变化来判断:先用简单语句测试。比如建个新表,清空,有触发就在这个表里新增一行测试记录。确认触发前,先不要在触发器里用inserted处理,也不要加条件判断。

追问

是有触发,但提示错。

n表触发器是将数据同时插入第3个表CardData,这个表有自增长ID列。提示“当 IDENTITY_INSERT 设置为 ON 或某个复制用户向 NOT FOR REPLICATION 标识列中插入内容时,必须为表 'CardData' 中的标识列指定显式值。”

如何才能避免这种错误情况发生?

追答

有自增长字段的话,要insert,必须把IDENTITY_INSERT 设置为on再执行insert,大致如下:
SET IDENTITY_INSERT CardData ON
insert CardData (字段1,字段2,字段3……) values (值1,值2,值3……)
SET IDENTITY_INSERT CardData OFF