it-swarm-pt.tech

Como atualizar um campo varbinário com um valor específico?

Basicamente, estou tentando dar a um usuário uma certa senha para poder testar algumas funcionalidades em um sistema, pois só tenho nossa conta de administrador e não posso brincar com isso. Estou apenas escolhendo uma conta aleatória para poder fazer meus testes. Então, aqui está minha tentativa de atualização:

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

Ele funciona bem, no entanto, o código no banco de dados parece japonês para um e a sintaxe para o outro parece boa, mas não é o valor que eu estou colocando, quero que ele use o valor exato que eu coloquei para que eu possa entrar. eu faço isso? Eu tentei várias soluções diferentes de conversão e conversão sem sorte.

19
shicky

Tente o seguinte:

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

(você não precisa converter uma string que armazene um valor hexadecimal em varbinary - isso é exatamente o que é por padrão, sem as aspas)

A questão é: como você está gerando esse valor hexadecimal da senha e está usando a mesma codificação para gerá-lo e para lê-lo? Se você planeja converter esses dados novamente em uma sequência, precisará de algum código para fazer isso. Aqui está uma função que escrevi que faz isso:

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 

Porém, não sei o quanto isso será útil para você, pois é muito possível que qualquer aplicativo que esteja usando esses campos esteja manipulando os valores de maneira diferente do que essa função espera. Para o registro, esta função pega um valor varbinário que era originalmente utf-8 string e retorna o valor varchar dessa string. Boa sorte!

35
Jake Feasel

Desde que você está usando 2008, tente o seguinte:

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