Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Alle Fremdschlüssel in einer Tabelle in SQL Server auflisten

Unten sind zwei Methoden, die Sie verwenden können, um eine Liste von Fremdschlüsseln für eine bestimmte Tabelle in SQL Server zurückzugeben.

Dies ähnelt der Rückgabe der Fremdschlüssel basierend auf der referenzierten/Primärschlüsseltabelle, außer dass ich hier die Fremdschlüssel basierend auf der referenzierenden/Fremdschlüsseltabelle selbst zurückgebe.

Option 1 – sys.foreign_keys

Der folgende Code ruft alle Fremdschlüsseleinschränkungen für die angegebene Tabelle zusammen mit den referenzierten Tabellen ab.

USE WideWorldImportersDW;SELECT OBJECT_NAME(parent_object_id) AS [FK Table], name AS [Foreign Key], OBJECT_NAME(referenced_object_id) AS [PK Table]FROM sys.foreign_keysWHERE parent_object_id =OBJECT_ID('Fact.Order'); 

Ergebnis:

+----+--------------------------------- -------------+------------+| FK-Tabelle | Fremdschlüssel | PK-Tabelle ||------------+--------------------------------- -------------+------------|| Bestellen | FK_Fact_Order_City_Key_Dimension_City | Stadt || Bestellen | FK_Fakt_Auftrag_Kunde_Schlüssel_Dimension_Kunde | Kunde || Bestellen | FK_Fact_Order_Stock_Item_Key_Dimension_Lagerartikel | Lagerartikel || Bestellen | FK_Fact_Order_Order_Date_Key_Dimension_Date | Datum || Bestellen | FK_Fact_Order_Picked_Date_Key_Dimension_Date | Datum || Bestellen | FK_Fakt_Auftrag_Verkäufer_Schlüssel_Dimension_Mitarbeiter | Mitarbeiter || Bestellen | FK_Fact_Order_Picker_Key_Dimension_Employee | Mitarbeiter |+------------+---------------------------------- -------------+------------+

In diesem Fall verwende ich die WideWorldImportersDW Datenbank, und ich gebe die Fremdschlüssel für Fact.Order zurück Tabelle.

Option 2 – sp_fkeys

Eine andere Möglichkeit, die Fremdschlüssel zu erhalten, die auf eine bestimmte Tabelle verweisen, ist die Verwendung von sp_fkeys System gespeicherte Prozedur. Diese gespeicherte Prozedur bietet uns die Wahl, Fremdschlüssel (unter anderem) basierend auf der referenzierten Tabelle oder der referenzierenden Tabelle zu erhalten.

In diesem Fall sind wir daran interessiert, die Fremdschlüssel basierend auf der Fremdschlüsseltabelle zu erhalten, also können wir Folgendes tun:

EXEC sp_fkeys @fktable_name ='Bestellung', @fktable_owner ='Fakt';

Ergebnis (bei vertikaler Ausgabe):

-[ RECORD 1 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | StadtPKCOLUMN_NAME | StadtschlüsselFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | TatsacheFKTABLE_NAME | Bestellen Sie FKCOLUMN_NAME | StadtschlüsselKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_City_Key_Dimension_CityPK_NAME | PK_Dimension_CityDEFERRABILITY | 7-[ RECORD 2 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | KundePKCOLUMN_NAME | KundenschlüsselFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | TatsacheFKTABLE_NAME | Bestellen Sie FKCOLUMN_NAME | KundenschlüsselKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Customer_Key_Dimension_CustomerPK_NAME | PK_Dimension_CustomerDEFERRABILITY | 7-[ RECORD 3 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | DatumPKCOLUMN_NAME | DatumFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | TatsacheFKTABLE_NAME | Bestellen Sie FKCOLUMN_NAME | Bestelldatum KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Order_Date_Key_Dimension_DatePK_NAME | PK_Dimension_DateDEFERRABILITY | 7-[ RECORD 4 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | DatumPKCOLUMN_NAME | DatumFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | TatsacheFKTABLE_NAME | Bestellen Sie FKCOLUMN_NAME | Entnahmedatum KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Picked_Date_Key_Dimension_DatePK_NAME | PK_Dimension_DateDEFERRABILITY | 7-[ RECORD 5 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | MitarbeiterPKCOLUMN_NAME | MitarbeiterschlüsselFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | TatsacheFKTABLE_NAME | Bestellen Sie FKCOLUMN_NAME | Verkäufer KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Salesperson_Key_Dimension_EmployeePK_NAME | PK_Dimension_EmployeeDEFERRABILITY | 7-[ RECORD 6 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | MitarbeiterPKCOLUMN_NAME | MitarbeiterschlüsselFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | TatsacheFKTABLE_NAME | Bestellen Sie FKCOLUMN_NAME | Picker KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Picker_Key_Dimension_EmployeePK_NAME | PK_Dimension_EmployeeDEFERRABILITY | 7-[ RECORD 7 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | LagerartikelPKCOLUMN_NAME | Lagerartikel KeyFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | TatsacheFKTABLE_NAME | Bestellen Sie FKCOLUMN_NAME | Lagerartikel KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Stock_Item_Key_Dimension_Stock ItemPK_NAME | PK_Dimension_Stock_ItemDEFERRABILITY | 7

Dies kann leicht umgeschaltet werden, um nach Fremdschlüsseln basierend auf der Primärschlüsseltabelle zu suchen, indem Sie einfach die Parameter durch @pktable_name ersetzen und @pktable_owner :

EXEC sp_fkeys @pktable_name ='Stadt', @pktable_owner ='Dimension';

Ein Wahr/Falsch-Check

Wenn Sie einfach nur wissen möchten, ob eine Tabelle einen Fremdschlüssel hat oder nicht, aber nicht alles aufgelistet haben möchten, lesen Sie den Abschnitt Überprüfen, ob eine Tabelle einen Fremdschlüssel in SQL Server mit OBJECTPROPERTY() hat.

Dieser Artikel verwendet den TableHasForeignKey Argument von OBJECTPROPERTY() Funktion, um 1 zurückzugeben wenn die Tabelle einen Fremdschlüssel hat, und 0 wenn nicht.