Обновить каждый столбец в каждой таблице - PullRequest
2 голосов
/ 10 октября 2010

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

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

Ответы [ 2 ]

2 голосов
/ 10 октября 2010

Нет, в 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 голосов
/ 10 октября 2010

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

select *
from sys.tables

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

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

...