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