2015-09-02 4 views
0

Мы понесли какое-то вторжение в наш SQL Server.Поиск строки во всех базах данных, всех столбцах и всех таблицах (SQL Server 2008 R2)

Я пытаюсь найти в каждой базе данных, в каждой таблице, в каждом столбце слово abortion и cheat.

Я могу сделать это с помощью этого запроса, но в одной базе данных.

-- Store results in a local temp table so that. I'm using a 
-- local temp table so that I can access it in SP_EXECUTESQL. 
create table #tmp 
(
    db varchar(max), 
    tbl nvarchar(max), 
    col nvarchar(max), 
    val nvarchar(max), 
); 

declare @db nvarchar(max); 
declare @tbl nvarchar(max); 
declare @col nvarchar(max); 
declare @q nvarchar(max); 

declare @search nvarchar(max) = 'abortion'; 

-- Create a cursor on all columns in the database 
declare c cursor for 
    SELECT 
     DB_NAME(DB_ID()) as DBName, tbls.TABLE_NAME, cols.COLUMN_NAME 
    FROM INFORMATION_SCHEMA.TABLES AS tbls 
    JOIN INFORMATION_SCHEMA.COLUMNS AS cols ON tbls.TABLE_NAME = cols.TABLE_NAME 

-- For each table and column pair, see if the search value exists. 
open c 

fetch next from c into @db, @tbl, @col 

while @@FETCH_STATUS = 0 
begin 
    -- Look for the search key in current table column and if found add it to the results. 
    SET @q = 'INSERT INTO #tmp SELECT ''' [email protected]+''',''' + @tbl + ''', ''' + @col + ''', ' + @col + ' FROM ' + @tbl + ' WHERE ' + @col + ' LIKE ''%' + @search + '%''' 
    EXEC SP_EXECUTESQL @q 
    fetch next from c into @db, @tbl, @col 
end 
close c 
deallocate c 

-- Get results 
select distinct db,tbl,col from #tmp 

-- Remove local temp table. 
drop table #tmp 

Как найти эти строки? Набор должен быть результат:

DATABASE | TABLE | COLUMN 

мне не нужен результат (текстовое поле), и мне нужно select distinct для таблиц и столбцов, потому что это будет много abortion в одной и той же таблицы/столбца.

+0

http://stackoverflow.com/questions/9185871/how-to-search-sql-server-database-for-string или [SQL Search] (http://www.red-gate.com/products/ sql-development/sql-search /) или [sp_searchtable] (https://gallery.technet.microsoft.com/scriptcenter/c0c57332-8624-48c0-b4c3-5b31fe641c58) – lad2025

+0

привет, спасибо @ lad2025, но ни один из этих запросов может помочь мне. последний, который ищет каждую базу данных, не работает. –

+0

Поскольку это одна вещь, почему вы не можете просто запустить ее для каждой базы данных? Кроме того, прежде чем вы начнете исправлять данные, я надеюсь, что вы исправили уязвимость в sql-инъекции. Без сомнения, это то, что произошло. –

ответ

0

Хотя использование недокументированных sp_msforeachdb обычно не рекомендуется, мой инстинкт должен был бы отправить существующий код к этой процедуре, как это:

exec sp_MSforeachdb 'USE [?]; 
-- Store results in a local temp table so that. I'm using a 
-- local temp table so that I can access it in SP_EXECUTESQL. 
create table #tmp (
db varchar(max) , 
    tbl nvarchar(max), 
    col nvarchar(max), 
    val nvarchar(max), 

); 

declare @db nvarchar(max); 
declare @tbl nvarchar(max); 
declare @col nvarchar(max); 
declare @q nvarchar(max); 

-------------------------------------------------------------------------------------------- 
declare @search nvarchar(max) = ''abortion''; 
-------------------------------------------------------------------------------------------- 


-- Create a cursor on all columns in the database 
declare c cursor for 
SELECT DB_NAME(DB_ID()) as DBName,tbls.TABLE_NAME, cols.COLUMN_NAME FROM INFORMATION_SCHEMA.TABLES AS tbls 
JOIN INFORMATION_SCHEMA.COLUMNS AS cols 
ON tbls.TABLE_NAME = cols.TABLE_NAME 

-- For each table and column pair, see if the search value exists. 
open c 
fetch next from c into @db, @tbl, @col 
while @@FETCH_STATUS = 0 
begin 
    -- Look for the search key in current table column and if found add it to the results. 
    SET @q = ''INSERT INTO #tmp SELECT '''''' [email protected]+'''''','''''' + @tbl + '''''', '''''' + @col + '''''', '' + @col + '' FROM '' + @tbl + '' WHERE '' + @col + '' LIKE ''''%'' + @search + ''%'''''' 
    EXEC SP_EXECUTESQL @q 
    fetch next from c into @db, @tbl, @col 
end 
close c 
deallocate c;' 

Единственный добавлен код здесь является первой линии, для Остальная часть кода просто не забудьте заменить ' на ''. ? в USE [?] является специальным символом, означающим текущую активную базу данных в цикле sp_MSforeachdb.

+0

Спасибо, я тестирую его прямо сейчас. это то, что я пытался сделать, но я не мог. –

Смежные вопросы