MySQL 5.0.32: md5 mit insert ignore funktioniert nicht
the.star
- datenbank
Hallo zusammen
Ich möchte von DB1.Tabelle1 Infos rausziehen und in DB2.Tabelle1 speichern. Das geht sehr gut mit Insert....Select... nur leider hat er ein Problem mit meinem md5-Befehl. Wie ihr sicher ahnt, geht es um Passwörter und deren Verschlüsselung.
Hier mein (gewünschter) Query, der aber nicht funktioniert:
INSERT INTO DB2.Tabelle1 (id,username,password) SELECT DB1.Tabelle1.id, DB1.Tabelle1.KNID, md5('DB1.Tabelle1.Passwort') FROM DB1.Tabelle1
Ich kriege folgenden Fehler:
Duplicate entry '1' for key 1
DB2.Tabelle1 ist wie folgt aufgebaut:
id int(11)
username varchar(80)
password varchar(32)
Ohne md5() klappt der query:
INSERT INTO DB2.Tabelle1 (id,username,password) SELECT DB1.Tabelle1.id, DB1.Tabelle1.KNID, DB1.Tabelle1.Passwort FROM DB1.Tabelle1
Oder mit IGNORE geht's auch, aber dann habe ich beim Passwort einfach 1000xMal den selben Wert. Die Benutzernamen werden alle korrekt kopiert.
INSERT IGNORE INTO DB2.Tabelle1 (id,username,password) SELECT DB1.Tabelle1.id, DB1.Tabelle1.KNID, md5('DB1.Tabelle1.Passwort') FROM DB1.Tabelle1
Wo könnte das Problem liegen? Besten Dank für Eure Antworten.
Cheers
Hallo,
Hier mein (gewünschter) Query, der aber nicht funktioniert:
INSERT INTO DB2.Tabelle1 (id,username,password) SELECT DB1.Tabelle1.id, DB1.Tabelle1.KNID, md5('DB1.Tabelle1.Passwort') FROM DB1.Tabelle1
Duplicate entry '1' for key 1
kein Wunder.
Oder mit IGNORE geht's auch, aber dann habe ich beim Passwort einfach 1000xMal den selben Wert. Die Benutzernamen werden alle korrekt kopiert.
Wo könnte das Problem liegen? Besten Dank für Eure Antworten.
Du möchtest den MD5-Hash des jeweiligen Eintrages speichern. Derzeit speicherst Du den MD5-Hash einer stets gleichen Zeichenkette. Wunderst Du Dich, dass dabei stets das gleiche herauskommt.
Eine Frage zum Schluss: Stehen in DB1.Tabelle1.Passwort Klartextpasswörter?
Freundliche Grüße
Vinzenz
Moin!
INSERT INTO DB2.Tabelle1 (id,username,password) SELECT DB1.Tabelle1.id, DB1.Tabelle1.KNID, md5('DB1.Tabelle1.Passwort') FROM DB1.Tabelle1
Duplicate entry '1' for key 1
kein Wunder.
Oder mit IGNORE geht's auch, aber dann habe ich beim Passwort einfach 1000xMal den selben Wert. Die Benutzernamen werden alle korrekt kopiert.
Wo könnte das Problem liegen? Besten Dank für Eure Antworten.
Du möchtest den MD5-Hash des jeweiligen Eintrages speichern. Derzeit speicherst Du den MD5-Hash einer stets gleichen Zeichenkette. Wunderst Du Dich, dass dabei stets das gleiche herauskommt.
Du hast zwar einen Fehler gefunden, und der Fehler paßt anscheinend auch zur Fehlermeldung, aber insgesamt ergibt es keinen Sinn. Denn wer markiert denn schon ein MD5-Hash-Passwortfeld als UNIQUE? Viel sinnvoller wäre doch, das ID-Feld also UNIQUE bzw. PRIMARY zu markieren.
Wir sind also noch mindestens einen Schritt mehr von der Lösung entfernt.
- Sven Rautenberg
Hallo zusammen
Danke vielmals für eure Antworten.
Inzwischen habe ich die DB2.Tabelle1 so angepasst:
id int(11), Primary Key, auto_increment
username varchar(80)
password varchar(32)
Wenn ich nun:
INSERT INTO DB2.Tabelle1 (username,password) SELECT DB1.Tabelle1.KNID, DB1.Tabelle1.Passwort FROM DB1.Tabelle1
nehme funktioniert das Ganze ohne Fehler. Sobald ich aber die MD5 Funktion wieder einbaue, wird in der Passwortspalte nur immer der erste Wert aus DB1.Tabelle1.Passwort encodiert, wieso? Die Werte aus der Benutzerspalte werden korrekt übernommen.
INSERT INTO DB2.Tabelle1 (username,password) SELECT DB1.Tabelle1.KNID, md5('DB1.Tabelle1.Passwort') FROM DB1.Tabelle1
Da das Ganze wohl nicht machbar ist in einem Query, gibt's halt noch ein
UPDATE DB2.Tabelle1 SET password = MD5(password)
dazu.
@Vinzenz: Stehen in DB1.Tabelle1.Passwort Klartextpasswörter? --> Ja, leider. Kommen aus einer individuell entwickelten ERP-Lösung auf Access Basis.
Cheers
Moin!
Inzwischen habe ich die DB2.Tabelle1 so angepasst:
Sobald ich aber die MD5 Funktion wieder einbaue, wird in der Passwortspalte nur immer der erste Wert aus DB1.Tabelle1.Passwort encodiert, wieso?
Diese Frage hat dir Vinzenz schon beantwortet: Du fügst immer dem MD5-Wert eines konstanten Strings ein.
Das Passwort aller Accounts lautet: DB1.Tabelle1.Passwort
Fällt der Groschen?
UPDATE DB2.Tabelle1 SET password = MD5(password)
Hier gehts doch auch ohne Fehler.
- Sven Rautenberg
INSERT INTO DB2.Tabelle1 (username,password) SELECT DB1.Tabelle1.KNID, DB1.Tabelle1.Passwort FROM DB1.Tabelle1
hier hast Du ein Feld: DB1.Tabelle1.Passwort
nehme funktioniert das Ganze ohne Fehler. Sobald ich aber die MD5 Funktion wieder einbaue, wird in der Passwortspalte nur immer der erste Wert aus DB1.Tabelle1.Passwort encodiert, wieso? Die Werte aus der Benutzerspalte werden korrekt übernommen.
INSERT INTO DB2.Tabelle1 (username,password) SELECT DB1.Tabelle1.KNID, md5('DB1.Tabelle1.Passwort') FROM DB1.Tabelle1
Hier hast Du eine Zeichenkette: 'DB1.Tabelle1.Passwort'
Das ist *kein* Feld. Es ist immer die gleiche Zeichenkette, deren Wert eben genau die Buchstaben 'DB1.Tabelle1.Passwort' sind.
Spaltennamen gehören *nicht* in einfache Anführungszeichen.
Da das Ganze wohl nicht machbar ist in einem Query, gibt's halt noch ein
Es ist machbar :-)
Svens Frage ist berechtigt. Wieso ein eindeutiger Index auf der Passwortspalte? Das ist keine gute Idee.
Wird ein Passwort abgelehnt, so weiß man, dass jemand anderes genau dieses Passwort hat. Jetzt muss man nur noch den nicht besonders geheimen Benutzernamen dazu finden.
Freundliche Grüße
Vinzenz