Posso concatenar uma coluna virtual em uma visão?
-
24-09-2019 - |
Pergunta
Infelizmente, tenho senhas de texto simples em um banco de dados. Quero passar esses valores de texto simples o mínimo possível para, digamos, comparações e atualizações. Para esse fim, estou tentando criar uma visualização da tabela de usuários que exclui as senhas de texto simples e, em vez disso, fornece um valor de hash dessa senha.
Aqui está minha visualização atual do SQL Server, que não funciona:
SELECT CAST(CAST(32768 * RAND() AS INT) AS NVARCHAR) AS PasswordSalt
HashBytes('SHA1', PasswordSalt + u.Password) AS PasswordHash
FROM dbo.Users AS u
Ficaria feliz em ouvir sobre alternativas a essa abordagem, mas, caso contrário, o problema parece estar concatenando a coluna virtual PasswordSalt com qualquer coisa. Por exemplo, a seguinte visualização simples funciona:
SELECT u.Login AS Column1, u.Login + 'b' AS Column2
Mas este não é:
SELECT u.Login AS Column1, Column1 + 'b' AS Column2
O erro que estou recebendo do estúdio de gerenciamento é
Nome da coluna inválida 'Column1'.
Agradecemos antecipadamente por quaisquer idéias sobre o que estou fazendo de errado!
Solução
O problema está ocorrendo porque a cláusula de sua instrução indica que os dados a serem selecionados vem da tabela de usuários, mas a peça de seleção faz referência a uma coluna chamada PasswordSalt. O SQL Server não pode encontrar uma coluna com esse nome na tabela de usuários, daí o erro.
A abordagem alternativa pode ser gerar o sal em uma subconeração. Por exemplo
SELECT x.PasswordSalt,
HashBytes('SHA1', x.PasswordSalt + x.Password) AS PasswordHash
FROM ( SELECT CAST(CAST(32768 * RAND() AS INT) AS NVARCHAR) AS PasswordSalt,
Password
FROM dbo.Users) x
Outras dicas
A respeito
SELECT CAST(CAST(32768 * RAND() AS INT) AS NVARCHAR) AS PasswordSalt
HashBytes('SHA1', CAST(CAST(32768 * RAND() AS INT) AS NVARCHAR) + u.Password) AS PasswordHash
FROM dbo.Users AS u