求助:修改一个表中的字段,同时更新多个表相同字段

时间:2021-12-05 14:59:09
数据库有18个数据表,每个表都有ProjectIDYear这一字段,现在想要通过更改一个表中的ProjectIDYear字段,同时更新其余各表的这一字段。该如何设计触发器?

我的的触发器总会“无法绑定由多个部分组成的标识符 "PrjBasicInfo.ProjectIDYear"”,其中PrjBasicInfo为人工修改的表,其余的表自动更新。

或者有没有其他的办法可以实现,谢谢各位了!

各个表之间通过这一字段建立的联系。

8 个解决方案

#1


create trigger trig_tb1 on tb1 for update
as
begin
  update tb2 set ProjectIDYear = i.ProjectIDYear from tb2 , inserted i where tb2.关键字 = i.关键字
  update tb3 set ProjectIDYear = i.ProjectIDYear from tb3 , inserted i where tb3.关键字 = i.关键字
  ...
  update tb18 set ProjectIDYear = i.ProjectIDYear from tb18 , inserted i where tb18.关键字 = i.关键字

end

#2


把代码贴出来看看

#3


如果是级联更新则参考如下:

create table 班级表(班级名 char(8),系部名 char(10),学制 int)

insert 班级表 values('天动一班','大气科学系',4)
insert 班级表 values('天动二班','大气科学系',4)
insert 班级表 values('天动三班','大气科学系',4)
insert 班级表 values('天动四班','大气科学系',4)

create table 学生表(学号 char(8),姓名 char(6),班级名 char(8))

insert 学生表 values('01980001','张一','天动一班')
insert 学生表 values('01980002','张二','天动一班')
insert 学生表 values('01980003','张三','天动一班')
insert 学生表 values('01980004','张四','天动二班')
insert 学生表 values('01980005','张五','天动二班')
insert 学生表 values('01980006','张六','天动三班')
insert 学生表 values('01980007','张七','天动四班')


CREATE TRIGGER [T1] ON 班级表
FOR UPDATE
AS
if update(班级名)
   update a
   set a.班级名 = (select 班级名 from inserted )
   from 学生表 a join deleted b
   on a.班级名 = b.班级名
go

update 班级表
set 班级名='自动化'
where 班级名 = '天动一班'
/*
更新前
学号       姓名     班级名      
-------- ------ -------- 
01980001 张一     天动一班
01980002 张二     天动一班
01980003 张三     天动一班
01980004 张四     天动二班
01980005 张五     天动二班
01980006 张六     天动三班
01980007 张七     天动四班
更新后

学号       姓名     班级名      
-------- ------ -------- 
01980001 张一     自动化  
01980002 张二     自动化  
01980003 张三     自动化  
01980004 张四     天动二班
01980005 张五     天动二班
01980006 张六     天动三班
01980007 张七     天动四班
*/

#4


  感谢1楼!

  不能通过ProjectIDYear来建立联系么,很多表与被修改的表之间没有别的相同字段了
  要不就修改数据表,加字段?

  还有,那个i代表什么含义?菜鸟一个,不懂

#5


引用 4 楼 she19890320 的回复:
感谢1楼!

  不能通过ProjectIDYear来建立联系么,很多表与被修改的表之间没有别的相同字段了
  要不就修改数据表,加字段?

  还有,那个i代表什么含义?菜鸟一个,不懂

ProjectIDYear就是你的关键字?

create trigger trig_tb1 on tb1 for update
as
begin
  update tb2 set ProjectIDYear = (select ProjectIDYear from inserted) from tb2 where ProjectIDYear = (select ProjectIDYear from deleted)
  其他表类似...
end

#6


引用 5 楼 dawugui 的回复:
引用 4 楼 she19890320 的回复:
感谢1楼!

不能通过ProjectIDYear来建立联系么,很多表与被修改的表之间没有别的相同字段了
要不就修改数据表,加字段?

还有,那个i代表什么含义?菜鸟一个,不懂

ProjectIDYear就是你的关键字?

create trigger trig_tb1 on tb1 for update
as
begin
……


谢谢,可以结贴啦~

最近做地调局项目,数据库特别乱,得重新整理,而我以前没有做过数据库,小白一个,一楼帮大忙了,十分感谢!

#7


