删除一条数据,触发更新多条数据时出错!

ingernew 2003-06-27 09:59:50
CREATE TRIGGER ONmrDepDelete ON [dbo].[mrDep]
FOR DELETE
AS

update mrDep set HiDepID=aa.DepID from deleted aa where aa.DepID=mrDep.HiDepID


发生了:(
操作失败!子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。
语句已终止。
...全文
83 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2003-06-27
  • 打赏
  • 举报
回复
--创建测试环境
CREATE TABLE [mrDep] (
[DepID] [smallint] IDENTITY (1, 1) NOT NULL ,
[HiDepID] [smallint] NULL CONSTRAINT [DF_mrDep_HiDepID] DEFAULT (0),
[Name] [varchar] (32) COLLATE Chinese_PRC_CI_AS NOT NULL)

insert into mrdep(name) values('第1个')
insert into mrdep(HiDepID,name) values(1,'第1-1个')
insert into mrdep(HiDepID,name) values(1,'第1-2个')
insert into mrdep(HiDepID,name) values(1,'第1-3个')

insert into mrdep(HiDepID,name) values(2,'第1-1-1个')
insert into mrdep(HiDepID,name) values(2,'第1-1-2个')
insert into mrdep(HiDepID,name) values(2,'第1-1-3个')

go

--创建删除触发器
CREATE TRIGGER ONmrDepDelete ON [dbo].[mrDep]
FOR DELETE
AS

update mrDep set HiDepID=aa.HiDepID
from mrdep,deleted aa where aa.DepID=mrDep.HiDepID

go

--创建更新触发器
CREATE TRIGGER onMrDepUpdate ON dbo.mrDep
FOR UPDATE
AS
declare @oldid smallint,@newid smallint
--declare #aa cursor for
select id=identity(int,1,1),cast(DepID as smallint) as DepID into #temp1 from inserted
select id=identity(int,1,1),cast(DepID as smallint) as DepID into #temp2 from deleted

select a.depid as ndepid,b.depid as odepid
into #temp
from #temp1 a,#temp2 b
where a.id=b.id
drop table #temp1,#temp2

Update mrDep set HiDepID=b.nDepID
from mrDep a,#temp b
where a.HiDepID=b.odepid
drop table #temp

go

--显示当前数据
select * from mrdep

--删除
delete from mrdep where depid=2

--查看删除后的结果
select * from mrdep

--删除测试环境
drop table mrdep
zjcxc 2003-06-27
  • 打赏
  • 举报
回复
应该是这样修改的.
CREATE TRIGGER onMrDepUpdate ON dbo.mrDep
FOR UPDATE
AS
declare @oldid smallint,@newid smallint
--declare #aa cursor for
select id=identity(int,1,1),cast(DepID as smallint) as DepID into #temp1 from inserted
select id=identity(int,1,1),cast(DepID as smallint) as DepID into #temp2 from deleted

select a.depid as ndepid,b.depid as odepid
into #temp
from #temp1 a,#temp2 b
where a.id=b.id
drop table #temp1,#temp2

Update mrDep set HiDepID=b.nDepID
from mrDep a,#temp b
where a.HiDepID=b.odepid
drop table #temp
ingernew 2003-06-27
  • 打赏
  • 举报
回复
很晚了,明天再来结贴了,谢谢 zjcxc(邹建) ,还有 pengdali(大力 V2.0) tj_dns(愉快的登山者),也忙了一天了,各位早点休息吧!!
ingernew 2003-06-27
  • 打赏
  • 举报
回复
我想起来了,我当时想到(DepID)主键发生更改后,相应的是他的下级部门也发生更改
ingernew 2003-06-27
  • 打赏
  • 举报
回复
麻烦了,一下子我还忘记是干嘛的了,我想想
zjcxc 2003-06-27
  • 打赏
  • 举报
回复
因为删除触有更新,所以会触发这个更新触发器.
你这个触发器的作用是什么?
zjcxc 2003-06-27
  • 打赏
  • 举报
回复
测试过,是这个影响
另外我这个表中还有一个触发器为:
CREATE TRIGGER onMrDepUpdate ON dbo.mrDep
FOR UPDATE
AS
Update mrDep set HiDepID=inserted.DepID from inserted where mrDep.HiDepID=(select DepID from deleted)
ingernew 2003-06-27
  • 打赏
  • 举报
回复
我也测试了你的正确了,发生错误的语句是这样的:
CREATE TRIGGER ONmrDepDelete ON [dbo].[mrDep]
FOR DELETE
AS


update mrDep set HiDepID=aa.HiDepID
from mrdep,deleted aa where aa.DepID=mrDep.HiDepID

操作失败!子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。
语句已终止。

另外我这个表中还有一个触发器为:
CREATE TRIGGER onMrDepUpdate ON dbo.mrDep
FOR UPDATE
AS
Update mrDep set HiDepID=inserted.DepID from inserted where mrDep.HiDepID=(select DepID from deleted)

应该不会影响吧???











zjcxc 2003-06-27
  • 打赏
  • 举报
回复
不是吧,我的电脑上测试是可以的啊.
执行删除前的内容
DepID HiDepID Name
------ ------- --------------------------------
1 0 第1个
2 1 第1-1个
3 1 第1-2个
4 1 第1-3个
5 2 第1-1-1个
6 2 第1-1-2个
7 2 第1-1-3个

删除后的结果.depid为 5,6,7的记录,上级编码已经替换为1啦.
DepID HiDepID Name
------ ------- --------------------------------
1 0 第1个
3 1 第1-2个
4 1 第1-3个
5 1 第1-1-1个
6 1 第1-1-2个
7 1 第1-1-3个


你那里错误提示什么?触发器中还有其他内容吗?

ingernew 2003-06-27
  • 打赏
  • 举报
回复
还是不行,是不是有别的问题!!
zjcxc 2003-06-27
  • 打赏
  • 举报
回复
--创建测试环境
CREATE TABLE [mrDep] (
[DepID] [smallint] IDENTITY (1, 1) NOT NULL ,
[HiDepID] [smallint] NULL CONSTRAINT [DF_mrDep_HiDepID] DEFAULT (0),
[Name] [varchar] (32) COLLATE Chinese_PRC_CI_AS NOT NULL)

insert into mrdep(name) values('第1个')
insert into mrdep(HiDepID,name) values(1,'第1-1个')
insert into mrdep(HiDepID,name) values(1,'第1-2个')
insert into mrdep(HiDepID,name) values(1,'第1-3个')

insert into mrdep(HiDepID,name) values(2,'第1-1-1个')
insert into mrdep(HiDepID,name) values(2,'第1-1-2个')
insert into mrdep(HiDepID,name) values(2,'第1-1-3个')

go

--创建删除触发器
CREATE TRIGGER ONmrDepDelete ON [dbo].[mrDep]
FOR DELETE
AS

update mrDep set HiDepID=aa.HiDepID
from mrdep,deleted aa where aa.DepID=mrDep.HiDepID

go

--显示当前数据
select * from mrdep

--删除
delete from mrdep where depid=2

--查看删除后的结果
select * from mrdep

--删除测试环境
drop table mrdep
zjcxc 2003-06-27
  • 打赏
  • 举报
回复
应该是这样的.
CREATE TRIGGER ONmrDepDelete ON [dbo].[mrDep]
FOR DELETE
AS

update mrDep set HiDepID=aa.HiDepID
from mrdep,deleted aa where aa.DepID=mrDep.HiDepID
ingernew 2003-06-27
  • 打赏
  • 举报
回复
我就是用一个表来做部门分级的,其中Layer是代表分级层数
ingernew 2003-06-27
  • 打赏
  • 举报
回复
我一直都在参考老贴和你之前帮我解决的更新的贴,也用了许多方法还是不能解决!!
ingernew 2003-06-27
  • 打赏
  • 举报
回复
CREATE TABLE [mrDep] (
[DepID] [smallint] IDENTITY (1, 1) NOT NULL ,(这是部门ID)
[HiDepID] [smallint] NULL CONSTRAINT [DF_mrDep_HiDepID] DEFAULT (0),(这是上级部门)

[Layer] [tinyint] NOT NULL CONSTRAINT [DF_mrDep_Layer] DEFAULT (0),
[Name] [varchar] (32) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Manager] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[District] [varchar] (32) COLLATE Chinese_PRC_CI_AS NULL ,
[Street] [varchar] (32) COLLATE Chinese_PRC_CI_AS NULL ,
[PostCode] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[Status] [bit] NOT NULL CONSTRAINT [DF_mrDep_Status] DEFAULT (1),
CONSTRAINT [PK_mrDep] PRIMARY KEY CLUSTERED
(
[DepID]
) ON [PRIMARY]
) ON [PRIMARY]
GO

zjcxc 2003-06-27
  • 打赏
  • 举报
回复
看看你的表结构和部门的分级存放方式.
ingernew 2003-06-27
  • 打赏
  • 举报
回复
很高兴又碰到你了
但也还是不行,还是同样的错误!!
zjcxc 2003-06-27
  • 打赏
  • 举报
回复
CREATE TRIGGER ONmrDepDelete ON [dbo].[mrDep]
FOR DELETE
AS

update mrDep set HiDepID=aa.DepID
from mrdep,deleted aa where aa.DepID=mrDep.HiDepID
ingernew 2003-06-27
  • 打赏
  • 举报
回复
如果删除部门下级只有一个部门时触发就可以成功,而如果是一个以上就会出现之前的错误
ingernew 2003-06-27
  • 打赏
  • 举报
回复
还是错的
我的表是一个部门表(mrDep),是无限分级的,当删除一个上级部门(DepID)时和这个表的上级字段(HiDepID)为这个表时就进行更新,更表为删除部门的上一级部门(HiDepID)
加载更多回复(4)

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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