请教:触发器问题(怎样使2个表互相更新?)

时间:2021-09-14 10:58:02
A表有name,age字段,B表也存在name,age字段
现在当修改A表的name,age时A表同时更新
同时修改B表的name,age时B表也要更新
请问这样的触发器该怎么设计?

11 个解决方案

#1


写错了 是
A表有name,age字段,B表也存在name,age字段
现在当修改A表的name,age时B表同时更新
同时修改B表的name,age时A表也要更新
请问这样的触发器该怎么设计?

#2


都写触发器,控制不好 死循环了。

#3


如果A、B结构完全相同,与其用触发器,还不如直接用一个表。

两个表用触发器相互更新,容易造成死循环。

#4


因为需要这么做啊,我也不想,不是同一个表,只是有字段相同,用其他方法也行

#5


难道不管怎样都会是死循环?

#6


1、设置nested triggers 选项

USE master
EXEC sp_configure 'nested triggers', '0'
RECONFIGURE WITH OVERRIDE

2、写触发器,要求两表都有主键,而且主键相同,都不允许修改,假设为id

create trigger tr_a
on a
for insert,update,delete
as
  delete b 
  from deleted d,b
  where b.id=d.id

  insert b (id,name,age)
  select id,name,age from inserted
go


create trigger tr_b
on b
for insert,update,delete
as
  delete a 
  from deleted d,a
  where a.id=d.id

  insert a (id,name,age)
  select id,name,age from inserted
go

#7


设置nested triggers 选项为0 可以防止死循环


不过,其他的处罚企业就不能嵌套了,就是说其他的x表触发器修改y表,y表如果有触发器就不会触发,lz自己考虑清楚这样做有没必要,考虑下wangtiecheng(/+〆=ろ)的意见

#8


--触发器嵌套:指执行了一条DML语句的触发器是否能够触发另一个触发器

--例如:如果启用了Nested Triggers服务器选项,并且表A的触发器更新了表B,而表B也具有一个触发器,这样,表B的触发器也会随之触发!默认情况下该选项是打开的!
--以下是将此功能关闭
----上述语句在企业管理器中的配置是
EXEC  sp_configure  'nested triggers',0 
RECONFIGURE  WITH  OVERRIDE

--右键单击SQL实例-属性-服务器设置-允许激发会激发其它触发器的触发器,将选项去掉就可以了

--建立测试表1
CREATE TABLE T1(ID INT,NAMES VARCHAR(10))
INSERT T1 SELECT 1,'A'
UNION ALL SELECT 2,'B'
---建立测试表2
CREATE TABLE T2(ID INT,NAMES VARCHAR(10))
INSERT T2 SELECT 1,'A'
UNION ALL SELECT 2,'B'
---建立触发器1,来同步t2
CREATE TRIGGER TRI_T1
ON T1
FOR UPDATE
AS
UPDATE T2
SET ID=C.ID,NAMES=C.NAMES
FROM T2 A ,DELETED B,INSERTED C
WHERE A.ID=B.ID
------建立触发器2,来同步t1
CREATE TRIGGER TRI_T2
ON T2
FOR UPDATE
AS
UPDATE T1
SET ID=C.ID,NAMES=C.NAMES
FROM T1 A ,DELETED B,INSERTED C
WHERE A.ID=B.ID
--
go

--test1
UPDATE T1
SET ID=5,NAME='CCC'
WHERE ID=1
--RESULTS
SELECT * FROM T2
--TEST2
UPDATE T2
SET ID=6,NAME='EEE'
WHERE ID=2
--RESULTS
SELECT * FROM T1
-------------------------
--另一种方法用互斥触发器
--做互斥触发器
--这种方法LZ自已设计一下!这是一个小例子,实在不想写了:)
Create Trigger Tri_Users
On Users 
For Insert
As
Alter Table Users1 DISABLE TRIGGER Tri_Users1  --为防止循环,这里先将对方触发器禁用
Insert Users1  Select * From Inserted
Alter Table Users1 Enable TRIGGER Tri_Users1--插入完毕后启用对方触发器
--*********************
Go
Create Trigger Tri_Users1
On Users1 
For Insert
As
Alter Table Users  DISABLE TRIGGER Tri_Users 
Insert Users  Select * From Inserted
Alter Table Users  Enable TRIGGER Tri_Users



 

#9


楼上的大哥快啊!我刚写完:)

#10


互斥触发器的设计很好,只是需要注意权限问题,毕竟负责输入的人不能给太多权限


