sql >> Database >  >> RDS >> Sqlserver

Retourneer alle externe sleutels die verwijzen naar een bepaalde tabel in SQL Server

Als u alle externe sleutels moet retourneren die verwijzen naar een bepaalde tabel in SQL Server, probeert u een van de volgende methoden.

De eerste methode bevraagt ​​de sys.foreign_keys systeem bekijken. De tweede methode voert de sp_fkeys . uit systeem opgeslagen procedure.

Optie 1 – sys.foreign_keys

De volgende code haalt alle refererende sleutels op die verwijzen naar een bepaalde tabel, samen met de primaire sleutel en de refererende-sleuteltabellen. Ik voeg ook het schema voor de refererende-sleuteltabellen toe.

USE WideWorldImportersDW;
SELECT 
  OBJECT_NAME(referenced_object_id) AS [PK Table],
  name AS [Foreign Key],
  SCHEMA_NAME(schema_id) AS [FK Schema],
  OBJECT_NAME(parent_object_id) AS [FK Table]
FROM sys.foreign_keys
WHERE referenced_object_id = OBJECT_ID('Dimension.City');

Resultaat:

+------------+---------------------------------------+-------------+------------+
| PK Table   | Foreign Key                           | FK Schema   | FK Table   |
|------------+---------------------------------------+-------------+------------|
| City       | FK_Fact_Order_City_Key_Dimension_City | Fact        | Order      |
| City       | FK_Fact_Sale_City_Key_Dimension_City  | Fact        | Sale       |
+------------+---------------------------------------+-------------+------------+

In dit geval gebruik ik de WideWorldImportersDW database, en ik retourneer de externe sleutels die verwijzen naar de Dimension.City tabel (de Dimension.City tabel bevat de primaire sleutelkolom waarnaar de refererende sleutels verwijzen).

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 externe sleutels die verwijzen naar een bepaalde tabel, dus we kunnen dit doen:

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

Resultaat (met verticale uitvoer):

-[ RECORD 1 ]-------------------------
PKTABLE_QUALIFIER | WideWorldImportersDW
PKTABLE_OWNER     | Dimension
PKTABLE_NAME      | City
PKCOLUMN_NAME     | City Key
FKTABLE_QUALIFIER | WideWorldImportersDW
FKTABLE_OWNER     | Fact
FKTABLE_NAME      | Order
FKCOLUMN_NAME     | City Key
KEY_SEQ           | 1
UPDATE_RULE       | 1
DELETE_RULE       | 1
FK_NAME           | FK_Fact_Order_City_Key_Dimension_City
PK_NAME           | PK_Dimension_City
DEFERRABILITY     | 7
-[ RECORD 2 ]-------------------------
PKTABLE_QUALIFIER | WideWorldImportersDW
PKTABLE_OWNER     | Dimension
PKTABLE_NAME      | City
PKCOLUMN_NAME     | City Key
FKTABLE_QUALIFIER | WideWorldImportersDW
FKTABLE_OWNER     | Fact
FKTABLE_NAME      | Sale
FKCOLUMN_NAME     | City Key
KEY_SEQ           | 1
UPDATE_RULE       | 1
DELETE_RULE       | 1
FK_NAME           | FK_Fact_Sale_City_Key_Dimension_City
PK_NAME           | PK_Dimension_City
DEFERRABILITY     | 7

Dit kan eenvoudig worden omgeschakeld om naar refererende sleutels te zoeken op basis van de refererende-sleuteltabel door simpelweg de parameters te vervangen door @fktable_name en @fktable_owner :

EXEC sp_fkeys 
  @fktable_name = 'Order', 
  @fktable_owner = 'Fact';

Een waar/onwaar controle

Als u gewoon wilt weten of er naar een tabel wordt verwezen door een externe sleutel, maar u wilt niet dat alles wordt vermeld, raadpleegt u Controleren of naar een tabel wordt verwezen door een externe sleutel in SQL Server met OBJECTPROPERTY().

Dat artikel gebruikt de TableHasForeignRef argument van de OBJECTPROPERTY() functie om 1 te retourneren als naar de tabel wordt verwezen met een externe sleutel, en 0 als dat niet zo is.


  1. SQLException:geen geschikt stuurprogramma gevonden voor jdbc:oracle:thin:@//localhost:1521/orcl

  2. Ga postgresql LIKE-query

  3. Hoeveel database-indexen is te veel?

  4. Hoe alleen de datumwaarde uit het datumveld in Oracle te extraheren?