Как узнать, какая хранимая процедура или триггер использует таблицу в SQL Server 2008 R2?


9

Это тот случай, когда в проверяемой БД есть архивная таблица, в которой хранится история пользователей, и есть процедура триггера или хранения, которая через некоторое время удаляет строки из этой таблицы, чтобы избежать превышения размера то же самое, я не проектировал БД, я просто беру на себя обслуживание приложения, которое использует эту БД, поэтому я не знаю названия этих хранимых процедур или триггеров, что я хочу сделать, это найти эту хранимую процедуру или триггер, проверьте код и измените его, чтобы оставить эту «историю пользователей» дольше на столе.

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

Спасибо.

Ответы:


6

Поиск по всему коду с использованием sys.sql_modules

SELECT OBJECT_NAME(object_id)
FROM sys.sql_modules sm
WHERE definition LIKE '%Mytable%'

Или используйте Red Gate SQL Search, который совершенно бесплатный

Не используйте syscomments или INFORMATION_SCHEMA.RUBBISH


Разве парень не может также щелкнуть правой кнопкой мыши по целевой таблице и нажать «Показать зависимости» (или какой-нибудь текст на этот счет)?
Ник Чаммас

@ Ник Чаммас: Нет, это хорошо известно как ненадежный
ГБН

@ gbn, я понимаю, что syscomments предназначены для обратной совместимости и могут быть удалены из будущего выпуска, но можете ли вы уточнить, почему бы не использовать INFORMATION_SCHEMA? ТНХ
datagod

@datagod: то же самое, почему syscomments как всегда плохой выбор: столбец определения - nvarchar (4000). Это означает, что вы можете пропустить ссылку на таблицу, если в строковой позиции> 4000 или перекрывает границу между строками nvarchar (4000) (зависит от того, как вы ее обрабатываете, могу ли я
согласиться,

@gbn На самом деле syscommentsесть несколько строк для объекта, который превышает ограничение в 4000 символов, что делает запросы, использующие его, такими же действительными, как и sys.sql_modules. Я все еще рекомендую sys.sql_modulesоднако, так syscommentsкак амортизируется.
Кеннет Фишер

4

Попробуйте ApexSQL Search

ApexSQL Search - это БЕСПЛАТНАЯ надстройка SQL Server Management Studio и Visual Studio, которая, помимо других функций, имеет функцию просмотра зависимостей. Функция «Просмотр зависимостей» позволяет визуализировать отношения всех объектов базы данных SQL, в том числе между зашифрованными и системными объектами, конкретными объектами SQL Server 2012 и объектами, хранящимися в базах данных, зашифрованных с помощью прозрачного шифрования данных (TDE).

Функция «Просмотр зависимостей» также позволяет настраивать и настраивать макет диаграммы визуальных зависимостей, включая отображаемые связи, макет и размер сгенерированной диаграммы, а также глубину детализации зависимостей.

Отказ от ответственности: я работаю на ApexSQL в качестве инженера службы поддержки


2

Для дальнейшего использования с 2008 года также можно использовать DMV. sys.dm_sql_referencing_entities, Я обычно предпочитаю использовать SQL_Modules, поскольку он избегает ложных срабатываний среди прочего. Я обсуждал это здесь, но в основном, если у вас есть такой код:

SELECT OBJECT_SCHEMA_NAME(object_id), OBJECT_NAME(object_id) 
FROM sys.sql_modules WHERE [definition] LIKE '%ABC%'

В конечном итоге вы получите результаты для таблицы ABC, таблицы ABCL для представления vw_ABC, хранимой процедуры sp_Update_ABC и т. Д. Также, насколько мне известно, DMV будет обрабатывать как зашифрованные, так и незашифрованные, а метод sql_modules работает только с незашифрованными. ,

DMV-версия того же запроса:

SELECT * FROM sys.dm_sql_referencing_entities('dbo.ABC', 'OBJECT')

1

Также вы можете использовать представление каталога sys.sql_expression_dependencies . Используйте этот запрос:

SELECT 
referencing_object_name = obj.name, 
referencing_object_type_desc = obj.type_desc, 
referenced_object_name = referenced_entity_name
FROM sys.sql_expression_dependencies sd 
INNER JOIN sys.objects obj 
ON sd.referencing_id = obj.[object_id] 
WHERE referenced_entity_name = 'MyTable'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.