web-dev-qa-db-fra.com

Comment mettre à jour un champ varbinary avec une valeur spécifique?

Fondamentalement, j'essaie de donner à un utilisateur un certain mot de passe afin que je puisse tester certaines fonctionnalités sur un système, car je n'ai que notre compte d'administrateur et je ne peux pas jouer avec ce que je choisis juste un compte aléatoire afin que je puisse faire mes tests. Voici donc ma tentative de mise à jour:

UPDATE dbo.Login
SET
  Salt=CAST('bPftidzyAQik' AS VARBINARY),
  Password=CAST('0x2B89C2954E18E15759545A421D243E251784FA009E46F7A163926247FDB945F85F095DBB1FFF5B2B43A6ADAE27B8C46E176902412C4F8943E39528FF94E0DD5B' AS VARBINARY)
WHERE LoginID=10947

Il fonctionne correctement, mais le code de la base de données semble japonais pour l'un et la syntaxe pour l'autre semble correct, mais ce n'est pas la valeur que je mets, je veux qu'il utilise la valeur exacte que je mets pour que je puisse me connecter. Comment est-ce que je fais ça? J'ai essayé plusieurs solutions de conversion et de conversion sans succès.

19
shicky

Essaye ça:

UPDATE dbo.Login
SET
  Salt=CAST('bPftidzyAQik' AS VARBINARY),
  Password=0x2B89C2954E18E15759545A421D243E251784FA009E46F7A163926247FDB945F85F095DBB1FFF5B2B43A6ADAE27B8C46E176902412C4F8943E39528FF94E0DD5B
WHERE LoginID=10947

(vous n'avez pas besoin de convertir une chaîne stockant une valeur hexadécimale en varbinary - c'est exactement ce que c'est par défaut, sans les guillemets)

La question est, comment générez-vous cette valeur hexadécimale de mot de passe et utilisez-vous le même encodage pour le générer que pour le lire? Si vous prévoyez de reconvertir ces données en chaîne, vous aurez besoin de code pour le faire. Voici une fonction que j'ai écrite qui fait ceci:

CREATE FUNCTION ConvertBinary
(  
    @value AS varbinary(max)
) RETURNS VARCHAR(MAX) AS BEGIN  

    DECLARE @result AS varbinary(max),
            @result2 AS varchar(max),
            @idx AS bigint;

    IF @value IS null
        return null;

    SELECT @result = @value;  
    SELECT @result2 = '';
    SELECT @idx = 1;

    WHILE substring(@result, @idx, 1) != 0 AND @idx < len(@result)
        BEGIN
            SET @result2 = @result2 + cast(substring(@result,@idx,1) as char(1));  
            SET @idx = @idx + 1;
        END

    RETURN @result2;  

END 

Je ne sais pas à quel point cela vous sera utile, car il est très possible que l'application qui utilise ces champs gère les valeurs différemment de ce que cette fonction attend. Pour mémoire, cette fonction prend une valeur varbinary qui était à l'origine une chaîne utf-8 et renvoie la valeur varchar de cette chaîne. Bonne chance!

35
Jake Feasel

Puisque vous utilisez 2008, essayez ceci:

UPDATE dbo.Login 
SET 
    Salt=CAST('bPftidzyAQik' AS VARBINARY),   
    Password=CONVERT(VARBINARY(MAX), '0x2B89C2954E18E15759545A421D243E251784FA009E46F7A163926247FDB945F85F095DBB1FFF5B2B43A6ADAE27B8C46E176902412C4F8943E39528FF94E0DD5B', 1) 
WHERE LoginID=10947 

( http://blogs.msdn.com/b/sqltips/archive/2008/07/02/converting-from-hex-string-to-varbinary-and-vice-versa.aspx )

4
JOpuckman