Поиск кодовой базы для ссылок на имена таблиц - PullRequest
0 голосов
/ 23 января 2009

У меня есть каталог, полный устаревшего кода из приложения VB6.

Меня попросили предоставить список всех таблиц, которые использует это приложение, поэтому мы можем назначить ему специальное имя пользователя SQL Server.

Как лучше всего сканировать кодовую базу на наличие ссылок на имена таблиц?

Некоторые идеи, которые у меня были:

  1. Поиск по следующим ключевым словам: «ОТ», «ОБНОВЛЕНИЕ», «ВСТАВКА» и запишите имена таблиц вручную окружающие эти фразы.

    Проблема: много ручной работы

  2. Запустить приложение с SQL Проследите и попробуйте функции, а затем сканировать журналы для имена таблиц

    Проблема: та же ручная работа, плюс я мог бы пропустить некоторые неясные функции

Кто-нибудь может предложить лучшие альтернативы?

1 Ответ

4 голосов
/ 23 января 2009

Я бы выбрал из information_schema.tables и сохранил результаты в файл, чтобы построить список таблиц, а затем использовал файл bat или инструмент регулярных выражений командной строки, чтобы использовать список таблиц в качестве источника для сравнения с файлами в каталоге исходного кода , Вы можете вывести, какие файлы имели попадание, и какие имена таблиц были достигнуты (какая строка была попаданием, если вам интересно). Я не извращенец, но думаю, что это был бы правильный инструмент для использования.

EDIT В зависимости от того, как обрабатывался доступ к данным, вы можете расширить список поиска, включив в него хранимые процессы из information_schema.routines

Редактировать 2 Подход с использованием finstr, курсора и, возможно, темной стороны

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

create table #files (filepath   varchar(4000))
create table #tablesfound (tablename sysname, filepath varchar(4000))

declare @sql nvarchar(4000)
Declare @cmd nvarchar(400)
Declare @dir varchar(256)
Declare @tbl sysname
set @dir = 'source code directory with e.g. c:\source\'
declare crsX cursor for
Select table_name from information_schema.tables
open crsX
Fetch Next from crsX into @tbl

While (@@Fetch_Status = 0)
Begin
    set @cmd = 'findstr /S /M '  + quotename(@tbl, char(34)) + ' ' + @dir + '*.*'

    insert into #files exec xp_cmdshell  @cmd
    if exists (Select 1 from #files where filepath is not null)
    Begin
        insert into #tablesfound (tablename, filepath)
        Select @tbl, filepath from #files where filepath is not null
        delete from #files 
    End  
    print @cmd
    Fetch Next from crsX into @tbl
End
close crsX 
Deallocate crsX

Select * from #tablesfound
...