Domanda

Ho una directory piena di codice legacy da un'applicazione VB6.

Mi è stato chiesto di fornire un elenco di tutte le tabelle utilizzate da questa applicazione, in modo che possiamo assegnargli un nome utente speciale di SQL Server.

Qual è il modo migliore per scansionare una base di codice alla ricerca di riferimenti ai nomi delle tabelle?

Alcune idee che ho avuto:

  1. Cerca le seguenti parole chiave: "DA", "AGGIORNAMENTO", "INSERISCI" e annotare manualmente i nomi delle tabelle che circonda quelle frasi.

    Problema: molti lavori manuali

  2. Esegui l'applicazione con un SQL Traccia e prova a esercitare ciascuno funzione, quindi scansiona i log per nomi delle tabelle

    Problema: stesso lavoro manuale, inoltre potrei trascurare alcune funzioni oscure

Qualcuno può suggerire alternative migliori?

È stato utile?

Soluzione

Vorrei selezionare da information_schema.tables e salvare i risultati in un file per creare un elenco di tabelle e quindi utilizzare un file bat o uno strumento regex da riga di comando per utilizzare l'elenco di tabelle come sorgente per il confronto con i file nella directory del codice sorgente . Potresti generare quali file hanno avuto successo e quali nomi di tabella sono stati colpiti (su quale linea si trovava l'hit se sei interessato). Non sono un mago del grep, ma penso che sarebbe il giusto tipo di strumento da usare.

Modifica A seconda di come è stato gestito l'accesso ai dati, potresti voler espandere l'elenco di ricerca per includere i processi memorizzati da information_schema.routut

Modifica 2 Approccio usando finstr, un cursore e forse il lato oscuro

Si noti che mentre il seguito dovrebbe funzionare, se indicato nella directory sbagliata, potrebbe causare il caos. Inoltre, funzionerà solo se il codice sorgente è accessibile dal server e xp_cmdshell è abilitato. Forse l'intera idea è malvagia, non lo so.

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top