Найти хранимые процедуры, на которые нет ссылок в исходном коде - PullRequest
1 голос
/ 13 ноября 2009

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

ОБНОВЛЕНИЕ: при использовании -E «proc1 | proc2» выводит все строки во всех файлах, которые соответствуют любому шаблону, это не очень полезно Устаревшая база данных содержит более 2000 процедур.

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

Есть еще идеи?

ОБНОВЛЕНИЕ: После дальнейших экспериментов я обнаружил, что именно комбинация параметров -i и -o препятствует выводу. К сожалению, мне нужен поиск без учета регистра в этом контексте.

Ответы [ 4 ]

4 голосов
/ 13 ноября 2009

Мне приходилось делать это и раньше. Не забывайте о любых процессах, которые можно вызывать из других процедур. Если вы используете SQL Server, вы можете использовать это:

ВЫБРАТЬ имя, текст ОТ СИСОБЪЕКТА А ПРИСОЕДИНЯЙТЕСЬ к системным комментариям B ON A.id = B.id ГДЕ xtype = 'P' AND text LIKE '% <имя sproc>%'

4 голосов
/ 13 ноября 2009

передать список хранимых процедур в egrep, разделенный "|"

или

for stored_proc in $stored_procs
do
grep $stored_proc $source_file
done
2 голосов
/ 14 ноября 2009

Я получаю вывод при обстоятельствах, описанных в вашем редакторе:

$ echo "aaaproc1bbb" | grep -Eo 'proc1|proc2'
proc1
$ echo $?
0
$ echo "aaabbb" | grep -Eo 'proc1|proc2'
$ echo $?
1

Код выхода показывает, что совпадений не было.

Вы также можете найти эти опции для grep полезными (-L может относиться только к GNU grep):

-c, --count
              Suppress  normal output; instead print a count of matching lines
              for each input file.  With the -v,  --invert-match  option  (see
              below), count non-matching lines.  (-c is specified by POSIX.)

-L, --files-without-match
              Suppress normal output; instead print the  name  of  each  input
              file from which no output would normally have been printed.  The
              scanning will stop on the first match.

-l, --files-with-matches
              Suppress normal output; instead print the  name  of  each  input
              file  from  which  output would normally have been printed.  The
              scanning will stop on the first  match.   (-l  is  specified  by
              POSIX.)

-q, --quiet, --silent
              Quiet;   do   not  write  anything  to  standard  output.   Exit
              immediately with zero status if any match is found, even  if  an
              error  was  detected.   Also see the -s or --no-messages option.
              (-q is specified by POSIX.)

Извините за цитирование страницы man у вас, но иногда это помогает немного экранировать.

Редактировать

Для списка имен файлов, которые не содержат никаких процедур (без учета регистра):

grep -EiL 'proc1|proc2' *

Для списка имен файлов, которые содержат любую из процедур (без учета регистра):

grep -Eil 'proc1|proc2' *

Чтобы вывести список файлов и показать совпадение (без учета регистра):

grep -Eio 'proc1|proc2' *
1 голос
/ 19 ноября 2009

Начните с вашего списка имен процедур. Для последующего легкого повторного использования сортируйте их и делайте их строчными, например:

tr "[:upper:]" "[:lower:]" < list_of_procedures | sort > sorted_list_o_procs

... теперь у вас есть отсортированный список имен процедур. Похоже, вы уже используете GNU grep, поэтому у вас есть опция -o.

fgrep -o -i -f sorted_list_o_procs source1 source2 ... > list_of_used_procs 

Обратите внимание на использование fgrep: на самом деле это не регулярные выражения, поэтому зачем обращаться с ними как таковыми Надеюсь, вы также обнаружите, что это волшебным образом исправляет ваши проблемы с выходом;). Теперь у вас есть ужасный список используемых процедур. Давайте очистим их, как мы делали оригинальный список выше.

tr "[:upper:]" "[:lower:]" < list_of_used_procs | sort -u > short_list

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

fgrep -v -f short_list sorted_list_o_procs 

... и вот они.

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