if object_id('[tri]') is not null drop trigger tri
go
create trigger tri on tb
for update
as
begin
declare @id int , @sql varchar(100)
select top 1 @id=id from inserted
select @sql='exec sp_msforeachtable  @command1=''update ? set ?.id='+ltrim(@id)+''',@whereand=''and o.name <>''''tb'''''''
exec(@sql)
end


自己改下对应值。

#8


囧。。。。 回复了一个已经结贴的。。。。。。。

#1


create trigger trig_tb1 on tb1 for update
as
begin
  update tb2 set ProjectIDYear = i.ProjectIDYear from tb2 , inserted i where tb2.关键字 = i.关键字
  update tb3 set ProjectIDYear = i.ProjectIDYear from tb3 , inserted i where tb3.关键字 = i.关键字
  ...
  update tb18 set ProjectIDYear = i.ProjectIDYear from tb18 , inserted i where tb18.关键字 = i.关键字

end

#2


把代码贴出来看看

#3


如果是级联更新则参考如下:

create table 班级表(班级名 char(8),系部名 char(10),学制 int)

insert 班级表 values('天动一班','大气科学系',4)
insert 班级表 values('天动二班','大气科学系',4)
insert 班级表 values('天动三班','大气科学系',4)
insert 班级表 values('天动四班','大气科学系',4)

create table 学生表(学号 char(8),姓名 char(6),班级名 char(8))

insert 学生表 values('01980001','张一','天动一班')
insert 学生表 values('01980002','张二','天动一班')
insert 学生表 values('01980003','张三','天动一班')
insert 学生表 values('01980004','张四','天动二班')
insert 学生表 values('01980005','张五','天动二班')
insert 学生表 values('01980006','张六','天动三班')
insert 学生表 values('01980007','张七','天动四班')


CREATE TRIGGER [T1] ON 班级表
FOR UPDATE
AS
if update(班级名)
   update a
   set a.班级名 = (select 班级名 from inserted )
   from 学生表 a join deleted b
   on a.班级名 = b.班级名
go

update 班级表
set 班级名='自动化'
where 班级名 = '天动一班'
/*
更新前
学号       姓名     班级名      
-------- ------ -------- 
01980001 张一     天动一班
01980002 张二     天动一班
01980003 张三     天动一班
01980004 张四     天动二班
01980005 张五     天动二班
01980006 张六     天动三班
01980007 张七     天动四班
更新后

学号       姓名     班级名      
-------- ------ -------- 
01980001 张一     自动化  
01980002 张二     自动化  
01980003 张三     自动化  
01980004 张四     天动二班
01980005 张五     天动二班
01980006 张六     天动三班
01980007 张七     天动四班
*/

#4


  感谢1楼!

  不能通过ProjectIDYear来建立联系么,很多表与被修改的表之间没有别的相同字段了
  要不就修改数据表,加字段?

  还有,那个i代表什么含义?菜鸟一个,不懂

#5


引用 4 楼 she19890320 的回复:
感谢1楼!

  不能通过ProjectIDYear来建立联系么,很多表与被修改的表之间没有别的相同字段了
  要不就修改数据表,加字段?

  还有,那个i代表什么含义?菜鸟一个,不懂

ProjectIDYear就是你的关键字?

create trigger trig_tb1 on tb1 for update
as
begin
  update tb2 set ProjectIDYear = (select ProjectIDYear from inserted) from tb2 where ProjectIDYear = (select ProjectIDYear from deleted)
  其他表类似...
end

#6


引用 5 楼 dawugui 的回复:
引用 4 楼 she19890320 的回复:
感谢1楼!

不能通过ProjectIDYear来建立联系么,很多表与被修改的表之间没有别的相同字段了
要不就修改数据表,加字段?

还有,那个i代表什么含义?菜鸟一个,不懂

ProjectIDYear就是你的关键字?

create trigger trig_tb1 on tb1 for update
as
begin
……


谢谢,可以结贴啦~

最近做地调局项目,数据库特别乱,得重新整理,而我以前没有做过数据库,小白一个,一楼帮大忙了,十分感谢!

#7


if object_id('[tri]') is not null drop trigger tri
go
create trigger tri on tb
for update
as
begin
declare @id int , @sql varchar(100)
select top 1 @id=id from inserted
select @sql='exec sp_msforeachtable  @command1=''update ? set ?.id='+ltrim(@id)+''',@whereand=''and o.name <>''''tb'''''''
exec(@sql)
end


自己改下对应值。

#8


囧。。。。 回复了一个已经结贴的。。。。。。。