我是个菜鸟,要处理这个业务,触发器怎么写?

飞扬的雪花 2014-01-23 02:31:45
现有2张表分别为表1和表2,当表2中有数据插入时,表1的状态更新为1,现在要实现的是将表1的某字段信息更新至表2的某字段中,如何处理?
...全文
223 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞扬的雪花 2014-01-23
  • 打赏
  • 举报
回复
引用 20 楼 yupeigu 的回复:
[quote=引用 19 楼 u013545744 的回复:] [quote=引用 18 楼 yupeigu 的回复:] [quote=引用 17 楼 u013545744 的回复:] [quote=引用 16 楼 yupeigu 的回复:] [quote=引用 15 楼 u013545744 的回复:] [quote=引用 14 楼 yupeigu 的回复:] [quote=引用 12 楼 u013545744 的回复:] [quote=引用 11 楼 yupeigu 的回复:] [quote=引用 9 楼 u013545744 的回复:] 可能是我的处理思路有问题,我还是具体说下我的需求。现在有4张表分别为a(finterid,forgppointerid,fmrpclosed),b(finterid),c(finterid,fentryid,fuse),d(fplanorderinterid,fsourceentryid,fnote),其中 d.fplanorderinterid=a.finterid and a.forgppointerid=c.finterid and c.finterid=b.finterid and d.fsourceentryid=c.fentryid 现在做的是:前台操作a表对应单据时,后台会在d表中生成一条记录,随后,a.fmrpclosed=1,在d表生成的记录中需要把c表的fnote带到d表的fuse中。 我现在有两种思路,一种是直接通过c表更新d,一种是通过中间表a关联c表更新d,不晓得那种方法可行,请大家给我指点指点,不胜感激。
就是在插入a表的时候,直接update d表, 也就是第2种方法吧,通过中间表a关联c表更新d[/quote] 不是在插入a时生成d表记录,而是a表对应前台单据有个按钮事件,当事件结束后,有两个结果,一个是把a表fmrpclosed改为1,一个是在d表中产生新的记录。[/quote] 哦,你的意思是,事件结束的时候,触发把c表的fnote带到d表的fuse中[/quote] 是的,具体怎么实现?[/quote] 那事件结束有什么标志吗,或者说事件结束,就会插入数据?[/quote] 可以认为当a.fmrpclosed=1时代表事件结束,然后在更新d表字段。[/quote] 那这个a.fmrpclosed=1 是有一个update操作吗[/quote] 是的。[/quote] 大概就是这样:
create trigger dbo.trigger_xx_update
on dbo.a
for update
as
begin

if update(fmrpclosed) and exists(select 1 from inserted where fmrpclosed = 1)
begin

update d
set fuse = c.fnote
from inserted a,b,c
where 
d.fplanorderinterid=a.finterid 
and a.forgppointerid=c.finterid 
and c.finterid=b.finterid 
and d.fsourceentryid=c.fentryid


end
go
[/quote] 非常感谢!
LongRui888 2014-01-23
  • 打赏
  • 举报
