locked
Problema constrain no sql 2008 RRS feed

  • 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:27
    Moderador
  • 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:24
    Moderador
  • 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:08
    Moderador
  • 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:33
    Moderador