sqlserver同一数据库中A,B两表。使用触发器实现两表双向的数据同步添加

例如:A,B表中CustomerID为主键自增长 ,A, B表中的触发器只有一个存在的时候都能实现。当两个同时存在时,向其中一个表插数据就会报“消息 8107,级别 16,状态 1,过程 addToB,第 8 行
表 'FitnessClub.dbo.TB_Customer' 的 IDENTITY_INSERT 已经为 ON。无法为表 'TB_CustomerTemp' 执行 SET 操作。”这个错误,为什么。
代码:
A表中的触发器:
CREATE TRIGGER [addToB]
ON [dbo].[TB_Customer]
AFTER INSERT
AS BEGIN
SET IDENTITY_INSERT TB_CustomerTemp ON
INSERT INTO
TB_CustomerTemp([CustomerID],[CustomerName]
,[Age]
,[Address])
SELECT [CustomerID],[CustomerName]
,[Age]
,[Address]
FROM INSERTED
SET IDENTITY_INSERT TB_CustomerTemp OFF
END

B表中的触发器:
ALTER TRIGGER [addToA]
ON [dbo].[TB_CustomerTemp]
AFTER INSERT
AS BEGIN
SET IDENTITY_INSERT TB_Customer ON
INSERT INTO
TB_Customer([CustomerID],[CustomerName]
,[Age]
,[Address])
SELECT [CustomerID],[CustomerName]
,[Age]
,[Address]
FROM INSERTED
SET IDENTITY_INSERT TB_Customer OFF
END

这个错误很明显
就是SET IDENTITY_INSERT TB_Customer ON 你这条语句在a触发器中已经开启

而b触发器也开启了 此时a触发器还没有关闭IDENTITY_INSERT
另外一个又打开 肯定会报错了
不为什么要插入标识列? 设为自动增长 就不需要这个命令了 你的触发器就可以同时执行追问

两个表的CustomerID都是自增长且是主键,主要是想当A表执行添加语句的时候B表的CustomerID和A的一样

追答

你可以选择一个是直接插入 另外一个通过关联插入(这个就使用上面那个命令)
你既然两个触发器 都用这个插入的方法 使id保持一致 那么肯定有方法找到关联

追问

额,那我双向的触发器插入该如何改才能 不报错呢。A插入时调用A表中的触发器将数据同时插入B表。B表插入数据时调用B表中的触发器将数据同时插入A表呢,我该改哪里能实现呢。

追答

如果你能避免两个触发器同时触发 那就很简单 如果同时触发的话 很有可能产生id冲突

追问

你的意思是当我向A表添加数据时调用触发器向B表添加数据的同时又触发了B中的触发器了?这样才产生了冲突?

追答

是的 因为你这两个都是插入的触发器 如果触发器不产生冲突 会产生循环的 设计上不合理

追问

哦哦,那我该如何修改呢。我能加你么,第一次接触触发器,希望多多指点。

追答

可以 只是现在有点忙

温馨提示:答案为网友推荐,仅供参考
相似回答