none
Como procurar um palavra ou um texto no banco de dados ?

    Question

  • Bom dia !

    Meu sistema foi invadido !!

    e gostaria de saber como faço para procurar algumas palavras ou texto no banco em geral, tipo fazer uma varedura nas tabelas.

    obrigado


    Tuesday, May 22, 2012 12:30 PM

Answers

  • Mário, montei esse script. Veja se te ajuda. A ideia dele é procurar em todas as tabelas do banco e em todos os campos do tipo texto uma determinada palavra parametrizada.

    declare @idtabela int, @tabela varchar(255), @coluna varchar(255), @valorProcurado varchar(255)
    
    --Coloque aqui a palavra ou expressão que deseja procurar
    set @valorProcurado = 'comercio'
    
    drop table ##tmpFindString
    
    create table ##tmpFindString (table_name varchar(255), string varchar(255))
    
    DECLARE db_cursor CURSOR FOR  
    		select id from sys.sysobjects where xtype = 'u'
    OPEN db_cursor   
    FETCH NEXT FROM db_cursor INTO @idtabela
    
    WHILE @@FETCH_STATUS = 0   
    BEGIN   
    
    		DECLARE db_cursorColunas CURSOR FOR  
    			select a.name as tabela, b.name as coluna from sys.sysobjects a
    				inner join
    					sys.syscolumns b
    				on a.id = b.id 
    			 where b.xtype in (167,175,231,239) and a.xtype = 'u'
    					and a.id = @idtabela
    			/*
    			167 varchar
    			175 char
    			231 nvarchar
    			239 nchar*/
    		OPEN db_cursorColunas   
    		FETCH NEXT FROM db_cursorColunas INTO @tabela, @coluna
    
    		WHILE @@FETCH_STATUS = 0   
    		BEGIN   
    				exec('
    				insert ##tmpFindString
    				select '''  + @tabela + ''', string = '''+@valorProcurado+'''
    						from ' + @tabela + ' where '+@coluna+' like ''%'+@valorProcurado+'%''')
    			   
    			   FETCH NEXT FROM db_cursorColunas INTO @tabela, @coluna 
    		END   
    
    		CLOSE db_cursorColunas   
    		DEALLOCATE db_cursorColunas 
    	   
    	   FETCH NEXT FROM db_cursor INTO @idtabela 
    END   
    
    CLOSE db_cursor   
    DEALLOCATE db_cursor 
    
    	   
    select distinct * from ##tmpFindString


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    Tuesday, May 22, 2012 3:33 PM

All replies

  • Mário, bom dia.

    Até existe a possibilidade, mas vc precisa ter um mapeamento das colunas que a rotina irá procurar o dado desejado.

    Se tiver isto, vc pode utilizar um cursor, fazendo o looping nas tabelas do banco e apontando para o mapeamento de campos para que o SQL entenda em qual campo deve procurar o dado.

    Abs.

    Tuesday, May 22, 2012 3:07 PM
  • Mário, montei esse script. Veja se te ajuda. A ideia dele é procurar em todas as tabelas do banco e em todos os campos do tipo texto uma determinada palavra parametrizada.

    declare @idtabela int, @tabela varchar(255), @coluna varchar(255), @valorProcurado varchar(255)
    
    --Coloque aqui a palavra ou expressão que deseja procurar
    set @valorProcurado = 'comercio'
    
    drop table ##tmpFindString
    
    create table ##tmpFindString (table_name varchar(255), string varchar(255))
    
    DECLARE db_cursor CURSOR FOR  
    		select id from sys.sysobjects where xtype = 'u'
    OPEN db_cursor   
    FETCH NEXT FROM db_cursor INTO @idtabela
    
    WHILE @@FETCH_STATUS = 0   
    BEGIN   
    
    		DECLARE db_cursorColunas CURSOR FOR  
    			select a.name as tabela, b.name as coluna from sys.sysobjects a
    				inner join
    					sys.syscolumns b
    				on a.id = b.id 
    			 where b.xtype in (167,175,231,239) and a.xtype = 'u'
    					and a.id = @idtabela
    			/*
    			167 varchar
    			175 char
    			231 nvarchar
    			239 nchar*/
    		OPEN db_cursorColunas   
    		FETCH NEXT FROM db_cursorColunas INTO @tabela, @coluna
    
    		WHILE @@FETCH_STATUS = 0   
    		BEGIN   
    				exec('
    				insert ##tmpFindString
    				select '''  + @tabela + ''', string = '''+@valorProcurado+'''
    						from ' + @tabela + ' where '+@coluna+' like ''%'+@valorProcurado+'%''')
    			   
    			   FETCH NEXT FROM db_cursorColunas INTO @tabela, @coluna 
    		END   
    
    		CLOSE db_cursorColunas   
    		DEALLOCATE db_cursorColunas 
    	   
    	   FETCH NEXT FROM db_cursor INTO @idtabela 
    END   
    
    CLOSE db_cursor   
    DEALLOCATE db_cursor 
    
    	   
    select distinct * from ##tmpFindString


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    Tuesday, May 22, 2012 3:33 PM
  • só comenta o drop table ##tmpFindString

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    Tuesday, May 22, 2012 3:34 PM
  • Se você trabalha com esquemas, segue solução que postei em outra thread.

    http://social.msdn.microsoft.com/Forums/pt-BR/520/thread/322ee9a1-cc96-4c37-a5af-e7f324e1fc1c

    Att,

    Antero Marques



    Wednesday, May 23, 2012 2:03 PM
  • Mário, boa tarde.

    Pode utilizar a solução do Antero. Está mais completa.

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    Wednesday, May 23, 2012 5:38 PM
  • Eduardo ..Show de bola

    abrigado amigo resolveu meu problema geral ..

    Valeu mesmo !!

    Wednesday, May 23, 2012 7:02 PM