| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 548 人关注过本帖
标题:请教一个join问题
只看楼主 加入收藏
arook
Rank: 1
等 级:新手上路
帖 子:45
专家分:7
注 册:2010-10-21
结帖率:94.12%
收藏
已结贴  问题点数:20 回复次数:3 
请教一个join问题
CREATE trigger show_supplier  
on [dbo].[ICMrpResult]
for insert,update,delete
as set nocount on
update T
set T.fheadselfJ0544=W.fname
from icmrpresult T
join inserted I on         T.fitemid=I.fitemid
join t_ICItemBase X on   X.fitemid=T.fitemid
join t_supplier W      on     X.fsource=W.fitemid

倒数第三行的join inserted I on         T.fitemid=I.fitemid
请问在数据库中没有inserted 这个表,为什么他要关联它呢?
搜索更多相关主题的帖子: join 
2010-11-08 09:45
tangyunzhong
Rank: 5Rank: 5
来 自:广西
等 级:职业侠客
威 望:4
帖 子:97
专家分:364
注 册:2010-7-28
收藏
得分:5 
回复 楼主 arook
这里是用到删除的临时表,你看一下帮助吧!摘部分给你看

inserted 和 deleted 表主要用于触发器中:

扩展表间引用完整性。


在以视图为基础的基表中插入或更新数据。


检查错误并基于错误采取行动。


找到数据修改前后表状态的差异,并基于此差异采取行动。
Deleted 表用于存储 DELETE 和 UPDATE 语句所影响的行的复本。在执行 DELETE 或 UPDATE 语句时,行从触发器表中删除,并传输到 deleted 表中。Deleted 表和触发器表通常没有相同的行。

Inserted 表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 inserted 表和触发器表中。Inserted 表中的行是触发器表中新行的副本。

...
2010-11-08 09:51
arook
Rank: 1
等 级:新手上路
帖 子:45
专家分:7
注 册:2010-10-21
收藏
得分:0 
回复 2楼 tangyunzhong
版主,我还不怎么明白,能不能说的通俗一点?
insertde在什么情况下才要用到?它的主要作用是什么?

[ 本帖最后由 arook 于 2010-11-8 11:00 编辑 ]

业精于勤
2010-11-08 10:59
jalonlovesja
Rank: 5Rank: 5
来 自:湖南邵阳
等 级:职业侠客
帖 子:292
专家分:371
注 册:2008-2-19
收藏
得分:15 
SQL2000中,inserted表和deleted表用于存放对表中数据行的修改信息。他们是触发器执行时自动创建的,放在内存中,是临时表。当触发器工作完成,它们也被删除。它们是只读表,不能向它们写入内容。


inserted表:用来存储INSERT和UPDATE语句所影响的行的副本。意思就是在inserted表中临时保存了被插入或被更新后的记录行。在执行 INSERT 或UPDATE 语句时,新加行被同时添加到inserted表和触发器表中。因此,可以从inserted表检查插入的数据是否满足需求,如不满足则回滚撤消操(cāo)作。


deleted表:用来存储DELETE和UPDATE语句所影响行的副本。意思是在delete表中临时保存了被删除或被更新前的记录行。在执行 DELETE 或 UPDATE 语句时,行从触发器表中删除,并传到deleted表中。所以可以从deleted表中检查删除的数据行是否能删除。


所以当表中某条记录的某项值发生变化时,变化前的值已经通过系统自动创建的临时表deleted表和inserted表保存了被删除行或插入的记录行的副本。我们可以从这两个表中查询出变化前的值并赋给变量。

我给你个表对应一下这两临时表的功能:

修改操作 inserted表 deleted表
增加(INSERT)记录时 存放新增的记录 不记录
删除(DELETE)时 不记录 存放被删除的记录
修改(UPDATE)时 存放用来更新的记录 存放更新前的记录

更新前的值可以从deleted表中查询出来,直接:select * from deleted
“*”可以换成你要查询的列名。
例如:我给个数据备份的,表table2用来做备份表,前提是表table1中有数据被删除。
/*---检查是否存在触发器---*/
if exists(select name from sysobjects where name = tri_delete)
drop trigger tri_delete
go
/*--在表table2上创建delete触发器---*/
create trigger tri_delete on table2
for delete
as
print '开始数据备份.....'
if not exists(select * from sysobjects where name = 'table1')
select * into table1 from deleted---从deleted表中获取被删除的数据
else
insert into table1 select * from deleted
print '备份成功,备份表中数据为:'
select * from table1
go
/*---测试触发器:删除数据---*/
SET NOCOUNT ON ---不显示T—SQL语句影响的行数
delete table2
---查看结果
select * from table2

delete触发器的典型应用是数据备份;update触发器主要用来跟踪数据的变化;下面这个就是把变化前后的项的值写入table2的例子,这个例子我假设了2个表table1,table2各有3列,都是Uid,Uname,sex且全部允许为空:结果是表2得到更改项前后变化值。
if exists(select name from sysobjects where name = 'tri_test')
drop trigger tri_test
go

create trigger tri_test on table1
for update
as
declare @beforesex varchar(8),@aftersex varchar(8)
select @beforesex = sex from deleted ---变更前的数据
select @aftersex = sex from inserted ---变更后的数据
if update(sex)
begin
---把改变前后的值写入table2中
insert into table2 (sex) values (@beforesex)
insert into table2 (sex) values (@aftersex)
end
go

小弟,身高1.60米,农村户口,小学文化,家有农田1亩.
2010-11-09 09:07
快速回复:请教一个join问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033536 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved