2008-11-18 17 views
10

¿Existe una manera fácil de seguir las dependencias de tabla/procedimiento almacenado/función en SQL Server 2005+? He heredado una aplicación gigante con muchas tablas y aún más procedimientos almacenados y funciones que son largas y están interrelacionadas.Dependencias del Servidor SQL

Al final del día hay una forma de construir un árbol de dependencias? Idealmente, lo que estoy buscando va en ambas direcciones:

Para una tabla/procedimiento, ¿qué depende de ello?: mostrar todos los procedimientos almacenados que hacen referencia a él con el tiempo (idealmente en una vista de árbol de tal manera que los procedimientos sub nido a los procedimientos más grandes que ellos llaman)

Para un procedimiento - ¿qué depende?: muéstreme todos los procedimientos y tablas que un procedimiento determinado tocará (o podría) cuando se ejecute.

Parece que esta herramienta no debería ser tan difícil de fabricar y sería increíblemente útil para el mantenimiento de DB en general. ¿Alguien está enterado de tal cosa? Si esto no existe, ¿por qué diablos no?

La funcionalidad integrada en Management Studio es agradable, pero la información no parece estar completa en absoluto.

Respuesta

11

Red Gate tiene una herramienta bastante útil llamada SQL Dependency Tracker. Lo hemos utilizado con éxito para el tipo de resultados que desea obtener.

+0

Finalmente se decidió a utilizar la versión de prueba - esto es una gran herramienta. – Cory

2

No creo que sea una lista completa garantizada, pero en Management Studio puede hacer clic derecho en una tabla o procedimiento almacenado y elegir la opción View Dependencies.

0

La tabla del sistema que intenta realizar un seguimiento de las dependencias por lo general es incorrecta, por lo que cualquier respuesta que obtenga de eso, tendrá que volver a confirmar por otros medios, entonces ¿para qué molestarse?

Existen productos comerciales, como Redgate SQL Dependency Tracker.

Un desarrollador pobre como yo, uso SQL Digger, que es gratis. Al buscar DDL para un nombre de objeto, generalmente puede encontrar las dependencias de primer grado que existen para un objeto en cuestión.

El siguiente nivel de seguimiento de la dependencia es rastrear qué objetos de red C# o VB.NET dependen de un objeto en SQL, pero AFAIK, las herramientas no existen para eso fuera de la búsqueda global.

2

Aquí es una lista de opciones si estás bajo de presupuesto:

http://www.mssqltips.com/tip.asp?tip=1294

También puede ejecutar una traza y ver lo que está haciendo el estudio de gestión de realidad al hacer clic en "ver las dependencias. Tome ese código y vea si puede modificarlo para su propio uso. Esta es una buena técnica para descubrir cómo automatizar varias cosas que normalmente hace a través de la interfaz de usuario.

+0

¿Cómo podría uno "Obtener ese código"? – Cory

+1

Al utilizar el generador de perfiles, debería poder ver qué código se está ejecutando contra el servidor. –

25

Con suerte no soy demasiado tarde con esto:

Si su conexión SQL tiene acceso al esquema sys en una determinada base de datos, puede utilizar los sys.dependencies de visión para encontrar todas las dependencias de un objeto en una tiro:

SELECT o.name, o.type_desc, p.name, p.type_desc 
FROM sys.sql_dependencies d 
INNER JOIN sys.objects o 
    ON d.object_id = o.object_id 
INNER JOIN sys.objects p 
    ON d.referenced_major_id = p.object_id 

Usando esto como punto de partida, probablemente podría construir una herramienta decente para crear un árbol de dependencias.También hay vistas específicas del tipo (por ejemplo, columnas del sistema) que proporcionan información más detallada sobre cada tipo de objeto de base de datos específico; estos podrían usarse para proporcionar información contextual sobre un objeto si es necesario.

+0

¿Funciona esto para SQL Server 2000? –

+0

Creo que las vistas del Catálogo de objetos a las que pertenece la tabla 'sys.objects' se introdujeron en SQL 2005, pero se puede escribir una consulta similar utilizando las vistas del esquema de información. Son un poco más complicados, pero puede encontrar documentación en ellos en http://msdn.microsoft.com/en-us/library/aa933204(SQL.80).aspx –

+0

Puede guardar esto en Excel e importar usando [ Gephi] (http://gephi.org) (un visualizador de gráficos gratuito y realmente avanzado) –

0

He encontrado esta solución y su gran.

SELECT referencing_schema_name, referencing_entity_name, 
referencing_id, referencing_class_desc, is_caller_dependent 
FROM sys.dm_sql_referencing_entities ('dbo.udf_func', 'OBJECT'); 
0

De MSDN:

SELECT * FROM sys.sql_expression_dependencies 
WHERE referenced_id = OBJECT_ID(N'Production.Product'); 

podemos hacerlo más elegante:

select 
I.name depending, I.xtype dependingtype, 
E.name depended, E.xtype dependedtype 
from sys.sql_expression_dependencies D 
left outer join sysobjects I on D.referencing_id = I.id 
left outer join sysobjects E on D.referenced_id = E.id 
where 1 = 1 
and (E.name = 'mytable' or I.name = 'mytable') -- customize this any way you want 
order by dependedtype, depended, dependingtype, depending