不是“楼上的大哥”,是“楼上的冒牌”

我是“楼下的冒牌”

#11


UP!

#1


写错了 是
A表有name,age字段,B表也存在name,age字段
现在当修改A表的name,age时B表同时更新
同时修改B表的name,age时A表也要更新
请问这样的触发器该怎么设计?

#2


都写触发器,控制不好 死循环了。

#3


如果A、B结构完全相同,与其用触发器,还不如直接用一个表。

两个表用触发器相互更新,容易造成死循环。

#4


因为需要这么做啊,我也不想,不是同一个表,只是有字段相同,用其他方法也行

#5


难道不管怎样都会是死循环?

#6


1、设置nested triggers 选项

USE master
EXEC sp_configure 'nested triggers', '0'
RECONFIGURE WITH OVERRIDE

2、写触发器,要求两表都有主键,而且主键相同,都不允许修改,假设为id

create trigger tr_a
on a
for insert,update,delete
as
  delete b 
  from deleted d,b
  where b.id=d.id

  insert b (id,name,age)
  select id,name,age from inserted
go


create trigger tr_b
on b
for insert,update,delete
as
  delete a 
  from deleted d,a
  where a.id=d.id

  insert a (id,name,age)
  select id,name,age from inserted
go

#7


设置nested triggers 选项为0 可以防止死循环


不过,其他的处罚企业就不能嵌套了,就是说其他的x表触发器修改y表,y表如果有触发器就不会触发,lz自己考虑清楚这样做有没必要,考虑下wangtiecheng(/+〆=ろ)的意见

#8


--触发器嵌套:指执行了一条DML语句的触发器是否能够触发另一个触发器

--例如:如果启用了Nested Triggers服务器选项,并且表A的触发器更新了表B,而表B也具有一个触发器,这样,表B的触发器也会随之触发!默认情况下该选项是打开的!
--以下是将此功能关闭
----上述语句在企业管理器中的配置是
EXEC  sp_configure  'nested triggers',0 
RECONFIGURE  WITH  OVERRIDE

--右键单击SQL实例-属性-服务器设置-允许激发会激发其它触发器的触发器,将选项去掉就可以了

--建立测试表1
CREATE TABLE T1(ID INT,NAMES VARCHAR(10))
INSERT T1 SELECT 1,'A'
UNION ALL SELECT 2,'B'
---建立测试表2
CREATE TABLE T2(ID INT,NAMES VARCHAR(10))
INSERT T2 SELECT 1,'A'
UNION ALL SELECT 2,'B'
---建立触发器1,来同步t2
CREATE TRIGGER TRI_T1
ON T1
FOR UPDATE
AS
UPDATE T2
SET ID=C.ID,NAMES=C.NAMES
FROM T2 A ,DELETED B,INSERTED C
WHERE A.ID=B.ID
------建立触发器2,来同步t1
CREATE TRIGGER TRI_T2
ON T2
FOR UPDATE
AS
UPDATE T1
SET ID=C.ID,NAMES=C.NAMES
FROM T1 A ,DELETED B,INSERTED C
WHERE A.ID=B.ID
--
go

--test1
UPDATE T1
SET ID=5,NAME='CCC'
WHERE ID=1
--RESULTS
SELECT * FROM T2
--TEST2
UPDATE T2
SET ID=6,NAME='EEE'
WHERE ID=2
--RESULTS
SELECT * FROM T1
-------------------------
--另一种方法用互斥触发器
--做互斥触发器
--这种方法LZ自已设计一下!这是一个小例子,实在不想写了:)
Create Trigger Tri_Users
On Users 
For Insert
As
Alter Table Users1 DISABLE TRIGGER Tri_Users1  --为防止循环,这里先将对方触发器禁用
Insert Users1  Select * From Inserted
Alter Table Users1 Enable TRIGGER Tri_Users1--插入完毕后启用对方触发器
--*********************
Go
Create Trigger Tri_Users1
On Users1 
For Insert
As
Alter Table Users  DISABLE TRIGGER Tri_Users 
Insert Users  Select * From Inserted
Alter Table Users  Enable TRIGGER Tri_Users



 

#9


楼上的大哥快啊!我刚写完:)

#10


互斥触发器的设计很好,只是需要注意权限问题,毕竟负责输入的人不能给太多权限


不是“楼上的大哥”,是“楼上的冒牌”

我是“楼下的冒牌”

#11


UP!