Ответ 1
У Red Gate есть довольно полезный инструмент SQL Dependency Tracker. Мы успешно использовали его для типа результатов, которые вы хотите получить.
Есть ли простой способ преследовать зависимости таблицы/хранимой процедуры/функции в SQL Server 2005+? Я унаследовал гигантское приложение с большим количеством таблиц и еще более хранимыми процедурами и функциями, которые являются длинными и взаимосвязанными.
В конце дня есть способ построить дерево зависимостей? Идеально, что я ищу, идет в обоих направлениях:
Для таблицы/процедуры - что от нее зависит?. Покажите мне все хранимые процедуры, которые в конечном итоге ссылаются на нее (в идеале в древовидном представлении, так что вспомогательные процедуры выходят на более крупные процедуры, которые вызывают их)
Для процедуры - от чего зависит ИТ?. Покажите мне все процедуры и таблицы, которые данная процедура будет (или может) касаться при работе.
Кажется, что этот инструмент не должен быть настолько сложным, что он будет невероятно полезен для обслуживания БД вообще. Кто-нибудь знает об этом? Если этого не существует, почему черт не?
Встроенная функциональность в Management Studio хороша, но информация не кажется полной.
У Red Gate есть довольно полезный инструмент SQL Dependency Tracker. Мы успешно использовали его для типа результатов, которые вы хотите получить.
Надеюсь, я не слишком поздно с этим:
Если ваш 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), которые дают более подробную информацию о каждом конкретном типе объекта базы данных; они могут быть использованы для предоставления контекстной информации об объекте, если это необходимо.
Я не думаю, что это гарантированный полный список, но в Management Studio вы можете щелкнуть правой кнопкой мыши по таблице или хранимой процедуре и выбрать опцию View Dependencies
.
Вот список опций, если у вас низкий бюджет:
http://www.mssqltips.com/tip.asp?tip=1294
Вы также можете запустить трассировку и посмотреть, что на самом деле делает студия управления, когда вы нажимаете "просматривать зависимости". Возьмите этот код и посмотрите, можете ли вы его изменить для собственного использования. Это хороший способ выяснить, как автоматизировать различные вещи, которые вы обычно делаете с помощью пользовательского интерфейса.
Системная таблица, которая пытается отслеживать зависимости, обычно неправильна, поэтому любой ответ, который вы получаете от этого, вам придется повторно подтвердить другими способами, так зачем беспокоиться об этом?
Существуют коммерческие продукты, такие как Redgate SQL Dependency Tracker.
Плохой разработчик, как я, я использую SQL Digger, который является бесплатным. Путем поиска DDL для имени объекта вы обычно можете найти зависимости первой степени для данного объекта.
Следующий уровень трассировки зависимостей заключается в том, чтобы отслеживать, какие сетевые объекты С# или VB.NET зависят от объекта в SQL, но AFAIK, инструменты не существуют для внешнего наблюдения.
попробуйте этот инструмент повышения производительности http://sqlhopper.weebly.com/ Это круто
Я нашел это решение и его большое.
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');
Из 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