回复
引用 19 楼 u013545744 的回复:
[quote=引用 18 楼 yupeigu 的回复:] [quote=引用 17 楼 u013545744 的回复:] [quote=引用 16 楼 yupeigu 的回复:] [quote=引用 15 楼 u013545744 的回复:] [quote=引用 14 楼 yupeigu 的回复:] [quote=引用 12 楼 u013545744 的回复:] [quote=引用 11 楼 yupeigu 的回复:] [quote=引用 9 楼 u013545744 的回复:] 可能是我的处理思路有问题,我还是具体说下我的需求。现在有4张表分别为a(finterid,forgppointerid,fmrpclosed),b(finterid),c(finterid,fentryid,fuse),d(fplanorderinterid,fsourceentryid,fnote),其中 d.fplanorderinterid=a.finterid and a.forgppointerid=c.finterid and c.finterid=b.finterid and d.fsourceentryid=c.fentryid 现在做的是:前台操作a表对应单据时,后台会在d表中生成一条记录,随后,a.fmrpclosed=1,在d表生成的记录中需要把c表的fnote带到d表的fuse中。 我现在有两种思路,一种是直接通过c表更新d,一种是通过中间表a关联c表更新d,不晓得那种方法可行,请大家给我指点指点,不胜感激。
就是在插入a表的时候,直接update d表, 也就是第2种方法吧,通过中间表a关联c表更新d[/quote] 不是在插入a时生成d表记录,而是a表对应前台单据有个按钮事件,当事件结束后,有两个结果,一个是把a表fmrpclosed改为1,一个是在d表中产生新的记录。[/quote] 哦,你的意思是,事件结束的时候,触发把c表的fnote带到d表的fuse中[/quote] 是的,具体怎么实现?[/quote] 那事件结束有什么标志吗,或者说事件结束,就会插入数据?[/quote] 可以认为当a.fmrpclosed=1时代表事件结束,然后在更新d表字段。[/quote] 那这个a.fmrpclosed=1 是有一个update操作吗[/quote] 是的。[/quote] 大概就是这样:
create trigger dbo.trigger_xx_update
on dbo.a
for update
as
begin

if update(fmrpclosed) and exists(select 1 from inserted where fmrpclosed = 1)
begin

update d
set fuse = c.fnote
from inserted a,b,c
where 
d.fplanorderinterid=a.finterid 
and a.forgppointerid=c.finterid 
and c.finterid=b.finterid 
and d.fsourceentryid=c.fentryid


end
go
飞扬的雪花 2014-01-23
  • 打赏
  • 举报
回复
引用 18 楼 yupeigu 的回复:
[quote=引用 17 楼 u013545744 的回复:] [quote=引用 16 楼 yupeigu 的回复:] [quote=引用 15 楼 u013545744 的回复:] [quote=引用 14 楼 yupeigu 的回复:] [quote=引用 12 楼 u013545744 的回复:] [quote=引用 11 楼 yupeigu 的回复:] [quote=引用 9 楼 u013545744 的回复:] 可能是我的处理思路有问题,我还是具体说下我的需求。现在有4张表分别为a(finterid,forgppointerid,fmrpclosed),b(finterid),c(finterid,fentryid,fuse),d(fplanorderinterid,fsourceentryid,fnote),其中 d.fplanorderinterid=a.finterid and a.forgppointerid=c.finterid and c.finterid=b.finterid and d.fsourceentryid=c.fentryid 现在做的是:前台操作a表对应单据时,后台会在d表中生成一条记录,随后,a.fmrpclosed=1,在d表生成的记录中需要把c表的fnote带到d表的fuse中。 我现在有两种思路,一种是直接通过c表更新d,一种是通过中间表a关联c表更新d,不晓得那种方法可行,请大家给我指点指点,不胜感激。
就是在插入a表的时候,直接update d表, 也就是第2种方法吧,通过中间表a关联c表更新d[/quote] 不是在插入a时生成d表记录,而是a表对应前台单据有个按钮事件,当事件结束后,有两个结果,一个是把a表fmrpclosed改为1,一个是在d表中产生新的记录。[/quote] 哦,你的意思是,事件结束的时候,触发把c表的fnote带到d表的fuse中[/quote] 是的,具体怎么实现?[/quote] 那事件结束有什么标志吗,或者说事件结束,就会插入数据?[/quote] 可以认为当a.fmrpclosed=1时代表事件结束,然后在更新d表字段。[/quote] 那这个a.fmrpclosed=1 是有一个update操作吗[/quote] 是的。
LongRui888 2014-01-23
  • 打赏
  • 举报
