2010-10-10 8 views
2

Ma base de données a été récemment piratée par injection SQL en laissant des balises dans toutes les données de toutes les colonnes de toutes les tables de ma base de données. Existe-t-il un moyen rapide d'exécuter un REPLACEUPDATE sur toutes les tables? Quelque chose comme:Mettre à jour chaque colonne de chaque table

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

Répondre

2

Non, il n'y a rien directement dans SQL Server qui vous permettra de le faire.

Cependant, indirectement - il y a un moyen: vous pouvez inspecter les vues du catalogue système et énumérer toutes les colonnes - en les limitant aussi aux colonnes (N) VARCHAR/(N) CHAR - et vous pourriez avoir votre premier T- L'instruction SQL génère une liste d'instructions UPDATE à partir de ces vues de catalogue système. Avec cette liste d'instructions T-SQL, vous pouvez ensuite exécuter la commande actuelle pour nettoyer votre base de données - cela touchera toutes les colonnes orientées caractères de toutes vos tables dans votre base de données.

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) 

Cela va générer une liste des UPDATE déclarations comme résultat, et vous pouvez alors prendre ces déclarations, copiez & les coller dans une deuxième fenêtre SSMS et les exécuter pour mettre à jour vos colonnes.

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

Vous pouvez trouver tous les types de système définis dans la vue catalogue sys.types - Je viens a saisi les valeurs pour user_type_idchar, nchar, varchar et nvarchar ici dans cet échantillon.

0

Une façon de le faire est de passer par des métadonnées. Le tableau sys.tables dans votre base de données peut vous donner une liste de toutes vos tables:

select * 
from sys.tables 

Ensuite, vous pouvez utiliser la table sys.columns pour obtenir les colonnes dans ces tableaux. Et puis vous auriez besoin de générer du SQL pour faire les mises à jour dans une boucle, par exemple.

Jetez un oeil ici pour plus d'informations générales sur l'interrogation de la base de données dans SQL Server 2005: http://msdn.microsoft.com/en-us/library/ms345522(v=SQL.90).aspx

+1

@marc_s: vous avez raison; éditer ma réponse. – CesarGon

Questions connexes