Зависимости SQL Server

Есть ли простой способ преследовать зависимости таблицы/хранимой процедуры/функции в SQL Server 2005+? Я унаследовал гигантское приложение с большим количеством таблиц и еще более хранимыми процедурами и функциями, которые являются длинными и взаимосвязанными.

В конце дня есть способ построить дерево зависимостей? Идеально, что я ищу, идет в обоих направлениях:

Для таблицы/процедуры - что от нее зависит?. Покажите мне все хранимые процедуры, которые в конечном итоге ссылаются на нее (в идеале в древовидном представлении, так что вспомогательные процедуры выходят на более крупные процедуры, которые вызывают их)

Для процедуры - от чего зависит ИТ?. Покажите мне все процедуры и таблицы, которые данная процедура будет (или может) касаться при работе.

Кажется, что этот инструмент не должен быть настолько сложным, что он будет невероятно полезен для обслуживания БД вообще. Кто-нибудь знает об этом? Если этого не существует, почему черт не?

Встроенная функциональность в Management Studio хороша, но информация не кажется полной.

Ответ 1

У Red Gate есть довольно полезный инструмент SQL Dependency Tracker. Мы успешно использовали его для типа результатов, которые вы хотите получить.

Ответ 2

Надеюсь, я не слишком поздно с этим:

Если ваш SQL-вход имеет доступ к схеме sys в конкретной базе данных, вы можете использовать представление sys.dependencies для поиска всех зависимостей объектов за один снимок:

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

Используя это как отправную точку, вы, вероятно, можете создать достойный инструмент для создания дерева зависимостей. Существуют также типы специфичных представлений (например, sys.columns), которые дают более подробную информацию о каждом конкретном типе объекта базы данных; они могут быть использованы для предоставления контекстной информации об объекте, если это необходимо.

Ответ 3

Я не думаю, что это гарантированный полный список, но в Management Studio вы можете щелкнуть правой кнопкой мыши по таблице или хранимой процедуре и выбрать опцию View Dependencies.

Ответ 4

Вот список опций, если у вас низкий бюджет:

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

Вы также можете запустить трассировку и посмотреть, что на самом деле делает студия управления, когда вы нажимаете "просматривать зависимости". Возьмите этот код и посмотрите, можете ли вы его изменить для собственного использования. Это хороший способ выяснить, как автоматизировать различные вещи, которые вы обычно делаете с помощью пользовательского интерфейса.

Ответ 5

Системная таблица, которая пытается отслеживать зависимости, обычно неправильна, поэтому любой ответ, который вы получаете от этого, вам придется повторно подтвердить другими способами, так зачем беспокоиться об этом?

Существуют коммерческие продукты, такие как Redgate SQL Dependency Tracker.

Плохой разработчик, как я, я использую SQL Digger, который является бесплатным. Путем поиска DDL для имени объекта вы обычно можете найти зависимости первой степени для данного объекта.

Следующий уровень трассировки зависимостей заключается в том, чтобы отслеживать, какие сетевые объекты С# или VB.NET зависят от объекта в SQL, но AFAIK, инструменты не существуют для внешнего наблюдения.

Ответ 6

попробуйте этот инструмент повышения производительности http://sqlhopper.weebly.com/ Это круто

Ответ 7

Я нашел это решение и его большое.

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');

Ответ 8

Из MSDN:

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

Мы можем сделать его более приятным:

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