Cenário:
Você está trabalhando como SQL Server DBA ou Desenvolvedor, você precisa remover uma tabela de um banco de dados. Quando você executa a instrução drop table SchemaName.TableName, você obtém o erro abaixo.Msg 3726, Level 16, State 1, Line 12
Não foi possível descartar o objeto 'SchemaName.TableName' porque é referenciado por uma restrição FOREIGN KEY.
Agora sabemos que a tabela é referenciada por uma restrição de chave estrangeira. O problema é como descobrir qual tabela tem aquela Restrição de Chave Estrangeira que está fazendo referência a esta tabela.
Solução:
1) Existem muitas maneiras de obter essas informações. Podemos usar visualizações do sistema para encontrar o nome da tabela que tem a restrição de chave estrangeira que está referenciando nossa tabela primária.SELECT Schema_Name(Schema_id) as TableSchemaName, object_name(FK.parent_object_id) ParentTableName, object_name(FK.referenced_object_id) ReferenceTableName FROM sys.foreign_keys AS FK WHERE object_name(FK.referenced_object_id)='YourTableName' and Schema_Name(Schema_id)='YourTableSchemaName'
Executei o script acima para minha tabela de clientes que está presente no esquema dbo e aqui está o que obtive.
Como descobrir qual chave estrangeira da tabela está fazendo referência à tabela no SQL Server. |
Agora sabemos que Ord é a tabela que possui a Restrição de Chave Estrangeira que está referenciando nossa tabela. Podemos ir em frente e descartar a restrição de chave estrangeira e, em seguida, descartar nossa tabela.
2) Use o procedimento armazenado do sistema sp_fkeys
Podemos usar o procedimento armazenado do sistema para obter as informações das restrições de chave estrangeira que fazem referência à nossa tabela. Se o nome da minha tabela for Customer, posso executar o script abaixo
EXEC sp_fkeys 'Customer'
Como obter o nome da restrição de chave estrangeira para uma tabela no SQL Server |
O sp_fkeys retorna informações muito detalhadas, algumas das colunas não são mostradas no snapshot acima. aqui está a lista de colunas que ele retornará.
- PKTABLE_QUALIFIER
- PKTABLE_OWNER
- PKTABLE_NAME
- PKCOLUMN_NAME
- FKTABLE_QUALIFIER
- FKTABLE_OWNER
- FKTABLE_NAME
- FKCOLUMN_NAME
- KEY_SEQ
- UPDATE_RULE
- DELETE_RULE
- FK_NAME
- PK_NAME
Demonstração de vídeo:não foi possível descartar o objeto porque ele é referenciado por uma restrição de chave estrangeira