现在当修改A表的name,age时A表同时更新
同时修改B表的name,age时B表也要更新
请问这样的触发器该怎么设计?
11 个解决方案
#1
写错了 是
A表有name,age字段,B表也存在name,age字段
现在当修改A表的name,age时B表同时更新
同时修改B表的name,age时A表也要更新
请问这样的触发器该怎么设计?
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
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(/+〆=ろ)的意见
不过,其他的处罚企业就不能嵌套了,就是说其他的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
--例如:如果启用了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表也要更新
请问这样的触发器该怎么设计?
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
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(/+〆=ろ)的意见
不过,其他的处罚企业就不能嵌套了,就是说其他的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
--例如:如果启用了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!