sql >> Base de Datos >  >> RDS >> Sqlserver

Listar todas las claves foráneas en una tabla en SQL Server

A continuación se muestran dos métodos que puede utilizar para devolver una lista de claves externas para una tabla determinada en SQL Server.

Esto es similar a devolver las claves foráneas en función de la tabla de claves primarias/referenciadas, excepto que aquí, estoy devolviendo las claves foráneas en función de la tabla de claves foráneas/de referencia en sí.

Opción 1:sys.foreign_keys

El siguiente código recupera todas las restricciones de clave externa en la tabla dada, junto con las tablas a las que se hace referencia.

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_keys
WHERE parent_object_id = OBJECT_ID('Fact.Order');

Resultado:

+------------+---------------------------------------------------+------------+
| FK Table   | Foreign Key                                       | PK Table   |
|------------+---------------------------------------------------+------------|
| Order      | FK_Fact_Order_City_Key_Dimension_City             | City       |
| Order      | FK_Fact_Order_Customer_Key_Dimension_Customer     | Customer   |
| Order      | FK_Fact_Order_Stock_Item_Key_Dimension_Stock Item | Stock Item |
| Order      | FK_Fact_Order_Order_Date_Key_Dimension_Date       | Date       |
| Order      | FK_Fact_Order_Picked_Date_Key_Dimension_Date      | Date       |
| Order      | FK_Fact_Order_Salesperson_Key_Dimension_Employee  | Employee   |
| Order      | FK_Fact_Order_Picker_Key_Dimension_Employee       | Employee   |
+------------+---------------------------------------------------+------------+

En este caso estoy usando WideWorldImportersDW base de datos, y estoy devolviendo las claves foráneas para el Fact.Order mesa.

Opción 2:sp_fkeys

Otra forma de obtener las claves externas que hacen referencia a una tabla en particular es usar sp_fkeys procedimiento almacenado del sistema. Este procedimiento almacenado nos brinda la opción de obtener claves externas basadas en (entre otras cosas) la tabla de referencia o la tabla de referencia.

En este caso, estamos interesados ​​en obtener las claves foráneas basadas en la tabla de claves foráneas, por lo que podemos hacer esto:

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

Resultado (usando salida vertical):

-[ 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      | Customer
PKCOLUMN_NAME     | Customer Key
FKTABLE_QUALIFIER | WideWorldImportersDW
FKTABLE_OWNER     | Fact
FKTABLE_NAME      | Order
FKCOLUMN_NAME     | Customer Key
KEY_SEQ           | 1
UPDATE_RULE       | 1
DELETE_RULE       | 1
FK_NAME           | FK_Fact_Order_Customer_Key_Dimension_Customer
PK_NAME           | PK_Dimension_Customer
DEFERRABILITY     | 7
-[ RECORD 3 ]-------------------------
PKTABLE_QUALIFIER | WideWorldImportersDW
PKTABLE_OWNER     | Dimension
PKTABLE_NAME      | Date
PKCOLUMN_NAME     | Date
FKTABLE_QUALIFIER | WideWorldImportersDW
FKTABLE_OWNER     | Fact
FKTABLE_NAME      | Order
FKCOLUMN_NAME     | Order Date Key
KEY_SEQ           | 1
UPDATE_RULE       | 1
DELETE_RULE       | 1
FK_NAME           | FK_Fact_Order_Order_Date_Key_Dimension_Date
PK_NAME           | PK_Dimension_Date
DEFERRABILITY     | 7
-[ RECORD 4 ]-------------------------
PKTABLE_QUALIFIER | WideWorldImportersDW
PKTABLE_OWNER     | Dimension
PKTABLE_NAME      | Date
PKCOLUMN_NAME     | Date
FKTABLE_QUALIFIER | WideWorldImportersDW
FKTABLE_OWNER     | Fact
FKTABLE_NAME      | Order
FKCOLUMN_NAME     | Picked Date Key
KEY_SEQ           | 1
UPDATE_RULE       | 1
DELETE_RULE       | 1
FK_NAME           | FK_Fact_Order_Picked_Date_Key_Dimension_Date
PK_NAME           | PK_Dimension_Date
DEFERRABILITY     | 7
-[ RECORD 5 ]-------------------------
PKTABLE_QUALIFIER | WideWorldImportersDW
PKTABLE_OWNER     | Dimension
PKTABLE_NAME      | Employee
PKCOLUMN_NAME     | Employee Key
FKTABLE_QUALIFIER | WideWorldImportersDW
FKTABLE_OWNER     | Fact
FKTABLE_NAME      | Order
FKCOLUMN_NAME     | Salesperson Key
KEY_SEQ           | 1
UPDATE_RULE       | 1
DELETE_RULE       | 1
FK_NAME           | FK_Fact_Order_Salesperson_Key_Dimension_Employee
PK_NAME           | PK_Dimension_Employee
DEFERRABILITY     | 7
-[ RECORD 6 ]-------------------------
PKTABLE_QUALIFIER | WideWorldImportersDW
PKTABLE_OWNER     | Dimension
PKTABLE_NAME      | Employee
PKCOLUMN_NAME     | Employee Key
FKTABLE_QUALIFIER | WideWorldImportersDW
FKTABLE_OWNER     | Fact
FKTABLE_NAME      | Order
FKCOLUMN_NAME     | Picker Key
KEY_SEQ           | 1
UPDATE_RULE       | 1
DELETE_RULE       | 1
FK_NAME           | FK_Fact_Order_Picker_Key_Dimension_Employee
PK_NAME           | PK_Dimension_Employee
DEFERRABILITY     | 7
-[ RECORD 7 ]-------------------------
PKTABLE_QUALIFIER | WideWorldImportersDW
PKTABLE_OWNER     | Dimension
PKTABLE_NAME      | Stock Item
PKCOLUMN_NAME     | Stock Item Key
FKTABLE_QUALIFIER | WideWorldImportersDW
FKTABLE_OWNER     | Fact
FKTABLE_NAME      | Order
FKCOLUMN_NAME     | Stock Item Key
KEY_SEQ           | 1
UPDATE_RULE       | 1
DELETE_RULE       | 1
FK_NAME           | FK_Fact_Order_Stock_Item_Key_Dimension_Stock Item
PK_NAME           | PK_Dimension_Stock_Item
DEFERRABILITY     | 7

Esto se puede cambiar fácilmente para buscar claves externas basadas en la tabla de claves principales simplemente reemplazando los parámetros con @pktable_name y @pktable_owner :

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

Una verificación de verdadero/falso

Si simplemente desea saber si una tabla tiene o no una clave externa, pero no desea que se enumere todo, consulte Comprobar si una tabla tiene una clave externa en SQL Server con OBJECTPROPERTY().

Ese artículo usa TableHasForeignKey argumento de OBJECTPROPERTY() función para devolver 1 si la tabla tiene una clave foránea, y 0 si no es así.