Cerca una base di codice per i riferimenti ai nomi delle tabelle
-
19-08-2019 - |
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:
-
Cerca le seguenti parole chiave: "DA", "AGGIORNAMENTO", "INSERISCI" e annotare manualmente i nomi delle tabelle che circonda quelle frasi.
Problema: molti lavori manuali
-
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?
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