986 Stimmen

Wie kann ich alle Fremdschlüssel auflisten, die auf eine bestimmte Tabelle in SQL Server verweisen?

Ich muss eine stark referenzierte Tabelle in einer SQL Server-Datenbank entfernen. Wie kann ich eine Liste aller Fremdschlüsselbegrenzungen erhalten, die ich entfernen muss, um die Tabelle zu löschen?

(SQL-Antworten sind dem Herumklicken in der GUI des Management-Studios vorzuziehen).

0 Stimmen

Siehe Wie man alle Fremdschlüssel einer Tabelle ausschreibt für Hilfe. Update : Link nicht mehr verfügbar, aber das relevante SQL wurde kopiert als eine Antwort zu einer verwandten Frage. Sie können die Abhängigkeiten auch über die grafische Benutzeroberfläche anzeigen.

1428voto

Recep Punkte 17753

Ich weiß nicht, warum es niemand vorgeschlagen hat, aber ich verwende sp_fkeys um Fremdschlüssel für eine bestimmte Tabelle abzufragen:

EXEC sp_fkeys 'TableName'

Sie können auch das Schema angeben:

EXEC sp_fkeys @pktable_name = 'TableName', @pktable_owner = 'dbo'

Ohne Angabe des Schemas wird die docs die folgenden Angaben machen:

Wenn pktable_owner nicht angegeben ist, gelten die Standardregeln für die Sichtbarkeit von Tabellen des zugrunde liegenden DBMS gelten.

In SQL Server, wenn der aktuelle Benutzer Eigentümer einer Tabelle mit dem angegebenen Namen besitzt, werden die Spalten dieser Tabelle zurückgegeben. Wenn pktable_owner nicht angegeben ist und der aktuelle Benutzer keine Tabelle mit dem angegebenen pktable_name besitzt, sucht die Prozedur nach einer Tabelle mit dem angegebenen pktable_name, die dem Datenbankbesitzer gehört. Wenn eine solche Tabelle existiert, werden die Spalten dieser Tabelle zurückgegeben.

315voto

Gustavo Rubio Punkte 9321

Das gibt Ihnen:

  • Die FK selbst
  • Schema, zu dem der FK gehört
  • Die " Referenztabelle " oder die Tabelle mit der FK
  • Die " Referenzsäule "oder die Spalte in der Referenztabelle, die auf den FK verweist
  • Die " referenzierte Tabelle "oder die Tabelle mit der Schlüsselspalte, auf die Ihr FK verweist
  • Die " referenzierte Spalte "oder die Spalte, die der Schlüssel ist, auf den Ihr FK verweist

Code unten:

SELECT  obj.name AS FK_NAME,
    sch.name AS [schema_name],
    tab1.name AS [table],
    col1.name AS [column],
    tab2.name AS [referenced_table],
    col2.name AS [referenced_column]
FROM sys.foreign_key_columns fkc
INNER JOIN sys.objects obj
    ON obj.object_id = fkc.constraint_object_id
INNER JOIN sys.tables tab1
    ON tab1.object_id = fkc.parent_object_id
INNER JOIN sys.schemas sch
    ON tab1.schema_id = sch.schema_id
INNER JOIN sys.columns col1
    ON col1.column_id = parent_column_id AND col1.object_id = tab1.object_id
INNER JOIN sys.tables tab2
    ON tab2.object_id = fkc.referenced_object_id
INNER JOIN sys.columns col2
    ON col2.column_id = referenced_column_id AND col2.object_id = tab2.object_id

261voto

Gishu Punkte 130442

Ich würde die Funktion Datenbankdiagramme in SQL Server Management Studio verwenden, aber da Sie das ausgeschlossen haben, hat das bei mir in SQL Server 2008 funktioniert (ich habe kein 2005).

Um eine Liste der verweisenden Tabellen- und Spaltennamen zu erhalten...

select 
    t.name as TableWithForeignKey, 
    fk.constraint_column_id as FK_PartNo, c.
    name as ForeignKeyColumn 
from 
    sys.foreign_key_columns as fk
inner join 
    sys.tables as t on fk.parent_object_id = t.object_id
inner join 
    sys.columns as c on fk.parent_object_id = c.object_id and fk.parent_column_id = c.column_id
where 
    fk.referenced_object_id = (select object_id 
                               from sys.tables 
                               where name = 'TableOthersForeignKeyInto')
order by 
    TableWithForeignKey, FK_PartNo

So erhalten Sie die Namen von Fremdschlüssel-Beschränkungen

select distinct name from sys.objects where object_id in 
(   select fk.constraint_object_id from sys.foreign_key_columns as fk
    where fk.referenced_object_id = 
        (select object_id from sys.tables where name = 'TableOthersForeignKeyInto')
)

184voto

BankZ Punkte 2094

Versuchen Sie dies:

sp_help 'TableName'

51voto

Mspaja Punkte 738

Sie sollten auch die Verweise auf andere Objekte beachten.

Wenn die Tabelle von anderen Tabellen stark referenziert wurde, wird sie wahrscheinlich auch von anderen Objekten wie Ansichten, gespeicherten Prozeduren, Funktionen usw. stark referenziert.

Ich würde wirklich empfehlen GUI-Tool wie 'view dependencies' Dialog in SSMS oder kostenlose Tool wie ApexSQL-Suche denn die Suche nach Abhängigkeiten in anderen Objekten kann fehleranfällig sein, wenn man sie nur mit SQL durchführen will.

Wenn SQL die einzige Möglichkeit ist, können Sie es so machen.

select O.name as [Object_Name], C.text as [Object_Definition]
from sys.syscomments C
inner join sys.all_objects O ON C.id = O.object_id
where C.text like '%table_name%'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X