Eu fiz um script que, uma de cada vez, exclui todas as chaves estrangeiras de um banco de dados, assim:
ALTER TABLE MyTable1 DROP CONSTRAINT FK_MyTable1_col1
ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col1
ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col2
O que me surpreende é que o script leva muito tempo: em média, 20 segundos para cada DROP FK. Agora, eu entendo que criar um FK pode ser um grande negócio, porque o servidor tem que ir e verificar se a restrição FK não foi infringida desde o início, mas descartando? O que um servidor faz ao descartar FKs que demora tanto? Isso é tanto para minha própria curiosidade quanto para entender se existe uma maneira de tornar as coisas mais rápidas. Ser capaz de remover o FK (não apenas desativá-lo) me permitiria ser muito mais rápido durante uma migração e, portanto, minimizar o tempo de inatividade.
A eliminação de uma restrição requer um bloqueio Sch-M (Modificação de esquema) que bloqueará outras pessoas a consultar a tabela durante a modificação. Você provavelmente está esperando para obter esse bloqueio e precisa esperar até que todas as consultas atualmente em execução nessa tabela sejam concluídas.
Uma consulta em execução tem um bloqueio Sch-S (estabilidade de esquema) na tabela e esse bloqueio é incompatível com um bloqueio Sch-M.
Dos modos de bloqueio, bloqueios de esquema
Vou orientá-lo através de um exemplo para que você possa ver por que estava demorando muito. Criando um banco de dados vazio para este teste.
Criando 2 tabelas.
Criando uma restrição de chave estrangeira na tabela Person.
Insira alguns dados em ambas as tabelas.
Abra uma nova janela de consulta e execute-a (não feche a janela depois que a consulta for concluída).
Abra outra janela de consulta e execute isso.
Você verá que a restrição de descarte continuará em execução (aguardando) e agora execute a consulta para ver por que ela está sendo executada por mais tempo e quais bloqueios ela está esperando.
Depois de confirmar sua operação de inserção, a restrição de descarte será concluída imediatamente porque agora a instrução de descarte pode adquirir o bloqueio necessário.
Para o seu caso, você precisa ter certeza de que nenhuma sessão está mantendo um bloqueio compatível, o que impedirá a restrição de soltar para adquirir os bloqueios/bloqueios necessários.