none
The object ' ' is dependent on column ' ' RRS feed

  • Pergunta

  • Olá pessoal, 

    Eu tenho 3 banco de dados em 3 ambientes, sendo: Desenvolvimento, Homologação e Produção.
    Temos um script de atualização do banco, a qual é executado nos 3 ambientes, seguindo a ordem acima.

    Eu tenho um objetivo simples de excluir uma coluna da minha tabela executando o comando:

    IF EXISTS(SELECT C.Name FROM sys.objects O JOIN sys.columns C ON C.object_id = O.object_id WHERE O.name = 'nome_da_tabela' AND C.name = 'nome_da_coluna')
    BEGIN

    ALTER TABLE nome_da_tabela
    DROP COLUMN nome_da_coluna

    END
    GO


    mas sou surpreendido com o seguinte erro:
    Msg 5074, Level 16, State 1, Line 1
    The object 'DF__nome_da_tabela__DataIni__440BE8B8' is dependent on column 'nome_da_coluna'.
    Msg 4922, Level 16, State 9, Line 1
    ALTER TABLE DROP COLUMN nome_da_coluna failed because one or more objects access this column.

    Eu posso solucionar o meu problema excluindo o objeto "DF__nome_da_tabela__DataIni__440BE8B8", ou executando primeiramente o comando:

    ALTER TABLE nome_da_tabela
    DROP DF__nome_da_tabela__DataIni__440BE8B8

    mas eu atualizo meus ambientes por um único script, se eu adicionar o comando para excluir um objeto, no outro ambiente, o nome do objeto será outro.

    Então eu preciso saber como realizar um select para saber o nome do objeto, exemplo, eu informo a tabela e a coluna, e ele precisa me retornar o nome do objeto.

    Assim eu posso executar o seguinte comando:

    IF EXISTS(SELECT C.Name FROM sys.objects O JOIN sys.columns C ON C.object_id = O.object_id WHERE O.name = 'nome_da_tabela' AND C.name = 'nome_da_coluna')
    BEGIN

            ALTER TABLE nome_da_tabela
            DROP (SELECT PESQUISAR OBJETO DE DEPENDÊNCIA DA COLUNA) 

    ALTER TABLE nome_da_tabela
    DROP COLUMN nome_da_coluna

    END
    GO

    Outra pergunta, pq eu preciso excluir esse objeto? o comando para dar um drop na coluna não deveria excluir o objeto e a coluna?

    Obrigado a todos




    • Editado Rodrigo Epic segunda-feira, 17 de fevereiro de 2014 13:30 Errei o assunto do tópico
    segunda-feira, 17 de fevereiro de 2014 13:29

Respostas

  • Rodrigo,

    Já que você tem o nome da tabela, tudo fica mais fácil. Utilize a consulta abaixo para localizar às CONSTRAINTs dependentes da sua tabela. Desta forma, você poderá remover este relacionamento com outra tabela e aí sim dropar a coluna.

    SELECT * FROM sys.objects WHERE [type]= 'D' AND parent_object_id IN (SELECT object_id FROM sys.objects WHERE name = 'suaTabela')

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    segunda-feira, 17 de fevereiro de 2014 13:50
    Moderador