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.