日期:2014-05-17  浏览次数:20397 次

关联的表在delete触发器中怎么互相取值?
大概是这样一个需求:

有两个关联的表,外键级联删除。当主表删除某记录时,我需要在delete触发器中同时取到主表删除记录的某列的值和外键关联表删除记录的某列的值。

但是,经过反复试验,无论把这个触发器创建在主表上,还是关联表上,它们都只能在 deleted 中取到自己被删除的值,而无法通过表本身取到对方的值(记录不存在)。

请问,有没有什么办法,可以同时取到两个表中被删除记录的值? 实在是没有思路啊,能指点指点么,拜托拜托

------解决方案--------------------
有没有什么办法,可以同时取到两个表中被删除记录的值? 实在是没有思路啊,能指点指点么
--->使用存储 过程吧


create proc proc_del
@Key varchar(50)
as
set nocount on 
declare @mainID int ,@fkeyID int

--先查询
select @mainID=ID from  主表 where 主键=@Key
select ID as fkeyID
into #temp
from 外键表
where fkey=@mainID

--再删除
delete from 外键表 where fkey=@mainID
delete from  主表 where 主键=@Key

select @mainID 
select * from #temp

go
 
------解决方案--------------------
我做了一个实验,通过2005版本及以后版本提供的output子句,来保存删除的记录,你看看是不是这样:




--创建主表
create table t1(id int primary key,v varchar(10))

--创建附表,级联删除
create table t2
(
idd int,
id int foreign key references t1(id) on delete cascade,
vv varchar(20)
)

insert into t1
select 1,'a' union all
select 2,'b' 

insert into t2
select 1,1,'www' union all
select 1,2,'csdn'


--创建存储删除的t1表的字段
create table temp_t1_delete(id int,v varchar(10))

--创建存储删除的t2表的字段
create table temp_t2_delete(id int,vv varchar(20))  
go

--创建表t2的delete触发器
create trigger dbo.trigger_t2_delete 
on dbo.t2
for delete
as
begin
   insert into temp_t2_delete(id,vv)
   select id,vv
   from deleted
end
go


--删除主表记录,自动把删除的主表记录,保存在temp_t1_deletei表中  
delete from t1  
output deleted.id,            --引用所有字段deleted.*  
       deleted.v into temp_t1_delete
where id = 1 



--查询已删除的记录
select *
from temp_t1_delete t1
left join temp_t2_delete t2
       on t1.id = t2.id
/*
id v id vv
1 a 1 www
*/