none
Excluir tabela sem precisar excluir foreign key RRS feed

  • Pergunta

  • Pessoal


        Existiria alguma maneira de eu excluir um tabela que tem foreign key com outra tabela, sem precisar excluir esta foreign key, pois logo mais estarei criando novamente está tabela que foi excluida ?

       Tentei desativar todas as  foreign key, mais mesmo desativada ela da a mensagem abaixo de foreign key ?

    exec sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT ALL"


    Não foi possível descartar o objeto 'dbo.nPRODUTO' porque há referência a ele em uma restrição FOREIGN KEY.

    segunda-feira, 4 de agosto de 2014 22:23

Respostas

  • Neibala,

    Então, uma forma seria criar uma nova tabela com os dados e sem qualquer tipo de constraint, fazendo uso do Select Into ou então, migrar os dados para a nova tabela com toda estrutura e constrainst já criadas através do Insert Into....Select.

    Você já pensou me fazer assim?

    Veja se este exemplo ajuda:

    Create Table T1
     (Codigo Int Primary key Identity(1,1),
      Descricao Varchar(10) Default 'Texto....',
      Valor1 Float Default 1.00,
      Valor2 SmallInt Default 10)
    
    Insert Into T1 Default Values
    Go 1000
    
    Select * from T1
    Go
    
    
    -- Exemplo 1 - Select...Into --
    -- Criando uma nova Table com base na Tabela T1 --
    Select Codigo, Descricao, Valor2, Valor1, Soma=(Valor1+Valor2) Into T2 From T1
    Go
    
    Select * from T2
    Go
    
    
    -- Exemplo 2 - Insert Into....Select --
    -- Eliminando os dados na T2 -- 
    Truncate Table T2
    Go
    
    -- Inserindo da T1 diretamente para T2 --
    Insert Into T2
    Select Descricao, Valor2, Valor1, Soma=(Valor1+Valor2) From T1
    Go
    
    Select * from T2
    Go

    Analise e verifique todas as recomendações e comentários dos colegas, mas este é uma forma também que pode ser feita.

    Depois você poderá definir suas constraints, relacionamentos ou outras necessidades.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com


    quarta-feira, 6 de agosto de 2014 15:34
  • Deleted
    terça-feira, 5 de agosto de 2014 18:10
  • Deleted
    terça-feira, 5 de agosto de 2014 19:05

Todas as Respostas

  • Não é possivel, pois deixaria os dados do catalogo do SQL inconsistente.

    Guarde o script de criação dos objetos: tabela, indices, FKs, etc...dessa forma você recria de forma rápida.


    Alex Rosa - Premier Field Engineer - Data Platform

    Disclaimer: This content is provided "as-is" and without warranties of any kind, either express or implied. You should therefore verify any information contained in the content before acting on it.


    segunda-feira, 4 de agosto de 2014 23:13
  • Alex

        A sua opção até valida, mais para o meu caso por mais que fica-se incosistente, mais desce certo iria me ajudar em muito.

        Pois assim que fosse excluido estaria criando logo em seguinda, quanto a questão de guardar, devido ser várias bases de locais diferente, não existe um padrão nos nomes.

    terça-feira, 5 de agosto de 2014 01:44
  • Deleted
    terça-feira, 5 de agosto de 2014 10:05
  • Então pessoal

        O sentido para eu apagar a tabela, seria que esta nova que estarei criando logo em seguinda de apagar a antiga, seria que ela estaria com as colunas em uma nova ordem, por isto preciso apagar as colunas ?

    terça-feira, 5 de agosto de 2014 15:12
  • Em termos de modelagem de dados, isso não é necessário, e para bancos de dados com um volume de dados maior, é inviável.

    Não é necessário, pois o que prevalece é a ordem das colunas que você coloca no seu T-SQL e não a ordem fisica das colunas na tabela.

    Analise a possibilidade de não fazer mais o DROP/CREATE da tabela.


    Alex Rosa - Premier Field Engineer - Data Platform

    Disclaimer: This content is provided "as-is" and without warranties of any kind, either express or implied. You should therefore verify any information contained in the content before acting on it.


    terça-feira, 5 de agosto de 2014 16:32
  • Deleted
    terça-feira, 5 de agosto de 2014 18:10
  • Alex

         Desde já quero agradece a sua dica, é que como estamos em um processo de migração do SQL Server para uma versão mais nova, e já queria aproveitar para acertar esta ordem, mais estamos aqui analisando qual será a melhor alternativa neste momento.

    terça-feira, 5 de agosto de 2014 18:56
  • José

         Ela infelizmente está com dados, é que estamos em um processo de migração de versão do SQL Server, e já queriamos aproveitar para fazer alguns ajustes, e como envolve algumas tabelas estas alterações são feitas +/- automáticamente, mais agradeço a sua informação.

    terça-feira, 5 de agosto de 2014 18:59
  • Deleted
    terça-feira, 5 de agosto de 2014 19:05
  • José

       É que o processo deve ser meio automático por script, e como são várias bases de locais diferente, queremos aproveitar a migração para +/- acertar a ordem das colunas, mais tem que ser via script, e como as foreign key nem todas tem o mesmo nome, se eu não consegue excluir me ajudaria de uma maneira, mais no momento criando um script, para varrer todas, exclui e depois criamos todas novamente, já definindo um padrão nos nomes.

    terça-feira, 5 de agosto de 2014 20:15
  • Em termos de modelagem de dados, isso não é necessário, e para bancos de dados com um volume de dados maior, é inviável.

    Não é necessário, pois o que prevalece é a ordem das colunas que você coloca no seu T-SQL e não a ordem fisica das colunas na tabela.

    Analise a possibilidade de não fazer mais o DROP/CREATE da tabela.


    Alex Rosa - Premier Field Engineer - Data Platform

    Disclaimer: This content is provided "as-is" and without warranties of any kind, either express or implied. You should therefore verify any information contained in the content before acting on it.


    Alex,

    Concordo plenamente.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com

    quarta-feira, 6 de agosto de 2014 15:25
  • Neibala,

    Então, uma forma seria criar uma nova tabela com os dados e sem qualquer tipo de constraint, fazendo uso do Select Into ou então, migrar os dados para a nova tabela com toda estrutura e constrainst já criadas através do Insert Into....Select.

    Você já pensou me fazer assim?

    Veja se este exemplo ajuda:

    Create Table T1
     (Codigo Int Primary key Identity(1,1),
      Descricao Varchar(10) Default 'Texto....',
      Valor1 Float Default 1.00,
      Valor2 SmallInt Default 10)
    
    Insert Into T1 Default Values
    Go 1000
    
    Select * from T1
    Go
    
    
    -- Exemplo 1 - Select...Into --
    -- Criando uma nova Table com base na Tabela T1 --
    Select Codigo, Descricao, Valor2, Valor1, Soma=(Valor1+Valor2) Into T2 From T1
    Go
    
    Select * from T2
    Go
    
    
    -- Exemplo 2 - Insert Into....Select --
    -- Eliminando os dados na T2 -- 
    Truncate Table T2
    Go
    
    -- Inserindo da T1 diretamente para T2 --
    Insert Into T2
    Select Descricao, Valor2, Valor1, Soma=(Valor1+Valor2) From T1
    Go
    
    Select * from T2
    Go

    Analise e verifique todas as recomendações e comentários dos colegas, mas este é uma forma também que pode ser feita.

    Depois você poderá definir suas constraints, relacionamentos ou outras necessidades.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com


    quarta-feira, 6 de agosto de 2014 15:34