【问题标题】:Search for a string in all databases, all columns, and all tables (SQL Server 2008 R2)在所有数据库、所有列和所有表中搜索字符串 (SQL Server 2008 R2)
【发布时间】:2015-09-02 17:45:47
【问题描述】:

我们的 SQL Server 遭受了某种入侵。

我试图在每个数据库、每个表、每个列中找到单词 abortioncheat

我可以用这个查询来做到这一点,但在一个数据库中。

-- 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 ''' +@db+''',''' + @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

【问题讨论】:

  • 你好,谢谢@lad2025,但这些查询都不能帮助我。最后一个搜索所有不工作的数据库。
  • 既然这是一次性的事情,为什么不能只为每个数据库运行它呢?另外,在您费心修复数据之前,我希望您修复了 sql 注入漏洞。毫无疑问,事情就是这样发生的。
  • 这就是我正在做的。我们有 300 个数据库。我是手动做的,直到找到更好的解决方案。
  • 你修复了sql注入漏洞吗?如果你不解决这个问题,你将不止一次地与这个问题作斗争。老实说,您可能至少要为此战斗两次。一次是“哦,废话,现在需要修复我们的网站”,每次你再次被黑客入侵,直到你解决问题。

标签: sql-server database tsql sql-server-2008-r2


【解决方案1】:

虽然通常不鼓励使用未记录的 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 '''''' +@db+'''''','''''' + @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 执行的当前活动数据库。

【讨论】:

  • 谢谢,我正在测试。这就是我想要做的,但我做不到。
猜你喜欢
  • 2017-10-06
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多