回复
引用 17 楼 u013545744 的回复:
[quote=引用 16 楼 yupeigu 的回复:] [quote=引用 15 楼 u013545744 的回复:] [quote=引用 14 楼 yupeigu 的回复:] [quote=引用 12 楼 u013545744 的回复:] [quote=引用 11 楼 yupeigu 的回复:] [quote=引用 9 楼 u013545744 的回复:] 可能是我的处理思路有问题,我还是具体说下我的需求。现在有4张表分别为a(finterid,forgppointerid,fmrpclosed),b(finterid),c(finterid,fentryid,fuse),d(fplanorderinterid,fsourceentryid,fnote),其中 d.fplanorderinterid=a.finterid and a.forgppointerid=c.finterid and c.finterid=b.finterid and d.fsourceentryid=c.fentryid 现在做的是:前台操作a表对应单据时,后台会在d表中生成一条记录,随后,a.fmrpclosed=1,在d表生成的记录中需要把c表的fnote带到d表的fuse中。 我现在有两种思路,一种是直接通过c表更新d,一种是通过中间表a关联c表更新d,不晓得那种方法可行,请大家给我指点指点,不胜感激。
就是在插入a表的时候,直接update d表, 也就是第2种方法吧,通过中间表a关联c表更新d[/quote] 不是在插入a时生成d表记录,而是a表对应前台单据有个按钮事件,当事件结束后,有两个结果,一个是把a表fmrpclosed改为1,一个是在d表中产生新的记录。[/quote] 哦,你的意思是,事件结束的时候,触发把c表的fnote带到d表的fuse中[/quote] 是的,具体怎么实现?[/quote] 那事件结束有什么标志吗,或者说事件结束,就会插入数据?[/quote] 可以认为当a.fmrpclosed=1时代表事件结束,然后在更新d表字段。[/quote] 那这个a.fmrpclosed=1 是有一个update操作吗
飞扬的雪花 2014-01-23
  • 打赏
  • 举报
回复
引用 16 楼 yupeigu 的回复:
[quote=引用 15 楼 u013545744 的回复:] [quote=引用 14 楼 yupeigu 的回复:] [quote=引用 12 楼 u013545744 的回复:] [quote=引用 11 楼 yupeigu 的回复:] [quote=引用 9 楼 u013545744 的回复:] 可能是我的处理思路有问题,我还是具体说下我的需求。现在有4张表分别为a(finterid,forgppointerid,fmrpclosed),b(finterid),c(finterid,fentryid,fuse),d(fplanorderinterid,fsourceentryid,fnote),其中 d.fplanorderinterid=a.finterid and a.forgppointerid=c.finterid and c.finterid=b.finterid and d.fsourceentryid=c.fentryid 现在做的是:前台操作a表对应单据时,后台会在d表中生成一条记录,随后,a.fmrpclosed=1,在d表生成的记录中需要把c表的fnote带到d表的fuse中。 我现在有两种思路,一种是直接通过c表更新d,一种是通过中间表a关联c表更新d,不晓得那种方法可行,请大家给我指点指点,不胜感激。
就是在插入a表的时候,直接update d表, 也就是第2种方法吧,通过中间表a关联c表更新d[/quote] 不是在插入a时生成d表记录,而是a表对应前台单据有个按钮事件,当事件结束后,有两个结果,一个是把a表fmrpclosed改为1,一个是在d表中产生新的记录。[/quote] 哦,你的意思是,事件结束的时候,触发把c表的fnote带到d表的fuse中[/quote] 是的,具体怎么实现?[/quote] 那事件结束有什么标志吗,或者说事件结束,就会插入数据?[/quote] 可以认为当a.fmrpclosed=1时代表事件结束,然后在更新d表字段。
LongRui888 2014-01-23
  • 打赏
  • 举报
