Hola, chicos,
¡Buen día!
En esta publicación, le mostraré cómo encontrar dependencias entre objetos en varios niveles de jerarquía en SQL Server usando consultas Transact-SQL, simulando un comportamiento similar al que se presenta en la interfaz de Management Studio.
Usando SQL Server Management Studio
Esta es la forma más sencilla de realizar este mapeo, ya que no requiere ningún conocimiento técnico, basta con utilizar la interfaz de Management Studio. Un inconveniente de esta implementación es que no se puede trabajar con los datos devueltos para crear alguna encuesta o mapeo masivo, por ejemplo, o definir un nivel de jerarquía para la búsqueda. Además, esta pantalla no muestra dependencias entre bases de datos, es decir, dependencias entre objetos de diferentes bases de datos.
Para ver las dependencias, simplemente abra el Explorador de objetos, seleccione el objeto cuyas dependencias desea ver (en el ejemplo, elegí la tabla Clientes), haga clic derecho y seleccione la opción "Ver dependencias".

Una vez que se abre la pantalla, puede elegir ver:
– Objetos que dependen de [Clientes])
– Otros objetos de los que el objeto en cuestión tenga dependencias (Objetos de los que [Clientes] depende)

Esta pantalla enumera tanto las dependencias directas (nivel 1), cuando un objeto depende directamente de otro, como las dependencias indirectas (cuando un objeto depende de otro objeto y ese otro objeto tiene la dependencia). Cuanto más niveles aparecen entre los objetos inicial y final, mayor será su jerarquía.
Usando Transact-SQL
En los ejemplos siguientes, demostraré cómo enumerar objetos y sus dependencias mediante consultas T-SQL, utilizando DMV. sys.dm_sql_referenced_entities y sys.dm_sql_referencing_entities y la vista de catálogo sys.sql_expression_dependencies.
Usando sp_depends
Con este SP del sistema, puede enumerar rápidamente las dependencias de un objeto (solo el primer nivel y no entre bases de datos)
EXEC sp_depends @objname = N'dbo.Clientes'
Ejemplo:

Usando sp_MSdependencias
Otro SP del sistema que puede ayudar en esta situación es sp_MSdependencies. Aunque no es una base de datos cruzada, le permite ver los objetos que dependen del objeto X (Indicador 1315327) y aquellos de los que depende el objeto X (Indicador 1053183).
-- Lista os objetos que dependem da tabela dbo.Clientes
EXEC sp_MSdependencies N'dbo.Clientes', null, 1315327
-- Lista os objetos que a tabela dbo.Clientes depente
EXEC sp_MSdependencies N'dbo.Clientes', null, 1053183
Ejemplos:

Usando la vista del catálogo de sycomments
Al utilizar esta vista de catálogo, puede realizar fácilmente una búsqueda textual (es una búsqueda de texto, no por objeto) entre objetos para intentar ingresar una cadena específica en objetos como vistas, funciones, procedimientos, activadores, etc. Esta característica no es entre bases de datos y solo devuelve dependencias de primer nivel.
SELECT DISTINCT
B.name
FROM
syscomments A
INNER JOIN sysobjects B ON A.id = B.id
WHERE
CHARINDEX('Clientes', text) > 0
Ejemplo:

Usando la vista de catálogo INFORMACIÓN_SCHEMA.ROUTINES
Con la siguiente consulta podemos realizar una búsqueda textual en procedimientos y funciones que tengan una cadena en su nombre, como por ejemplo el nombre del objeto del que buscamos dependencias. Esta solución no es entre bases de datos y es una búsqueda textual.
SELECT
ROUTINE_CATALOG,
ROUTINE_SCHEMA,
ROUTINE_NAME,
ROUTINE_TYPE,
ROUTINE_DEFINITION
FROM
INFORMATION_SCHEMA.ROUTINES
WHERE
ROUTINE_DEFINITION LIKE '%Clientes%'
Dependencias cruzadas de bases de datos
Con la consulta siguiente, es posible seleccionar todas las dependencias entre bases de datos, donde los objetos de la base de datos actual de la conexión tienen dependencias en otras bases de datos.
SELECT
OBJECT_NAME(referencing_id) AS referencing_object,
referenced_database_name,
referenced_schema_name,
referenced_entity_name
FROM
sys.sql_expression_dependencies
WHERE
referenced_database_name IS NOT NULL
AND is_ambiguous = 0
Ejemplo:

Dependencias vinculadas al esquema
Con la consulta siguiente, es posible identificar y asignar dependencias vinculadas al esquema, como vistas indexadas (creadas con la sugerencia SCHEMABINDING), columnas calculadas y restricciones de verificación:
SELECT
OBJECT_NAME(d.referencing_id) AS referencing_name,
o.type_desc referencing_object_type,
d.referencing_minor_id AS referencing_column_id,
cc2.name AS referencing_column_name,
d.referenced_entity_name,
d.referenced_minor_id AS referenced_column_id,
cc.name AS referenced_column_name
FROM
sys.sql_expression_dependencies d
JOIN sys.all_columns cc ON d.referenced_minor_id = cc.column_id AND d.referenced_id = cc.[object_id]
JOIN sys.objects o ON d.referencing_id = o.[object_id]
LEFT JOIN sys.all_columns cc2 ON d.referencing_minor_id = cc2.column_id AND d.referencing_id = cc2.[object_id]
WHERE
d.is_schema_bound_reference = 1
AND d.referencing_minor_id > 0
Ejemplo de devolución:

