Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

felipe maricato moura

[DICA] criando um delete cascade em multiplos campos na mesma tabela

Recommended Posts

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. <_<

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que pude perceber, ao meu ponto de vista é o correto, só não sei se em um ambiente com muitos registros isso nao iria dar um impacto negativo na aplicação.

Algumas vezes em minha aplicação o "on delete cascade" nao foi muito feliz e tive que fazer manualmente (tirar a fk, deletar os registros, inserir novamente a fk)

A sua dica é um ótimo exemplo do uso do "delete cascade", mas use com moderação.

 

abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.