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

#sql #sql-server

#sql #sql-server

Вопрос:

Мне нужно добавить поле в таблицу. Это поле необходимо будет заполнить разными значениями.

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

sys.dm_sql_referencing_entities предоставляет мне список хранимых процедур, которые зависят от этой таблицы, но мне нужны только хранимые процедуры, которые вставляют записи, а не те, которые просто запрашивают ее.

Спасибо.

Ответ №1:

Вы могли бы попытаться просмотреть код самой хранимой процедуры, но, вероятно, совпадение не будет 100-процентным. Что-то в строках:

 SELECT OBJECT_NAME(S.object_id) StoredProcedure
FROM sys.sql_modules S
JOIN sys.procedures P
ON S.object_id = P.object_id
WHERE Definition LIKE '%INSERT INTO myTable%' 
OR Definition LIKE '%INSERT myTable%' 
  

Комментарии:

1. Хороший ответ, но неполный. Это не работает, когда используются префиксы схемы, не выполняется поиск целых слов и, более того, игнорируются квадратные скобки.

Ответ №2:

Я не знаю, есть ли у нас способ получить точное соответствие на основе инструкции DML (insert vs. delete), но вы могли бы попробовать сравнить набор данных ссылающихся объектов со строковым соответствием, например:

 declare @ObjectName nvarchar(517) = 'dbo.Person';

declare @match table (sName nvarchar(500), oName nvarchar(500))
insert into @Match (sName, oName)
    select distinct
            object_schema_name([object_id], db_id()),
            object_name([object_id], db_id())
    from    sys.sql_modules
    where   [definition] like '%' @ObjectName '%' and
            (   -- match "insert into dbo.Person" or "insert into Person"
                [definition] like '%insert into '   @ObjectName   '%' or
                [definition] like '%insert into '   replace(@ObjectName, 'dbo.', '')   '%' or
                -- match "insert dbo.Person" or "insert Person"
                [definition] like '%insert '   @ObjectName   '%' or
                [definition] like '%insert '   replace(@ObjectName, 'dbo.', '')   '%' 
            )

select  *   
from    sys.dm_sql_referencing_entities(@ObjectName, 'OBJECT') re
left
join    @Match d on
        re.referencing_schema_name = d.sName and
        re.referencing_entity_name = d.oName
where   d.sName is not null -- comment this line to compare all possible ref entities 
return
  

Ответ №3:

Одна низкотехнологичная тактика, которая работает лучше, чем вы могли подумать . . .

Преобразуйте схему в текст. Затем в командной строке . . .

 $ grep -i 'insert into your-table-name' dumped-schema-file
  

Я не знаю утилиту Windows, которая выполняет поиск текстовой строки.

Это, вероятно, приведет к обнаружению большинства вставок. Вы также можете попробовать

 $ grep -i -B2 'your-table-name' dumped-schema-file
  

Это выведет каждую строку, соответствующую ‘your-table-name’, вместе с тремя строками непосредственно перед ней, чтобы вы могли искать такие вещи, как

 insert into
your-table-name
  

Ответ №4:

НЕСКОЛЬКО лет назад журнал SQL Server опубликовал статью под названием «Поиск хранимых процедур по строкам«, в которой была представлена хранимая процедура, которая

принимает входную строку и выполняет поиск в системных таблицах syscomments, sysobjects и syscolumns в локальной базе данных для любой ссылки на эту строку. Набор выходных результатов показывает все таблицы, процедуры, представления и другие элементы, которые содержат указанную входную строку.

По сути, это grep для вашей базы данных. Это было очень полезно.