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í.