Как найти все сохраненные процедуры и функции, которые изменяют данные в данной таблице? - PullRequest
1 голос
/ 13 сентября 2011

Легко найти все сохраненные процессы, которые «зависят» от данной таблицы, с помощью Juneau (CTP3) или средства отслеживания зависимостей SQL (от RedGate).

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

Мне нужно найти проки, которые вставляют / обновляют / удаляют данные из таблицы.

(Поиск со сложным регулярным выражением не является решением, которое будет работать!)

Ответы [ 4 ]

5 голосов
/ 13 сентября 2011

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

  1. он использует sys.sql_modules, поэтому нет шансов пропустить попадание из-за границы или не захватить весь текст, для процедур> 4k
  2. он не анализирует объекттекст для имени таблицы, который может привести к множеству ложных срабатываний (имя таблицы только в комментариях, имя таблицы является частью большего имени)
  3. генерирует команду sp_helptext для каждого потенциального совпадения, поэтому вы можетескопируйте и вставьте вывод в верхнюю панель, запустите его и быстро отсканируйте, чтобы выяснить, есть ли какие-либо ложные срабатывания.

Код:

SELECT 'EXEC sp_helptext ''' 
        + QUOTENAME(SCHEMA_NAME(p.[schema_id])) 
        + '.' + QUOTENAME(p.name) + ''';'
    FROM sys.procedures AS p
    INNER JOIN sys.sql_modules AS m
    ON p.[object_id] = m.[object_id]
    INNER JOIN sys.sql_expression_dependencies AS d
    ON p.[object_id] = d.referencing_id
    WHERE d.referenced_id = OBJECT_ID('dbo.your_table_name')
    AND 
    (
        LOWER(m.[definition]) LIKE '%update%'
        OR LOWER(m.[definition]) LIKE '%insert%'
        OR LOWER(m.[definition]) LIKE '%delete%'
    );

Теперь одна слабость заключается в том, что sys.sql_expression_dependencies не на 100% надежен - но я все же предпочел бы сделать это таким образом по вышеуказанным причинам,

Некоторое время назад я написал довольно длинную статью о поддержке зависимостей:

0 голосов
/ 16 сентября 2011

**

Попробуйте это имя таблицы SP_Helptrigger 'sp_helptext'triggername' см. код, а затем просмотреть часть манипуляции в триггере

**

0 голосов
/ 15 сентября 2011

В конце концов, я просто выполнил поиск по папкам, в которых хранится основная копия хранимых процедур. На все хиты ушло несколько часов, но это было быстрее, чем попытаться написать свой собственный инструмент.

(я не понимаю, почему инструментарий для SQL так ограничен по сравнению с C # для такого рода вещей)

0 голосов
/ 13 сентября 2011

Для этого вы можете запросить системные представления.

Вот пример , как найти все SP, связанные с определенной таблицей.
С небольшими изменениями вы можете найти только те, которые на самом деле содержат ключевые слова delete, insert и update:

SELECT DISTINCT so.name, sc.text
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE (sc.TEXT LIKE '%your_table%' AND sc.TEXT LIKE '%delete%')
OR (sc.TEXT LIKE '%your_table%' AND sc.TEXT LIKE '%insert%')
OR (sc.TEXT LIKE '%your_table%' AND sc.TEXT LIKE '%update%')

Это не идеальное решение (например, он также найдет SP, которые SELECT из вашей таблицы и DELETE из другого), но если у вас есть сотни SP, которые только SELECT с вашего стола и больше ничего не делайте, по крайней мере, они будут отфильтрованы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...