2010-10-10 4 views
2

Моя база данных недавно была взломана SQL-инъекциями, оставляющими теги по всем данным во всех столбцах во всех таблицах моей базы данных. Есть ли быстрый способ запускать REPLACEUPDATE на всех таблицах? Что-то вроде:Обновление каждого столбца в каждой таблице

UPDATE [all tables] SET [all columns]=REPLACE([all columns], '<script>....</script>', '') 

ответ

2

Нет, нет ничего непосредственно в SQL Server, что позволит вам сделать это.

Однако косвенно - есть способ: вы могли бы просмотреть просмотры системного каталога и перечислить все столбцы, а также ограничить их только столбцами (N) VARCHAR/(N) CHAR - и у вас может быть ваш первый T- Оператор SQL генерирует список инструкций UPDATE из этих представлений системного каталога.

С помощью этого списка инструкций T-SQL вы можете запустить фактическую команду для очистки базы данных - это коснется всех столбцов, ориентированных на символы, во всех ваших таблицах в вашей базе данных.

SELECT 
    'UPDATE ' + sch.name + '.' + t.name + ' SET ' + c.name + ' = REPLACE("<script>....</script>", "")' 
FROM 
    sys.columns c 
INNER JOIN 
    sys.tables t ON c.object_id = t.object_id 
INNER JOIN 
    sys.schemas sch ON t.schema_id = sch.schema_id 
WHERE 
    t.is_ms_shipped = 0 
    AND c.user_type_id IN (167, 175, 231, 239) 

Это создаст список UPDATE отчетности как результат, а затем вы можете взять эти заявления, копировать & вставлять их во второе окно SSMS, и запустить их, чтобы обновить столбцы.

UPDATE dbo.T_ServicePSSAAudit SET RunType = REPLACE(RunType, '<script>....</script>', '') 
UPDATE dbo.T_PromoStatus SET StatusText = REPLACE(StatusText, '<script>....</script>', '') 
UPDATE dbo.T_PromoStatus SET StatusCode = REPLACE(StatusCode, '<script>....</script>', '') 
UPDATE dbo.T_DSLSpeed SET CaptionCode = REPLACE(CaptionCode, '<script>....</script>', '') 
UPDATE dbo.T_DVPTransfer SET RequestType = REPLACE(RequestType, '<script>....</script>', '') 
UPDATE dbo.T_Promo SET Description = REPLACE(Description, '<script>....</script>', '') 

Вы можете найти все определенные типы систем в представлении sys.types каталога - я просто схватил user_type_id значение char, nchar, varchar и nvarchar здесь, в этом образце.

0

Один из способов сделать это, пройдя метаданные. sys.tables таблица в базе данных может дать вам список всех таблиц:

select * 
from sys.tables 

Затем вы можете использовать sys.columns таблицы для получения столбцов в этих таблицах. И тогда вам нужно будет сгенерировать SQL для создания обновлений в цикле, например.

Посмотрите здесь для общей информации о запросе схемы базы данных в SQL Server 2005: http://msdn.microsoft.com/en-us/library/ms345522(v=SQL.90).aspx

+1

@marc_s: вы правы; редактируя мой ответ. – CesarGon

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