.net 更新每个表中的每个列

.net 更新每个表中的每个列,.net,sql-server-2005,tsql,sql-injection,.net,Sql Server 2005,Tsql,Sql Injection,我的数据库最近被SQL注入攻击,在数据库中所有表的所有列中的所有数据中留下标记。是否有一种在所有表上运行REPLACEUPDATE的快速方法?比如: UPDATE [all tables] SET [all columns]=REPLACE([all columns], '<script>....</script>', '') UPDATE[all tables]SET[all columns]=REPLACE([all columns],“…..”,“”) 一种方法是

我的数据库最近被SQL注入攻击,在数据库中所有表的所有列中的所有数据中留下标记。是否有一种在所有表上运行
REPLACE
UPDATE
的快速方法?比如:

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

一种方法是浏览元数据。数据库中的
sys.tables
表可以为您提供所有表的列表:

select *
from sys.tables
然后可以使用
sys.columns
表来获取这些表中的列。然后,您需要生成SQL以在循环中进行更新,例如


请在此处查看有关在SQL Server 2005中查询数据库架构的一般信息:

否,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)
您可以在
sys.types
目录视图中找到所有已定义的系统类型-在本示例中,我刚刚获取了
char
nchar
varchar
nvarchar

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>', '')