Inquiridor
Problema constrain no sql 2008

Discussão Geral
-
Boa tarde
galera estou com o seguinte problema tenhum uma tabela de noticias e a tabela home
segue abaixo estrutura das tabelas
---
tabela home
[dbo].[RES_HOME](
[COD][int]IDENTITY(1,1) NOT NULL,
[COD_HOME_FS][int] NULL,
[TXT_TITLE_FS] [nvarchar](150) NULL,
[TXT_CONTENT_FS][text] NULL,
[COD_HOME_SD][int] NULL,
[TXT_TITLE_SD] [nvarchar](150) NULL,
[TXT_CONTENT_SD] [text] NULL,
[COD_HOME_TD][int] NULL,
[TXT_TITLE_TD] [nvarchar](150) NULL,
[TXT_CONTENT_TD][text] NULL,
[ATIVO] [bit] NULL,
[CODIDIOMA] [int] NULL,
[BANNER] [varchar](150)NULL,
--
tabela noticia
[dbo].[RES_HOME](
[COD] [int] IDENTITY(1,1) NOT NULL,
[COD_HOME_FS] [int] NULL,
[TXT_TITLE_FS] [nvarchar](150) NULL,
[TXT_CONTENT_FS] [text] NULL,
[COD_HOME_SD] [int] NULL,
[TXT_TITLE_SD] [nvarchar](150) NULL,
[TXT_CONTENT_SD] [text]NULL,
[COD_HOME_TD][int] NULL,
[TXT_TITLE_TD] [nvarchar](150) NULL,
[TXT_CONTENT_TD][text]NULL,
[ATIVO][bit]NULL,
[CODIDIOMA][int]NULL,
[BANNER][varchar](150)NULL,
os campos da home [COD_HOME_FS] e [COD_HOME_SD] são foreing keys do [COD] da tabela noticia
preciso fazer uma constraint com o delete cascade para quando deletar um linha da tabela noticia deletar tbm da tabela home mas não estou conseguindo criar nas duas foreing key crio na primeira e na segunda da erro segue abaixo a forma que estou tentando criar essas constraint
alter table RES_HOME ADD CONSTRAINT DELETE_TBM FOREIGN KEY (COD_HOME_FS)REFERENCES RES_NOTICIA (COD)ON DELETE CASCADE;
alter table RES_HOME ADD CONSTRAINT DELETE_TBM2 FOREIGN KEY (COD_HOME_SD) REFERENCES RES_NOTICIA (COD)ON DELETE CASCADE;
ele executa a 1º linha mas na segunda exibi o seguinte erro
Introducing FOREIGN KEY constraint 'DELETE_TBM2' on table 'RES_HOME' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Pelo que eu entendi não posso colocar 2 constrain com a mesma ação em uma unica tabela
porem no sql server 2008 (versão que o cliente esta utilizando) quando tenta excluir um registro da tabela noticia e esta ligado com a home pelo campo COD_HOME_SD ele da erro informando que não foi possivel excluir pois existe um dependente deste registro
não sei o que fazer ja tentei de varias formas resolver o problema mas ainda não achei uma solução
quinta-feira, 4 de novembro de 2010 17:09
Todas as Respostas
-
Paulo,
Particularmente eu prefiro usar SEM o DELETE CASCADE. Faço pelo simples motivo: E se eu estiver deletando um registro errado? Não tem como voltar. Sem esta restrição, pelo menos eu vou ter que fazer o DELETE em cada tabela, garantindo a informação.
Pela estrutura da criação das constraints identifiquei que a tabela "pai" é a RES_NOTICIA, ou seja, não posso deletar um registro dela sem antes deletar o registro equivalente na RES_HOME.
Se vc está fazendo isso via aplicação, altere o código para deletar primeiro da RES_HOME. Se o SQL permitir isso é como se tivessemos, analogicamente falando, um filho sem pai...
Att.,
Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.quinta-feira, 4 de novembro de 2010 19:15 -
Paulo,
Mas o que você necessita realmente fazer?
A integridade referêncial é um conceito muito importante quando falamos em normalização e modelagem de banco de dados.
Você realmente necessita excluir o registro pai e manter o registro filho?
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]sábado, 6 de novembro de 2010 15:27Moderador -
Na verda eu necessito excluir o registro filho tbm porem não estou com acesso ao codigo fonte da aplicação no momento
e quando tento exluir o pai caso o filho esteja na coluna COD_HOME_SD que seria a minha segunda constrain ele da um erro informando que existe um registro dependente
quarta-feira, 10 de novembro de 2010 15:25 -
Paulo, Na verdade isso não é um problema, mas sim uma condição imposta de integridade referencial existente em suas dados, pois somente poderá existir registros filhos se existirem os registros pais. Você tem acesso ao banco de dados e suas tabelas? Poderíamos tentar identificar a dependência entre estas tabelas, com isso, ficaria mais fácil saber qual table você deveria excluir primeiro o registro, neste caso, seria o registro filho.
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]quinta-feira, 11 de novembro de 2010 12:24Moderador -
Então Paulo....VC informa que está tentando excluir o pai, isso vai dar erro. Vc só pode excluir o registro pai se não houver mais nenhum dependente. Por isso o erro emitido pelo SQL.
Tente rastrear a quais registros os filhos estão ligados e faça a exclusão dos mesmos para depois fazer a exclusão do pai.
Att.,
Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.quinta-feira, 11 de novembro de 2010 12:27 -
Marco,
Perfeito, integridade referencial tanto em processos de atualização como também em exclusão de valores.
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]quinta-feira, 11 de novembro de 2010 13:08Moderador -
Paulo,
Apenas complementando, se vc tiver dúvidas sobre como rastrear, use o comando SP_HELP [TABELA]. Lá vc encontrará as chaves existentes em outras tabelas envolvidas no relacionamento, facilitando a analise.
Att.,
Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.quinta-feira, 11 de novembro de 2010 13:18 -
Paulo,
Também é possível utilizar o SQL Profiler e o Activity Monitor para monitorar suas transações em tempo real, bem com, a sys.sysdepends ou sp_depends.
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]quinta-feira, 11 de novembro de 2010 13:33Moderador