0

VB6 アプリケーションのレガシー コードでいっぱいのディレクトリがあります。

このアプリケーションが使用するすべてのテーブルのリストを提供するように依頼されたので、特別な SQL Server ユーザー名をそれに割り当てることができます。

テーブル名への参照についてコードベースをスキャンする最良の方法は何ですか?

私が持っていたいくつかのアイデア:

  1. 「FROM」、「UPDATE」、「INSERT」のキーワードを検索し、これらの語句を囲むテーブル名を手動でメモします。

    問題点: 手作業が多い

  2. SQL トレースを使用してアプリケーションを実行し、各関数の実行を試みてから、ログでテーブル名をスキャンします。

    問題: 同じ手作業に加えて、いくつかのあいまいな機能を見落とす可能性があります

誰かがより良い代替案を提案できますか?

4

1 に答える 1

4

information_schema.tables から選択し、結果をファイルに保存してテーブル リストを作成し、bat ファイルまたはコマンド ライン正規表現ツールを使用して、ソース コード ディレクトリ内のファイルと比較するためのソースとしてテーブル リストを使用します。どのファイルがヒットしたか、どのテーブル名がヒットしたか (興味があればヒットした行) を出力できます。私はgrepの達人ではありませんが、それは使用するのに適した種類のツールだと思います.

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
于 2009-01-23T14:29:22.577 に答える