Listar relaciones y llaves foráneas

Señal o problema observado

Encontramos una tabla, pero aún no sabemos qué otras tablas apuntan hacia ella ni a cuáles apunta. Las llaves foráneas registran una parte de esas relaciones y también revelan reglas que pueden afectar una eliminación o actualización.

Qué necesitamos distinguir

Una llave foránea exige que sus valores apunten a una fila válida. Una llave compuesta utiliza más de una columna para representar la relación.

Cada relación tiene una tabla hija, que contiene la llave foránea, y una tabla referenciada. Una llave compuesta produce varias filas: OrdenColumna conserva el orden de sus columnas.

Consulta

DECLARE @Tabla NVARCHAR(517) = N'dbo.Pedido';
DECLARE @IdTabla INT = OBJECT_ID(@Tabla, N'U');

IF @Tabla IS NOT NULL AND @IdTabla IS NULL
    THROW 50000, 'La tabla no existe o no es visible en esta base.', 1;

SELECT
    fk.name AS LlaveForanea,
    sh.name AS EsquemaHijo,
    th.name AS TablaHija,
    ch.name AS ColumnaHija,
    fkc.constraint_column_id AS OrdenColumna,
    sr.name AS EsquemaReferenciado,
    tr.name AS TablaReferenciada,
    cr.name AS ColumnaReferenciada,
    fk.delete_referential_action_desc AS AlEliminar,
    fk.update_referential_action_desc AS AlActualizar,
    fk.is_disabled AS EstaDeshabilitada,
    fk.is_not_trusted AS NoEsConfiable
FROM sys.foreign_keys AS fk
INNER JOIN sys.foreign_key_columns AS fkc
    ON fkc.constraint_object_id = fk.object_id
INNER JOIN sys.tables AS th
    ON th.object_id = fk.parent_object_id
INNER JOIN sys.schemas AS sh
    ON sh.schema_id = th.schema_id
INNER JOIN sys.columns AS ch
    ON ch.object_id = th.object_id
   AND ch.column_id = fkc.parent_column_id
INNER JOIN sys.tables AS tr
    ON tr.object_id = fk.referenced_object_id
INNER JOIN sys.schemas AS sr
    ON sr.schema_id = tr.schema_id
INNER JOIN sys.columns AS cr
    ON cr.object_id = tr.object_id
   AND cr.column_id = fkc.referenced_column_id
WHERE @IdTabla IS NULL
   OR fk.parent_object_id = @IdTabla
   OR fk.referenced_object_id = @IdTabla
ORDER BY
    sh.name,
    th.name,
    fk.name,
    fkc.constraint_column_id;

Parámetros o permisos

Escribe una tabla de dos partes en @Tabla. Si asignas NULL, la consulta lista todas las llaves foráneas visibles de la base actual.

La visibilidad depende de los permisos sobre los objetos. La consulta solo describe restricciones declaradas en SQL Server; no intenta inferir relaciones por nombres parecidos.

Cómo leer el resultado

Las acciones referenciales definen qué ocurre cuando cambia una fila relacionada: NO_ACTION rechaza un cambio incompatible, CASCADE lo propaga y SET_NULL o SET_DEFAULT sustituyen la referencia según la definición.

TablaHija.ColumnaHija apunta hacia TablaReferenciada.ColumnaReferenciada. Si una llave usa dos columnas, verás dos filas con la misma LlaveForanea y distinto OrdenColumna.

AlEliminar y AlActualizar muestran la acción declarada, por ejemplo NO_ACTION, CASCADE, SET_NULL o SET_DEFAULT. No ejecutes una modificación basándote únicamente en el nombre de la restricción: revisa estas acciones y prueba el comportamiento dentro de una transacción controlada.

EstaDeshabilitada = 1 significa que la restricción no se aplica a nuevas modificaciones. NoEsConfiable = 1 indica que SQL Server no puede asumir que todos los datos existentes cumplen la relación; esto puede afectar tanto la interpretación del modelo como ciertas optimizaciones.

Qué conclusión sí permite obtener

El optimizador es el componente que compara estrategias de ejecución. Una restricción no confiable limita las garantías que puede aprovechar al preparar una consulta.

Permite identificar llaves foráneas visibles, sus columnas, dirección, acciones referenciales y estado. Es una base sólida para dibujar las relaciones declaradas de una tabla.

Qué conclusión todavía no permite obtener

No descubre relaciones que la aplicación mantiene sin una llave foránea. Tampoco demuestra que los datos tengan calidad semántica, que la relación se use con frecuencia o que una eliminación sea segura desde la perspectiva del negocio.

Una restricción existente pero deshabilitada o no confiable no ofrece las mismas garantías que una restricción activa y validada.

Siguiente comprobación razonable

Consulta las llaves y los índices para saber qué estructuras respaldan las columnas. Después mide valores huérfanos cuando la relación no esté validada y revisa los módulos que modifican ambas tablas antes de planear cambios.

Índice del recorrido

Desarrollo y exploración

22 artículos de Desarrollo y exploración
  1. 01Buscar una tabla o vista por nombre
  2. 02Buscar una columna en toda la base
  3. 03Buscar texto dentro de procedimientos, vistas y funciones
  4. 04Consultar dependencias de un objeto
  5. 05Listar relaciones y llaves foráneas
  6. 06Consultar llaves primarias, restricciones únicas e índices
  7. 07Listar columnas con tipo, longitud, nulabilidad y valor predeterminado
  8. 08Encontrar triggers y sus tablas asociadas
  9. 09Encontrar objetos modificados recientemente
  10. 10Obtener conteos aproximados de todas las tablas
  11. 11Medir el espacio utilizado por cada tabla
  12. 12Revisar columnas IDENTITY y su valor actual
  13. 13Detectar registros duplicados por una clave de negocio
  14. 14Detectar registros huérfanos
  15. 15Comparar dos conjuntos de datos
  16. 16Validar conversiones antes de modificar una columna
  17. 17Ejecutar un UPDATE con validación y reversión controlada
  18. 18Ejecutar un DELETE con respaldo lógico y reversión controlada
  19. 19Comparar la estructura de dos bases de datos
  20. 20Describir el resultado de una consulta o procedimiento
  21. 21Encontrar tablas sin llave primaria
  22. 22Buscar un valor en columnas seleccionadas