Preciso remover uma tabela altamente referenciada em um banco de dados do SQL Server. Como posso obter uma lista de todas as restrições de chave estrangeira que preciso remover para descartar a tabela?
(É preferível responder SQL do que clicar na GUI do estúdio de gerenciamento.)
sql
sql-server
tsql
chillitom
fonte
fonte
Respostas:
Não sei por que ninguém sugeriu, mas eu uso
sp_fkeys
para consultar chaves estrangeiras para uma determinada tabela:Você também pode especificar o esquema:
Sem especificar o esquema, os documentos afirmam o seguinte:
fonte
Eu usaria o recurso de diagramação de banco de dados no SQL Server Management Studio, mas desde que você descartou isso - funcionou para mim no SQL Server 2008 (não possui 2005).
Para obter uma lista dos nomes de tabelas e colunas de referência ...
Para obter nomes de restrições de chave estrangeira
fonte
Isso lhe dá:
Código abaixo:
fonte
order by
: KeyTableSchemaName, KeyTableName, KeyColumnName, FkTableSchemaName, FkTableName, FkName ef) altere a ordem da coluna para: KeyTableSchemaName, KeyTableName, KeyColumnName, FkTableSchemaName, FkTableName, FkName, FkColumnName / Best / Practice / common convenções ed / e para o uso mais provável (listando os dependentes FK de aTable
).Tente o seguinte:
fonte
Você também deve se importar com as referências a outros objetos.
Se a tabela tiver sido altamente referenciada por outras tabelas, provavelmente também também por outros objetos, como visualizações, procedimentos armazenados, funções e muito mais.
Eu realmente recomendo uma ferramenta GUI, como a caixa de diálogo 'exibir dependências' no SSMS ou uma ferramenta gratuita como o ApexSQL. Procure isso porque pesquisar dependências em outros objetos pode estar sujeito a erros se você quiser fazê-lo apenas com SQL.
Se o SQL for a única opção, você pode tentar fazer isso assim.
fonte
A pergunta original pediu para obter uma lista de todas as chaves estrangeiras em uma tabela altamente referenciada para que a tabela possa ser removida.
Essa pequena consulta retorna todos os comandos 'soltar chave estrangeira' necessários para soltar todas as chaves estrangeiras em uma tabela específica:
Exemplo de saída:
Omita a cláusula WHERE para obter os comandos de descarte para todas as chaves estrangeiras no banco de dados atual.
fonte
Aqui está o código SQL que eu usaria.
Não é um SQL particularmente claro, então vamos ver um exemplo.
Então, supondo que eu quisesse soltar a
Employees
tabela no amadoNorthwind
banco de dados da Microsoft , mas o SQL Server me disse que uma ou mais chaves estrangeiras estavam me impedindo de fazer isso.O comando SQL acima retornaria esses resultados ...
Isso me mostra que existem 3 chaves estrangeiras que fazem referência à
Employees
tabela. Em outras palavras, eu não teria permissão para excluir (soltar) esta tabela até que essas três chaves estrangeiras sejam excluídas pela primeira vez.Nos resultados, a primeira linha é como a restrição de chave estrangeira a seguir seria mostrada nos resultados.
A penúltima coluna mostra o comando SQL que eu precisaria usar para excluir uma dessas chaves estrangeiras, por exemplo:
... e a coluna da direita mostra o SQL para criá- lo ...
Com todos esses comandos, você tem tudo o que precisa para excluir as Chaves estrangeiras relevantes para permitir excluir uma tabela e depois recriá-las mais tarde.
Ufa. Espero que isto ajude.
fonte
fonte
O mais simples é usar sys.foreign_keys_columns no SQL. Aqui, a tabela contém os IDs de objeto de todas as chaves estrangeiras, com o ID da coluna referenciada e o ID da tabela referenciada, bem como as colunas e tabelas de referência. Como os IDs permanecem constantes, o resultado será confiável para futuras modificações no esquema e nas tabelas.
Inquerir:
Também podemos adicionar filtro usando 'where'
fonte
fonte
Estou usando este script para encontrar todos os detalhes relacionados à chave estrangeira. Estou usando o Information.SCHEMA. Abaixo está um script SQL:
fonte
Primeiro
Em seguida, use o NimbleText para brincar com seus resultados
fonte
Algumas boas respostas acima. Mas eu prefiro ter a resposta com uma consulta. Este trecho de código é obtido em sys.sp_helpconstraint (sys proc)
É assim que a Microsoft olha se houver chaves estrangeiras associadas ao tbl.
A resposta será semelhante a: test_db_name.dbo.Account: FK_Account_Customer
fonte
select db_name() + '.' + schema_name(ObjectProperty(parent_object_id,'schemaid')) + '.' + object_name(parent_object_id) + ': ' + object_name(object_id) AS "FK Reference" from sys.foreign_keys where referenced_object_id = object_id('Customer')
Se você deseja obter a relação de chave estrangeira de todas as tabelas, exclua a
where
cláusula else else escreva seu nome da tabela em vez detablename
fonte
Isso mostra apenas o relacionamento se houver restrições de chave estrangeira. Meu banco de dados aparentemente antecede a restrição FK. Algumas tabelas usam gatilhos para impor a integridade referencial e, às vezes, não há nada além de uma coluna com nome semelhante para indicar o relacionamento (e nenhuma integridade referencial).
Felizmente, temos uma cena de nomenclatura consistente, portanto, sou capaz de encontrar tabelas e visualizações de referência como esta:
Eu usei essa seleção como base para gerar um script e faz o que eu preciso fazer nas tabelas relacionadas.
fonte
Trabalhando com o que o @Gishu fez, consegui produzir e usar o seguinte SQL no SQL Server 2005
Exibe as tabelas, colunas e nomes de chaves estrangeiras, todos em uma consulta.
fonte
Determinar chaves primárias e chaves exclusivas para todas as tabelas em um banco de dados ...
Isso deve listar todas as restrições e, no final, você pode colocar seus filtros
Para referência, leia através - http://blogs.msdn.com/b/sqltips/archive/2005/09/16/469136.aspx
fonte
Eu tenho usado isso em 2008 e acima. É semelhante a algumas outras soluções listadas, mas os nomes dos campos são apropriados para lidar com agrupamentos de casos específicos (LatBin). Além disso, você pode alimentá-lo com um único nome de tabela e recuperar apenas as informações dessa tabela.
fonte
Veja como obter todas as responsabilidades do ID selecionado. Basta alterar o valor @dbTableName, o valor @dbRowId e seu tipo (se você precisar remover '' na linha no 82 (..SET @SQL = ..)). Aproveitar.
fonte
O servidor Mysql possui a
information_schema.REFERENTIAL_CONSTRAINTS
tabela FYI, você pode filtrá-lo pelo nome da tabela ou pelo nome da tabela referenciada.fonte
Lista de todas as chaves estrangeiras que referenciam uma determinada tabela no SQL Server:
Você pode obter o nome da tabela de referência e o nome da coluna através da seguinte consulta ...
E captura de tela a seguir para sua compreensão ...
fonte
Isso obtém qualquer chave estrangeira que envolva a tabela escolhida. * Assume um formato _FIRSTABLENAME_SECONDTABLENAME.
Esta é uma forma mais geral:
fonte
A seguinte solução funciona para mim:
fonte
Você pode encontrar através da consulta abaixo:
fonte
Tente também.
com
sp_fkeys
que você pode filtrar o resultado, não só nome da tabela pk e esquema, mas também com o nome da tabela fk e esquema. ligaçãofonte
Resposta mais preferível por @BankZ
adicionalmente para esquema diferente
fonte