Kann ich eine virtuelle Spalte in einer Ansicht verketten?
-
24-09-2019 - |
Frage
Leider habe ich Klartext-Passwörter in einer Datenbank. Ich möchte diese Klartext Werte übergeben um so wenig wie möglich für, sagen wir, Vergleiche und Updates. Zu diesem Zweck versuche ich einen Blick auf meine Tabelle Benutzer, dass schließt die Klartext-Passwörter zu erstellen und bietet stattdessen einen Hash-Wert dieses Passwort.
Hier ist meine aktuelle SQL Server-Ansicht, die nicht funktioniert:
SELECT CAST(CAST(32768 * RAND() AS INT) AS NVARCHAR) AS PasswordSalt
HashBytes('SHA1', PasswordSalt + u.Password) AS PasswordHash
FROM dbo.Users AS u
Ich würde gerne über Alternativen zu diesem Ansatz zu hören, aber ansonsten scheint das Problem die virtuelle Spalte zu verketten PasswordSalt mit .. nichts. So funktioniert die folgende einfache Ansicht:
SELECT u.Login AS Column1, u.Login + 'b' AS Column2
, aber dies nicht:
SELECT u.Login AS Column1, Column1 + 'b' AS Column2
Der Fehler, den ich von Management Studio bin Empfang ist
Ungültige Spaltenname 'Column1'.
Vielen Dank im Voraus für alle Ideen, was ich falsch mache!
Lösung
Das Problem auftritt, weil der FROM-Klausel der Anweisung gibt an, dass die Daten ausgewählt werden, kommt aus der Tabelle Benutzer, aber die SELECT-Teil verweist auf eine Spalte PasswordSalt genannt. SQL Server kann keine Spalte mit diesem Namen auf der Benutzertabelle finden, damit der Fehler.
kann Alternative Ansatz sein, das Salz in einer Unterabfrage zu generieren. Zum Beispiel
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
Andere Tipps
Was ist
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