sql >> Database teknologi >  >> RDS >> Sqlserver

Returner alle fremmednøgler, der refererer til en given tabel i SQL Server

Hvis du skal returnere alle fremmednøgler, der refererer til en given tabel i SQL Server, kan du prøve en af ​​følgende metoder.

Den første metode forespørger sys.foreign_keys systemvisning. Den anden metode udfører sp_fkeys systemlagret procedure.

Mulighed 1 – sys.foreign_keys

Den følgende kode henter alle fremmednøgler, der refererer til en given tabel, sammen med primærnøgle- og fremmednøgletabellerne. Jeg inkluderer også skemaet for fremmednøgletabellerne.

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');

Resultat:

+------------+---------------------------------------+-------------+------------+
| 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       |
+------------+---------------------------------------+-------------+------------+

I dette tilfælde bruger jeg WideWorldImportersDW database, og jeg returnerer de fremmednøgler, der refererer til Dimension.City tabel (Dimension.City tabel indeholder den primære nøglekolonne, som fremmednøglerne refererer til).

Mulighed 2 – sp_fkeys

En anden måde at få de fremmednøgler, der refererer til en bestemt tabel, er at bruge sp_fkeys system lagret procedure. Denne lagrede procedure giver os muligheden for at få fremmednøgler baseret på (blandt andet) den refererede tabel eller referencetabellen.

I dette tilfælde er vi interesserede i at få de fremmednøgler, der refererer til en given tabel, så vi kan gøre dette:

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

Resultat (ved hjælp af lodret output):

-[ 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

Dette kan nemt skiftes rundt for at søge efter fremmednøgler baseret på fremmednøgletabellen ved blot at erstatte parametrene med @fktable_name og @fktable_owner :

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

Et sandt/falskt tjek

Hvis du blot vil vide, om en tabel refereres til af en fremmednøgle, men du ikke vil have det hele opført, skal du se Tjek, om en tabel henvises til af en fremmednøgle i SQL Server med OBJECTPROPERTY().

Denne artikel bruger TableHasForeignRef argument for OBJECTPROPERTY() funktion for at returnere 1 hvis tabellen refereres af en fremmednøgle, og 0 hvis det ikke er.


  1. Kan et tabelfelt indeholde en bindestreg?

  2. Neo4j - Slip en begrænsning ved hjælp af Cypher

  3. Hvordan gør man en kolonne unik i SQL?

  4. 8 funktioner til at returnere dagen fra en dato i MariaDB