Можно ли объединить виртуальный столбец в представлении? - PullRequest
2 голосов
/ 04 марта 2010

К сожалению, у меня есть незашифрованные пароли в базе данных. Я хочу передать эти значения открытого текста как можно меньше для, скажем, сравнений и обновлений. С этой целью я пытаюсь создать представление моей таблицы «Пользователи», которая исключает пароли в виде открытого текста и вместо этого предоставляет хешированное значение этого пароля.

Вот мое текущее представление SQL Server, которое не работает:

SELECT CAST(CAST(32768 * RAND() AS INT) AS NVARCHAR) AS PasswordSalt
       HashBytes('SHA1', PasswordSalt + u.Password) AS PasswordHash
FROM dbo.Users AS u

Я был бы рад услышать об альтернативах этому подходу, но в противном случае проблема заключается в объединении виртуального столбца PasswordSalt с ... чем угодно. Например, работает следующий простой вид:

SELECT u.Login AS Column1, u.Login + 'b' AS Column2

но это не так:

SELECT u.Login AS Column1, Column1 + 'b' AS Column2

Я получаю сообщение об ошибке от Management Studio:

Неверное имя столбца 'Column1'.

Заранее спасибо за любые идеи о том, что я делаю неправильно!

Ответы [ 2 ]

1 голос
/ 04 марта 2010

А как же

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 
1 голос
/ 04 марта 2010

Проблема возникает из-за того, что предложение FROM вашего оператора указывает, что данные, которые нужно выбрать, поступают из таблицы Users, но часть SELECT ссылается на столбец с именем PasswordSalt. SQL Server не может найти столбец с этим именем в таблице Users, следовательно, ошибка.

Альтернативным подходом может быть генерация Соли в подзапросе. Например

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

...