导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

触发器中inserted表重复记录覆盖问题

topglorylines 2008-01-03 04:39:38
大家都知道使用触发器时inserted表和deleted表中可以存放多条记录,但是奇怪的是,当我一次性插入多条重复记录时,inserted表会将重复的记录覆盖。我用deleted表做同样的测试,但是不会覆盖。请问这是怎么回事,能如何避免它覆盖?
...全文
229 点赞 收藏 16
写回复
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiuming0306 2008-01-05
没有all的话就是一条一条执行的!那不是覆盖,是每次执行的时候都是新的inserted表
回复
smart_zcg 2008-01-05
smart_zcg :
这位大哥,你知道如何一次性插入多条语句么?你的测试方式是分别插入。。。
要像JL99000 那样测试才行。

————————————————————————————

哥们我的方法怎么会是分别插入呢?
INSERT SUB_NET_TAB SELECT * FROM @TABLE
向SUB_NET_TAB一次插入了四行记录,所影响的行数是4,奇了怪了!
回复
topglorylines 2008-01-05
qiuming0306 :

太感谢了,问题就在
insert into tb
select 1, 'a' union all
select 1, 'a' union all
select 1, 'a'
中的“all”上,我试的时候没有这个关键字,你可以试试,如果不带这个是会覆盖的。
回复
JL99000 2008-01-04
对不起楼主
我的测试是能够显示所有的记录
if object_id('tb') is not null
drop table tb
if object_id('trigger_s') is not null
drop trigger trigger_s
go
create table tb(id int identity(1,1),name_ch varchar(100))
go
create trigger trigger_s on tb
for insert
as
begin
select * from INSERTED
end


insert tb
select 'a'
insert tb
select 'a' union all
select 'a' union all
select 'a'
自己看看吧
回复
qiuming0306 2008-01-04
呵呵,他说用select 插入的!
我只知道用SqlBulkCopy 可以批量插入!用sql我不会呢!
我查询的结果就是inserted表的啊!那不是出现三行一样的了吗!
回复
月下之木 2008-01-04
楼上的 你那根3条insert得用法一样 不叫批量 他的意思是
inserted表中存在两个相同的行
回复
月下之木 2008-01-04
数据库表 出现完全相同的两行 本身就是一个错误 那它做文章本来有很多问题就解决不了
回复
qiuming0306 2008-01-04
楼主看到了吗!没有覆盖的问题!
回复
qiuming0306 2008-01-04


go
create table tb(id int ,name_ch varchar(100))
go


create trigger inserttrigger_s on tb
for insert
as
begin
select * from inserted
end
go
create trigger deltrigger_s on tb
for delete
as
begin
select * from deleted
end

insert into tb
select 1, 'a' union all
select 1, 'a' union all
select 1, 'a'

delete from tb
---结果
id name_ch
----------- ----------------------------------------------------------------------------------------------------
1 a
1 a
1 a

(3 row(s) affected)


(3 row(s) affected)
id name_ch
----------- ----------------------------------------------------------------------------------------------------
1 a
1 a
1 a

(3 row(s) affected)


(3 row(s) affected)



---
回复
topglorylines 2008-01-04
smart_zcg :
这位大哥,你知道如何一次性插入多条语句么?你的测试方式是分别插入。。。
要像JL99000 那样测试才行。

JL99000 :
您的测试方式是对的,但是由于你有标识列,所以插入的数据是不完全一样的,您可以试试将标识列去掉试试。

回复
hui_hui_2007 2008-01-03
关注一下
回复
smart_zcg 2008-01-03
楼主同学,请问你的insert into ...select...批量插入操作成功了吗?

如你所说的事情是不会发生的吧!如果像你说的那样SQL Server还出来混了这么久?


subnet_id subnet_name
------------------------------------ -----------
D7899208-9D4F-4CEE-AA13-ECA326687779 AAA
D7899208-9D4F-4CEE-AA13-ECA326687779 BBB
D7899208-9D4F-4CEE-AA13-ECA326687779 AAA
D7899208-9D4F-4CEE-AA13-ECA326687779 CCC


这是我做得测试结果,触发器中的测试语句为“select * from inserted”,我不知道您老人家的测试是如何进行的?
这种东西本来没有测试的必要的,但是还是如你所说“实践检验真理!”所以我严谨的测试了一把!测试代码如下:


DECLARE @TABLE TABLE(ID_T UNIQUEIDENTIFIER,
V VARCHAR(12))


DECLARE @ID UNIQUEIDENTIFIER

SELECT @ID = NEWID()

INSERT @TABLE VALUES(@ID,'AAA')
INSERT @TABLE VALUES(@ID,'BBB')
INSERT @TABLE VALUES(@ID,'AAA')
INSERT @TABLE VALUES(@ID,'CCC')

SELECT * FROM @TABLE


INSERT SUB_NET_TAB SELECT * FROM @TABLE

触发器代码如下:

CREATE TRIGGER [chk_subnet_add] ON dbo.sub_net_tab
FOR INSERT
AS
SELECT * FROM INSERTED

不知道你的测试是怎么进行的?
回复
topglorylines 2008-01-03
不是吧,你们都没碰到过这个问题?
你们可以自己去试试,就用insert into ...select...去批量插入,然后在触发器里查询inserted表,就会发现,并不是只有一条记录,而是有多条记录,只是如果你插入的记录中有相同的,它会覆盖。
实践检验真理!
回复
arrow_gx 2008-01-03
大家都知道使用触发器时inserted表和deleted表中可以存放多条记录,但是奇怪的是,当我一次性插入多条重复记录时,inserted表会将重复的记录覆盖。我用deleted表做同样的测试,但是不会覆盖。请问这是怎么回事,能如何避免它覆盖?


inserted表 什么叫一次插入多条数据
每次insert 都是一张新inserted表


看你的问题关键是,你删除的时候是批量删除,插入的时候是一条一条插入,每一次插入的 inserted 表都不一样,并不是你说的覆盖了的原因,你如果是用 insert into ... select ... 的方式插入的话,应该不会出现你说的问题的
回复
月下之木 2008-01-03
inserted表 什么叫一次插入多条数据
每次insert 都是一张新inserted表
回复
areswang 2008-01-03
mark,顶
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告