回复
引用 15 楼 u013545744 的回复:
[quote=引用 14 楼 yupeigu 的回复:] [quote=引用 12 楼 u013545744 的回复:] [quote=引用 11 楼 yupeigu 的回复:] [quote=引用 9 楼 u013545744 的回复:] 可能是我的处理思路有问题,我还是具体说下我的需求。现在有4张表分别为a(finterid,forgppointerid,fmrpclosed),b(finterid),c(finterid,fentryid,fuse),d(fplanorderinterid,fsourceentryid,fnote),其中 d.fplanorderinterid=a.finterid and a.forgppointerid=c.finterid and c.finterid=b.finterid and d.fsourceentryid=c.fentryid 现在做的是:前台操作a表对应单据时,后台会在d表中生成一条记录,随后,a.fmrpclosed=1,在d表生成的记录中需要把c表的fnote带到d表的fuse中。 我现在有两种思路,一种是直接通过c表更新d,一种是通过中间表a关联c表更新d,不晓得那种方法可行,请大家给我指点指点,不胜感激。
就是在插入a表的时候,直接update d表, 也就是第2种方法吧,通过中间表a关联c表更新d[/quote] 不是在插入a时生成d表记录,而是a表对应前台单据有个按钮事件,当事件结束后,有两个结果,一个是把a表fmrpclosed改为1,一个是在d表中产生新的记录。[/quote] 哦,你的意思是,事件结束的时候,触发把c表的fnote带到d表的fuse中[/quote] 是的,具体怎么实现?[/quote] 那事件结束有什么标志吗,或者说事件结束,就会插入数据?
飞扬的雪花 2014-01-23
  • 打赏
  • 举报
回复
引用 14 楼 yupeigu 的回复:
[quote=引用 12 楼 u013545744 的回复:] [quote=引用 11 楼 yupeigu 的回复:] [quote=引用 9 楼 u013545744 的回复:] 可能是我的处理思路有问题,我还是具体说下我的需求。现在有4张表分别为a(finterid,forgppointerid,fmrpclosed),b(finterid),c(finterid,fentryid,fuse),d(fplanorderinterid,fsourceentryid,fnote),其中 d.fplanorderinterid=a.finterid and a.forgppointerid=c.finterid and c.finterid=b.finterid and d.fsourceentryid=c.fentryid 现在做的是:前台操作a表对应单据时,后台会在d表中生成一条记录,随后,a.fmrpclosed=1,在d表生成的记录中需要把c表的fnote带到d表的fuse中。 我现在有两种思路,一种是直接通过c表更新d,一种是通过中间表a关联c表更新d,不晓得那种方法可行,请大家给我指点指点,不胜感激。
就是在插入a表的时候,直接update d表, 也就是第2种方法吧,通过中间表a关联c表更新d[/quote] 不是在插入a时生成d表记录,而是a表对应前台单据有个按钮事件,当事件结束后,有两个结果,一个是把a表fmrpclosed改为1,一个是在d表中产生新的记录。[/quote] 哦,你的意思是,事件结束的时候,触发把c表的fnote带到d表的fuse中[/quote] 是的,具体怎么实现?
LongRui888 2014-01-23
  • 打赏
  • 举报
回复
引用 12 楼 u013545744 的回复:
[quote=引用 11 楼 yupeigu 的回复:] [quote=引用 9 楼 u013545744 的回复:] 可能是我的处理思路有问题,我还是具体说下我的需求。现在有4张表分别为a(finterid,forgppointerid,fmrpclosed),b(finterid),c(finterid,fentryid,fuse),d(fplanorderinterid,fsourceentryid,fnote),其中 d.fplanorderinterid=a.finterid and a.forgppointerid=c.finterid and c.finterid=b.finterid and d.fsourceentryid=c.fentryid 现在做的是:前台操作a表对应单据时,后台会在d表中生成一条记录,随后,a.fmrpclosed=1,在d表生成的记录中需要把c表的fnote带到d表的fuse中。 我现在有两种思路,一种是直接通过c表更新d,一种是通过中间表a关联c表更新d,不晓得那种方法可行,请大家给我指点指点,不胜感激。
就是在插入a表的时候,直接update d表, 也就是第2种方法吧,通过中间表a关联c表更新d[/quote] 不是在插入a时生成d表记录,而是a表对应前台单据有个按钮事件,当事件结束后,有两个结果,一个是把a表fmrpclosed改为1,一个是在d表中产生新的记录。[/quote] 哦,你的意思是,事件结束的时候,触发把c表的fnote带到d表的fuse中
發糞塗牆 2014-01-23
  • 打赏
  • 举报
