[DICA] criando um delete cascade em multiplos campos na mesma tabela
Eu fiz desta forma e deu certo estou postando aqui para discutir.
Suponhamos que se tenha uma tabela de pessoas e uma tabela que associa pessoas da mesma tabela de pessoas
esta tabela que associa tem dois ids o id e o id_associado que são ids da mesma tabela de pessoas o problema e gerar a deleção cascade pelo seginte fato
tabela teste: registros (pessoas)
id, nome
1,nome 1
2,nome 2
3, nome 3
4, nome 4
tabela teste2: registros (associacao entre pessoas)
id, id_associacao
1,2
2,3
4,1
o ondeletecascade esta entre os id da tabela teste e o id da tabela teste2 não podemos fazer um ondeletecascade também entre o id da tabela teste para o id_associado da tabela teste2 por que poude causar recursividade.
a solução foi a seguinte
criando as tabelas
>
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[teste](
[id] [int] IDENTITY(1,1) NOT NULL,
[nome] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
CONSTRAINT [PK_teste] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
USE [macon]
GO
/**** Object: Table [dbo].[teste2] Script Date: 02/01/2008 18:13:41 ****/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[teste2](
[id] [int] NULL,
[id_associado] [int] NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[teste2] WITH CHECK ADD CONSTRAINT [FK_teste2_teste] FOREIGN KEY([id])
REFERENCES [dbo].[teste] ([id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[teste2] CHECK CONSTRAINT [FK_teste2_teste]
criando os inserts de exemplo
>
insert into teste (nome) values ('nome1');
insert into teste (nome) values ('nome2');
insert into teste (nome) values ('nome3');
insert into teste (nome) values ('nome3');
insert into teste2 (id,id_associado) values (1,2)
insert into teste2 (id,id_associado) values (1,3)
insert into teste2 (id,id_associado) values (3,2)
insert into teste2 (id,id_associado) values (3,4)
insert into teste2 (id,id_associado) values (2,4)
insert into teste2 (id,id_associado) values (4,1)
insert into teste2 (id,id_associado) values (2,1)
insert into teste2 (id,id_associado) values (2,4)
criando a trigger para deletear o id_associado
>
create trigger tb_teste on teste
for delete
AS
--select distinct id from deleted;
delete from teste2 where id_associado IN (select distinct id from deleted)
testando
>
delete teste where id = 1;
delete teste where id = 2;
Quem tiver um ideia melhor por favor post to achando essa solução meio POG. <_<
Discussão (1)
Carregando comentários...