求一个UPDATE触发器!

yrb 2008-03-13 04:20:46
求一个UPDATE触发器!

有两个表,结构大致如下:

表1:职称代码表
列1:职称代码
列2:职称名称

表2:员工表
列1:姓名
...
列n:职称代码

问题
用触发器实现:当职称代码表中职称代码被改变的时候,同步修改员工表中的职称代码!
职称代码表可能一次(一个update语句)修改多行记录
...全文
116 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
parss 2008-03-13
  • 打赏
  • 举报
回复
create trigger
ON 职称代码表
FOR UPDATE
if UPDATE(职称代码)
update 员工表 set 职称代码=i.职称代码 from 员工表 inner join deleted d
ON d.职称代码=员工表.职称代码
inner join
inserted i
on I.职称名称=员工表.职称名称
ojuju10 2008-03-13
  • 打赏
  • 举报
回复

----借5楼数据
create table dep
(
id int identity(1,1) not null,
code int,
depName nvarchar(50)

)

create table emp
(
id int identity(1,1) not null,
empName char(10),
depName nvarchar(50)
)

insert dep select 11,'AA'

insert dep select 22,'BB'

insert dep select 33,'CC'


insert emp select 'aa','AA'

insert emp select 'bb','BB'

insert emp select 'cc','CC'

alter trigger update_emp_dep on dep
for update
as
begin
update emp set depname=i.depname from emp a,inserted i,deleted d
where a.depname=d.depname

end


update dep set depname='dd'

select * from emp

select * from dep


ma3qiang2 2008-03-13
  • 打赏
  • 举报
回复
4楼 hlq8210 正解
5 楼 的当执行以下语句时,只能更新一条。
update dep set depName='cc'
select * from dep
select * from emp

原因在于select @newDepName=depName from inserted
把inserted的表(多个记录)赋给一个参数(只能储存一个)
很容易犯的错误
wangxuelid 2008-03-13
  • 打赏
  • 举报
回复
create trigger tri_dep_name
on dep
for update
as
begin
declare @DepName nvarchar(50),@newDepName nvarchar(50)
select @DepName=depName from deleted
select @newDepName=depName from inserted
update emp set depName=@newDepName where depName=@DepName
end
请教:这个什么东西?
-狙击手- 2008-03-13
  • 打赏
  • 举报
回复
其实这是设计带来的不当

如果在员工表中保存是职称的代码,就没有么麻烦了,随你怎么改职称名称

heshengfen123 2008-03-13
  • 打赏
  • 举报
回复
create trigger update_trigger
on 职称代码表
for update
as
begin
if(update(职称代码))
update 员工表 set 员工表.职称代码=职称代码表.职称代码
end
-狙击手- 2008-03-13
  • 打赏
  • 举报
回复
create table dep
(
id int identity(1,1) not null,
code int,
depName nvarchar(50)

)

create table emp
(
id int identity(1,1) not null,
empName char(10),
depName nvarchar(50)
)

insert dep select 11,'AA'

insert dep select 22,'BB'

insert dep select 33,'CC'


insert emp select 'aa','AA'

insert emp select 'bb','BB'

insert emp select 'cc','CC'
go

create trigger tri_dep_name
on dep
for update
as
begin

update a
set depName=b.newDepName
from emp a
right join (select newdepname = i.depname,oldname = d.depname
from inserted i inner join deleted d on i.code = d.code) b
on b.oldname = a.depname
end

go
select * from dep
select * from emp

update dep set depName='DD' where depName='AA'

select * from dep
select * from emp

drop table dep,emp

/*


id code depName
----------- ----------- --------------------------------------------------
1 11 AA
2 22 BB
3 33 CC

(所影响的行数为 3 行)

id empName depName
----------- ---------- --------------------------------------------------
1 aa AA
2 bb BB
3 cc CC

(所影响的行数为 3 行)


(所影响的行数为 1 行)

id code depName
----------- ----------- --------------------------------------------------
1 11 DD
2 22 BB
3 33 CC

(所影响的行数为 3 行)

id empName depName
----------- ---------- --------------------------------------------------
1 aa DD
2 bb BB
3 cc CC

(所影响的行数为 3 行)


*/
-狙击手- 2008-03-13
  • 打赏
  • 举报
回复
create table dep
(
id int identity(1,1) not null,
code int,
depName nvarchar(50)

)

create table emp
(
id int identity(1,1) not null,
empName char(10),
depName nvarchar(50)
)

insert dep select 11,'AA'

insert dep select 22,'BB'

insert dep select 33,'CC'


insert emp select 'aa','AA'

insert emp select 'bb','BB'

insert emp select 'cc','CC'
go

create trigger tri_dep_name
on dep
for update
as
begin
declare @DepName nvarchar(50),@newDepName nvarchar(50)
select @DepName=depName from deleted
select @newDepName=depName from inserted
update a
set depName=b.newDepName
from emp a
right join (select newdepname = i.depname,oldname = d.depname
from inserted i inner join deleted d on i.code = d.code) b
on b.oldname = a.depname
end

go
select * from dep
select * from emp

update dep set depName='DD' where depName='AA'

select * from dep
select * from emp

drop table dep,emp

/*


id code depName
----------- ----------- --------------------------------------------------
1 11 AA
2 22 BB
3 33 CC

(所影响的行数为 3 行)

id empName depName
----------- ---------- --------------------------------------------------
1 aa AA
2 bb BB
3 cc CC

(所影响的行数为 3 行)


(所影响的行数为 1 行)

id code depName
----------- ----------- --------------------------------------------------
1 11 DD
2 22 BB
3 33 CC

(所影响的行数为 3 行)

id empName depName
----------- ---------- --------------------------------------------------
1 aa DD
2 bb BB
3 cc CC

(所影响的行数为 3 行)


*/
QQQQAnnie 2008-03-13
  • 打赏
  • 举报
回复
create table dep
(
id int identity(1,1) not null,
code int,
depName nvarchar(50)

)

create table emp
(
id int identity(1,1) not null,
empName char(10),
depName nvarchar(50)
)

insert dep select 11,'AA'

insert dep select 22,'BB'

insert dep select 33,'CC'


insert emp select 'aa','AA'

insert emp select 'bb','BB'

insert emp select 'cc','CC'


create trigger tri_dep_name
on dep
for update
as
begin
declare @DepName nvarchar(50),@newDepName nvarchar(50)
select @DepName=depName from deleted
select @newDepName=depName from inserted
update emp set depName=@newDepName where depName=@DepName
end


select * from dep
select * from emp

update dep set depName='DD' where depName='AA'

select * from dep
select * from emp
hlq8210 2008-03-13
  • 打赏
  • 举报
回复

create trigger
ON 职称代码表
FOR UPDATE
if UPDATE(职称代码)
update 员工表 set 职称代码=i.职称代码 from 员工表 inner join deleted d
ON d.职称代码=员工表.职称代码
inner join
inserted i
on I.职称名称=员工表.职称名称



QQQQAnnie 2008-03-13
  • 打赏
  • 举报
回复
职称代码是唯一的吗
hlq8210 2008-03-13
  • 打赏
  • 举报
回复
不好意思,看错了
hlq8210 2008-03-13
  • 打赏
  • 举报
回复

---职称名称没有重复的写法
create trigger
ON 职称代码表
FOR UPDATE
if UPDATE(职称代码)
update 员工表 set 职称代码=i.职称代码 from 员工表 inner join Inserted I
ON I.职称名称=员工表.职称名称

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