回复
这种东西最好不要等待前端响应,不然会造成很多问题
飞扬的雪花 2014-01-23
  • 打赏
  • 举报
回复
引用 11 楼 yupeigu 的回复:
[quote=引用 9 楼 u013545744 的回复:] 可能是我的处理思路有问题,我还是具体说下我的需求。现在有4张表分别为a(finterid,forgppointerid,fmrpclosed),b(finterid),c(finterid,fentryid,fuse),d(fplanorderinterid,fsourceentryid,fnote),其中 d.fplanorderinterid=a.finterid and a.forgppointerid=c.finterid and c.finterid=b.finterid and d.fsourceentryid=c.fentryid 现在做的是:前台操作a表对应单据时,后台会在d表中生成一条记录,随后,a.fmrpclosed=1,在d表生成的记录中需要把c表的fnote带到d表的fuse中。 我现在有两种思路,一种是直接通过c表更新d,一种是通过中间表a关联c表更新d,不晓得那种方法可行,请大家给我指点指点,不胜感激。
就是在插入a表的时候,直接update d表, 也就是第2种方法吧,通过中间表a关联c表更新d[/quote] 不是在插入a时生成d表记录,而是a表对应前台单据有个按钮事件,当事件结束后,有两个结果,一个是把a表fmrpclosed改为1,一个是在d表中产生新的记录。
LongRui888 2014-01-23
  • 打赏
  • 举报
回复
引用 9 楼 u013545744 的回复:
可能是我的处理思路有问题,我还是具体说下我的需求。现在有4张表分别为a(finterid,forgppointerid,fmrpclosed),b(finterid),c(finterid,fentryid,fuse),d(fplanorderinterid,fsourceentryid,fnote),其中 d.fplanorderinterid=a.finterid and a.forgppointerid=c.finterid and c.finterid=b.finterid and d.fsourceentryid=c.fentryid 现在做的是:前台操作a表对应单据时,后台会在d表中生成一条记录,随后,a.fmrpclosed=1,在d表生成的记录中需要把c表的fnote带到d表的fuse中。 我现在有两种思路,一种是直接通过c表更新d,一种是通过中间表a关联c表更新d,不晓得那种方法可行,请大家给我指点指点,不胜感激。
就是在插入a表的时候,直接update d表, 也就是第2种方法吧,通过中间表a关联c表更新d
發糞塗牆 2014-01-23
  • 打赏
  • 举报
回复
可以直接的就直接
飞扬的雪花 2014-01-23
  • 打赏
  • 举报
回复
可能是我的处理思路有问题,我还是具体说下我的需求。现在有4张表分别为a(finterid,forgppointerid,fmrpclosed),b(finterid),c(finterid,fentryid,fuse),d(fplanorderinterid,fsourceentryid,fnote),其中 d.fplanorderinterid=a.finterid and a.forgppointerid=c.finterid and c.finterid=b.finterid and d.fsourceentryid=c.fentryid 现在做的是:前台操作a表对应单据时,后台会在d表中生成一条记录,随后,a.fmrpclosed=1,在d表生成的记录中需要把c表的fnote带到d表的fuse中。 我现在有两种思路,一种是直接通过c表更新d,一种是通过中间表a关联c表更新d,不晓得那种方法可行,请大家给我指点指点,不胜感激。
LongRui888 2014-01-23
  • 打赏
  • 举报