Demostración de dependencia:

Mostrar dependencias en múltiples niveles
Con la consulta a continuación es posible listar dependencias en varios niveles jerárquicos, de la misma forma como nos muestra la interfaz de SQL Server Management Studio
WITH Arvore_Dependencias ( referenced_id, referenced_name, referencing_id, referencing_name, NestLevel )
AS (
SELECT
A.[object_id] AS referenced_id,
A.name AS referenced_name,
A.[object_id] AS referencing_id,
A.name AS referencing_name,
0 AS NestLevel
FROM
sys.objects A
WHERE
A.name = 'Clientes'
UNION ALL
SELECT
A.referenced_id,
OBJECT_NAME(A.referenced_id),
A.referencing_id,
OBJECT_NAME(A.referencing_id),
NestLevel + 1
FROM
sys.sql_expression_dependencies A
JOIN Arvore_Dependencias B ON A.referenced_id = B.referencing_id
)
SELECT DISTINCT
referenced_id,
referenced_name,
referencing_id,
referencing_name,
NestLevel
FROM
Arvore_Dependencias
WHERE
NestLevel > 0
ORDER BY
NestLevel,
referencing_id
Ejemplo:

Encontrar dependencias por tipo de datos
Como sabrá, los tipos de datos TEXT, NTEXT e IMAGE quedarán obsoletos y ya no serán compatibles con versiones futuras de SQL Server. Si planea actualizar su aplicación y reemplazar estos tipos, la siguiente consulta puede ser un buen punto de partida. La siguiente consulta mostrará todos los objetos que utilizan estos tipos de datos y sus dependencias:
WITH Arvore_Dependencias
AS (
SELECT DISTINCT
A.name,
A.[object_id] AS referenced_id,
A.name AS referenced_name,
A.[object_id] AS referencing_id,
A.name AS referencing_name,
0 AS NestLevel
FROM
sys.objects A
JOIN sys.columns B ON A.[object_id] = B.[object_id]
WHERE
A.is_ms_shipped = 0
AND B.system_type_id IN ( 34, 99, 35 ) -- TEXT, NTEXT e IMAGE
UNION ALL
SELECT
B.name,
A.referenced_id,
OBJECT_NAME(A.referenced_id),
A.referencing_id,
OBJECT_NAME(A.referencing_id),
NestLevel + 1
FROM
sys.sql_expression_dependencies A
JOIN Arvore_Dependencias B ON A.referenced_id = B.referencing_id
)
SELECT
name AS parent_object_name,
referenced_id,
referenced_name,
referencing_id,
referencing_name,
NestLevel
FROM
Arvore_Dependencias t1
WHERE
NestLevel > 0
ORDER BY
name,
NestLevel
Informe de dependencia completo
La siguiente consulta mostrará una línea para cada objeto de la base de datos que tenga dependencias, con los objetos dependientes separados por una coma.
SELECT
DB_NAME() AS dbname,
o.type_desc AS referenced_object_type,
d1.referenced_entity_name,
d1.referenced_id,
STUFF((
SELECT
', ' + OBJECT_NAME(d2.referencing_id)
FROM
sys.sql_expression_dependencies d2
WHERE
d2.referenced_id = d1.referenced_id
ORDER BY
OBJECT_NAME(d2.referencing_id)
FOR XML PATH('')
), 1, 1, '') AS dependent_objects_list
FROM
sys.sql_expression_dependencies d1
JOIN sys.objects o ON d1.referenced_id = o.[object_id]
GROUP BY
o.type_desc,
d1.referenced_id,
d1.referenced_entity_name
ORDER BY
o.type_desc,
d1.referenced_entity_name
Ejemplo:

Procedimiento de Dependencias Directas
Después de demostrar todos estos usos, compartiré un procedimiento almacenado que uso siempre que necesito enumerar rápidamente las dependencias entre bases de datos. Existe un requisito previo para crear este SP, que es el fncDividir, que debe crearse primero.
Este procedimiento enumera todas las dependencias directas de un objeto, de forma cruzada:
Ver código fuente
Ejemplo:

Procedimiento entre bases de datos y multinivel.
Con el procedimiento siguiente, que utiliza CTE y recursividad, es posible enumerar todos los objetos dependientes con varios niveles de jerarquía en la base de datos de origen y dependencias directas (primer nivel) y entre bases de datos.
Ver código fuenteEjemplo:

Cómo identificar, eliminar y recrear claves foráneas (FK)
Si desea identificar o recrear dependencias a nivel de clave externa, lea el artículo Cómo identificar, eliminar y recrear claves externas (FK) de una tabla en SQL Server
¡Eso es todo, amigos!
¡Hasta el próximo post!
Comentários (0)
Carregando comentários…