sql >> Database >  >> RDS >> Sqlserver

Lijst van alle buitenlandse sleutels op een tabel in SQL Server

Hieronder staan ​​twee methoden die u kunt gebruiken om een ​​lijst met externe sleutels voor een bepaalde tabel in SQL Server te retourneren.

Dit is vergelijkbaar met het retourneren van de externe sleutels op basis van de tabel met verwijzingen/primaire sleutels, behalve dat ik hier de externe sleutels terugstuur op basis van de tabel met verwijzingen/vreemde sleutels zelf.

Optie 1 – sys.foreign_keys

De volgende code haalt alle beperkingen voor externe sleutels op in de gegeven tabel, samen met de tabellen waarnaar wordt verwezen.

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

Resultaat:

+------------+--------------------------------- ------------------+------------+| FK Tafel | Buitenlandse sleutel | PK-tabel ||------------+--------------------------------- ------------------+------------|| Bestellen | FK_Fact_Order_City_Key_Dimension_City | Stad || Bestellen | FK_Fact_Order_Customer_Key_Dimension_Customer | Klant || Bestellen | FK_Fact_Order_Stock_Item_Key_Dimension_Stock Artikel | Voorraadartikel || Bestellen | FK_Fact_Order_Order_Date_Key_Dimension_Date | Datum || Bestellen | FK_Fact_Order_Picked_Date_Key_Dimension_Date | Datum || Bestellen | FK_Fact_Order_Salesperson_Key_Dimension_Employee | Medewerker || Bestellen | FK_Fact_Order_Picker_Key_Dimension_Employee | Medewerker |+------------+---------------------------------- -----------------+------------+

In dit geval gebruik ik de WideWorldImportersDW database, en ik retourneer de externe sleutels voor de Fact.Order tafel.

Optie 2 – sp_fkeys

Een andere manier om de externe sleutels te krijgen die naar een bepaalde tabel verwijzen, is door de sp_fkeys . te gebruiken systeem opgeslagen procedure. Deze opgeslagen procedure biedt ons de keuze om externe sleutels op te halen op basis van (onder andere) de tabel waarnaar wordt verwezen of de tabel waarnaar wordt verwezen.

In dit geval zijn we geïnteresseerd in het verkrijgen van de refererende sleutels op basis van de refererende-sleuteltabel, zodat we dit kunnen doen:

EXEC sp_fkeys @fktable_name ='Bestelling', @fktable_owner ='Feit';

Resultaat (met verticale uitvoer):

-[ RECORD 1 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensiePKTABLE_NAME | StadPKCOLUMN_NAME | StadssleutelFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FeitFKTABLE_NAME | BestellingFKCOLUMN_NAME | StadssleutelKEY_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 | DimensiePKTABLE_NAME | KlantPKCOLUMN_NAME | KlantsleutelFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FeitFKTABLE_NAME | BestellingFKCOLUMN_NAME | KlantsleutelKEY_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 | DimensiePKTABLE_NAME | DatumPKCOLUMN_NAME | DatumFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FeitFKTABLE_NAME | BestellingFKCOLUMN_NAME | Besteldatum KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Order_Date_Key_Dimension_DatePK_NAME | PK_Dimensie_DatumDEFERRABILITY | 7-[ RECORD 4 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensiePKTABLE_NAME | DatumPKCOLUMN_NAME | DatumFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FeitFKTABLE_NAME | BestellingFKCOLUMN_NAME | Gekozen datum KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Picked_Date_Key_Dimension_DatePK_NAME | PK_Dimensie_DatumDEFERRABILITY | 7-[ RECORD 5 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensiePKTABLE_NAME | WerknemerPKCOLUMN_NAME | MedewerkerssleutelFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FeitFKTABLE_NAME | BestellingFKCOLUMN_NAME | Verkoper 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 | DimensiePKTABLE_NAME | WerknemerPKCOLUMN_NAME | MedewerkerssleutelFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FeitFKTABLE_NAME | BestellingFKCOLUMN_NAME | KeuzetoetsKEY_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 | DimensiePKTABLE_NAME | VoorraadartikelPKCOLUMN_NAME | VoorraadartikelsleutelFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FeitFKTABLE_NAME | BestellingFKCOLUMN_NAME | Voorraadartikel KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Stock_Item_Key_Dimension_Stock ArtikelPK_NAME | PK_Dimension_Stock_ItemDEFERRABILITY | 7

Dit kan eenvoudig worden omgeschakeld om naar refererende sleutels te zoeken op basis van de primaire sleuteltabel door simpelweg de parameters te vervangen door @pktable_name en @pktable_owner :

EXEC sp_fkeys @pktable_name ='Stad', @pktable_owner ='Dimensie';

Een waar/onwaar controle

Als u gewoon wilt weten of een tabel al dan niet een externe sleutel heeft, maar u wilt niet dat alles wordt vermeld, raadpleegt u Controleer of een tabel een externe sleutel heeft in SQL Server met OBJECTPROPERTY().

Dat artikel gebruikt de TableHasForeignKey argument van de OBJECTPROPERTY() functie om 1 te retourneren als de tabel een externe sleutel heeft, en 0 als dat niet het geval is.


  1. Geavanceerde failover met behulp van post/pre-script hooks

  2. Oracle WHILE LOOP Voorbeeld

  3. Hoe een aangepast type array door te geven aan de Postgres-functie

  4. Hoe belangrijk is de volgorde van kolommen in indexen?