回复
引用 6 楼 u013545744 的回复:
我已经实现了更新,就是不知道怎么写触发事件。要说表结构,比较复杂,其实关联的不止2张表,而是6张表。我现在是这么做的: create trigger update_note on 表2 for insert as 判断表2是否有数据插入(不知道怎么用语句判断) 如果有数据插入,执行更新语句(该更新语句我已完成) 如果没有数据插入,就不执行更新。
这个不用语句来判断,因为触发器就可以实现你的需求,当有数据插入的时候,就会自动调用触发器, 直接update就可以:

--drop table t1,t2
--go

CREATE TABLE t1(id INT ,NAME VARCHAR(10))
CREATE TABLE t2(id INT ,NAME VARCHAR(10),xx varchar(10))

INSERT INTO t1
VALUES(1,'a')
go


CREATE TRIGGER dbo.trigger_t2_insert 
ON t2 
for INSERT
AS 
BEGIN
    --用表t1的数据,更新表t2的数据
	UPDATE t2
	SET xx = t1.NAME
    FROM INSERTED a
    inner join t1
            on t1.id = a.id 
	WHERE t2.id = a.id 
END
go


--插入t2表,xx字段会自动更新成t1表的字段
INSERT INTO t2 (id,name)
VALUES(1,'a')

SELECT * FROM t2

/*
id	NAME	xx
1	a	a
*/
發糞塗牆 2014-01-23
  • 打赏
  • 举报
回复
那就要加if /else ,比如: if (select count(1)from 表2) is null --没数据 begin return end else begin update 语句 end
飞扬的雪花 2014-01-23
  • 打赏
  • 举报
回复
我已经实现了更新,就是不知道怎么写触发事件。要说表结构,比较复杂,其实关联的不止2张表,而是6张表。我现在是这么做的: create trigger update_note on 表2 for insert as 判断表2是否有数据插入(不知道怎么用语句判断) 如果有数据插入,执行更新语句(该更新语句我已完成) 如果没有数据插入,就不执行更新。
LongRui888 2014-01-23
  • 打赏
  • 举报
回复
当你有数据插入到t2表时,字段会用t1表的name字段值,来更新t2表中的xx字段。
LongRui888 2014-01-23
  • 打赏
  • 举报
回复
试试这个:

--drop table t1,t2
--go

CREATE TABLE t1(id INT ,NAME VARCHAR(10))
CREATE TABLE t2(id INT ,NAME VARCHAR(10),xx varchar(10))

INSERT INTO t1
VALUES(1,'a')
go


CREATE TRIGGER dbo.trigger_t2_insert 
ON t2 
for INSERT
AS 
BEGIN
    --用表t1的数据,更新表t2的数据
	UPDATE t2
	SET xx = t1.NAME
    FROM INSERTED a
    inner join t1
            on t1.id = a.id 
	WHERE t2.id = a.id 
END
go


--插入t2表,xx字段会自动更新成t1表的字段
INSERT INTO t2 (id,name)
VALUES(1,'a')

SELECT * FROM t2

/*
id	NAME	xx
1	a	a
*/
發糞塗牆 2014-01-23
  • 打赏
  • 举报
回复
我先在t2插入一个数据,用来测试是否update成功,然后创建一个触发器,然后在t1插入一个name=‘b’的数据,再检查t2,数据已经update成功
發糞塗牆 2014-01-23
  • 打赏
  • 举报
回复
大概这样
CREATE TABLE t1(id INT IDENTITY(1,1),NAME VARCHAR(10))
CREATE TABLE t2(id INT ,NAME VARCHAR(10))

INSERT INTO t2
VALUES(1,'a')
go
CREATE TRIGGER test ON t1 AFTER INSERT
AS 
BEGIN
	UPDATE t2
	SET t2.NAME=a.NAME
    FROM INSERTED a
	WHERE a.id=@@IDENTITY
END


INSERT INTO t1 (name)
VALUES('b')
SELECT * FROM t2

/*
id          NAME
----------- ----------
1           b
*/
加载更多回复(1)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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