Skip Navigation Links
Novas Tecnologias
Ferramentas Adicionais
Ferramentas Adicionais


Dica No :
302
Assunto : SQL Server
Titulo: Garantindo a integridade de auto-relacionamentos

Gostou do texto ? Vote e dê sua opinião! Pontuação atual :

Translate this page now :






Adicione aos Favoritos!
BlogBlogs Rec6 Linkk Ueba Technorati Delicious DiggIt! StumbleUpon



É comum em modelagem de dados a necessidade de fazer uso de auto-relacionamentos na construção de bancos de dados. Um caso clássico é de uma tabela de funcionários na qual o funcionário precisa se relacionar com seu chefe.

Para que tal relacionamento seja feito a tabela ganha uma chave estrangeira que se relaciona com a chave primária da própria tabela, formando assim um auto-relacionamento.

Em um auto relacionamento, porém, o banco de dados não impede a ocorrência de um círculo no relacionamento. Por exemplo, o banco de dados não impediria que o faxineiro fosse cadastrado como chefe do presidente da empresa.

Para impedir que esse erro de cadastramento ocorra torna-se necessária a utilização de um Trigger para validar o cadastramento dos dados. Supondo uma tabela de exemplo com campos cod e cod2, ambos inteiros, sendo cod uma chave primária e cod2 chave estrangeira vinculada a cod, o trigger abaixo impede a ocorrencia de um círculo no auto-relacionamento da tabela. Esse trigger pode facilmente ser adaptado para outras tabelas, mas ao implementa-lo não deixe de levar em consideração o impacto em performance :



Create trigger trg_testeauto on testeauto for insert,update AS

if update(cod2)
begin
declare @tab TABLE (
codigo int,
cod2 int)

declare @t TABLE
(
codigo int,
cod2 int)

declare @quantos int

insert into @tab select * from inserted
set @quantos=(select count(*) from @tab)

While @quantos>0
Begin
insert into @t select * from testeauto where cod2 in (select codigo from @tab)
if exists(select 1 from @t where codigo in (select codigo from inserted))
begin
raiserror('Alteração inválida - Esta alteração causou um circulo na hierarquia',12,1)
rollback transaction
end
delete @tab
insert into @tab select * from @t
delete @t
set @quantos=(select count(*) from @tab)
end
end




Nome :
E-mail:
Comentarios :
 
 
Os Últimos Comentários
data: 11/27/2017 9:26:00 PM
nome: snWKgJnAyZoO
email: jimosanil0c@hotmail.com
comentário:
tVe7DM http://www.LnAJ7K8QSpfMO2wQ8gO.com

 1  
Dicas
Dica do Dia
Receba Dicas Por Email
E-mail :  
 


 (help)
Aceito receber informativos do devASPNet, informações de eventos e treinamentos

Veja Quais Informativos Você Receberá

Pesquisar Dicas
Pesquisar Artigos, Dicas e Noticias

Banco de Dados
Algumas Entrevistas
Links Importantes

Búfalo Informática, Treinamento e Consultoria
R. Alvaro Alvim, 37/920 Centro - Cinelândia - Rio de Janeiro Cep: 20031-010
Tel : (21) 2262-1368 (21) 9240-5134 E-mail : Contato@bufaloinfo.com.br