Skip to content

Reporte de relaciones entre tablas de SQL Server

Son muchos los momentos en los que podemos necesitar un listado de todas aquellas llaves que fueron diseñadas en nuestra base de datos. Es más, en un gran porcentaje, no manejamos bases con diseños nuestros, ¿verdad? Por eso nunca nos cae mal el poder generar un reporte de relaciones entre tablas de SQL Server.

¿Dónde se guardan la relaciones?

Cada que creamos nuestras tablas y sus llaves primarias y foráneas, se genera información dentro de los catálogos de la metadata. Estos datos pueden ser obtenidos desde diferentes vistas de sistema. En esta oportunidad utilizaremos dos vistas muy sencillas.

Con ellas podrás encontrar las llaves que han sido definadas para relacionar las tablas de una determinada base de datos. Estas vistas también heredan datos de la tabla sys.objects

Genera un Procedimiento Almacenado

Tal y como hemos hecho con diferentes herramientas con las que trabajamos, puedes mantener un formato de reportes para el seguimiento que vayas a dar a esta información.

Recuerda que la sintaxis CREATE OR ALTER está disponible solo desde la versión 2016 SP1 de SQL Server. Si tienes una anterior, solo utiliza el CREATE.

CREATE OR ALTER PROC sp_ReportForeignKeys
AS
BEGIN

	SELECT
		'FOREIGNKEYS' AS [REPORT],
		@@SERVERNAME AS [ServerName],
		DB_NAME() AS [DatabaseName],
		[fk].[name] AS [ForeignKeyName],
		SCHEMA_NAME([fk].schema_id) AS [TableSchema],
		OBJECT_NAME([fk].[parent_object_id]) AS [Table],
		COL_NAME([fkc].[parent_object_id], [fkc].[parent_column_id]) AS [ConstraintColumn],
		[fk].[is_disabled] AS [IsDisabled],
		OBJECT_SCHEMA_NAME ([fk].[referenced_object_id]) AS [ReferencedTableSchema],
		OBJECT_NAME ([fk].[referenced_object_id]) AS [ReferencedTable],
		COL_NAME([fkc].[referenced_object_id], [fkc].[referenced_column_id]) AS [ReferencedColumn],
		[fk].[delete_referential_action_desc] AS [DeleteAction],
		[fk].[update_referential_action_desc] AS [UpdateAction],
		[fk].[create_date] AS [CreateDate],
		[fk].[modify_date] AS [ModifyDate],
		CASE [fk].[is_system_named]
			WHEN 1 THEN 'System' 
			WHEN 0 THEN 'User'
		END AS [Named]
	FROM [sys].[foreign_keys] AS [fk]
	INNER JOIN [sys].[foreign_key_columns] AS [fkc]
	   ON [fk].[object_id] = [fkc].[constraint_object_id]
	ORDER BY 
		SCHEMA_NAME([fk].[schema_id]),
		OBJECT_NAME([fk].[parent_object_id]) 

END

Con esto podemos obtener información bastante interesante para el análisis. Seguramente lo que más puede ser relevante es lo siguiente.

relaciones-entre-tablas-de-sql-server

Sin embargo, también puedes contar con información respecto a si la llave foránea fue nombrada de una forma manual o automática, la fecha de creación y modificación, si se tiene una afectación por DELETE o UPDATE, e incluso si la CONSTRAINT está o no habilitada. Muchos de estos valores te servirán para fines de auditoría.

Importante en las relaciones entre tablas de SQL Server

Casi como en cualquier caso…El mantenimiento.

Es muy importante que sepas qué está relacionado con qué o cómo puede afectarte en tu diseño cualquier modificación o cambio tanto en las estructuras como en los datos.

Es posible que necesites esta información porque no pudiste realizar un UPDATE o un DELETE debido a las CONSTRAINTS que están creadas. Eliminarlas o deshabilitarlas no es la solución. Ten cuidado si ese es tu camino.

No te olvides también que puedes hacer un seguimiento a tus tablas de similar forma. Puedes Generar un Reporte de Tablas con todos sus detalles si necesitas mayor análisis.

www.datoptim.com
I love working on SQL Server Performance Tuning and finding the origin of the problems. Music and SQL Server passionate.

Esta entrada tiene 2 comentarios

  1. Muchas gracias pablo me ha servido mucho la información que nos has compartido, abrazos desde chile

Los comentarios están cerrados.

Carrito
Volver arriba