mysql inhalt eines Feldnamens ändern
der henry
- datenbank
2 dedlfix0 TS
0 RaketenTabellenFührer0 Linuchs
Hallo,
ich habe eine mysql Datenbank für die Webseitenauth. Bis jetzt habe ich alles über Webmin geändert, was aber aus irgendwelchen Gründen nicht mehr geht. Mit mysql habe ich schon ein bisschen gearbeitet, jedoch nie etwas an der Datenbank verändert.
Die Struktur, welche ich ändern will sieht so aus
apache_auth -> username:passwd:group:isonline
Dies ist z.B. nachfolgend gefüllt
username : passwd : group : isonline
===========================================
user_1 : pwd_1 : 99 : 0
user_2 : pwd_2 : 99 : 0
user_3 : pwd_3 : 99 : 0
Nun möchte ich username "user_2" nach "user_x" ändern.
Ich habe mir schon Gedanken gemacht, möchte aber von jemanden eine Bestätigung haben, da ich die Datenbank nicht zerschießen will.
Mein Vorschlag, der ungetestet ist.
Ich sehe nach ob der username existiert
select username from apache_auth where username='user2';
Ich ändere den usernamen
update apache_auth set username='user_x' where username='user_2';
Ich ändere das passwort
update apache_auth set passwd='pass_neu' where username='user_x';
Ich ändere die Gruppe
update apache_auth set group='23' where username='user_x';
usw.
Bin ich hier auf dem richtigen Weg ?
Danke
der henry
Tach!
Ich ändere den usernamen
update apache_auth set username='user_x' where username='user_2';
Ich ändere das passwort
update apache_auth set passwd='pass_neu' where username='user_x';
Ich ändere die Gruppe
update apache_auth set group='23' where username='user_x';
Wenn alle Änderungen gleichzeitig anfallen, kann man das auch in nur einem Statement machen.
- Ich sehe nach ob der username existiert
select username from apache_auth where username='user2';
Es reicht auch, nach dem Update zu schauen, ob es Änderungen gab (affected rows). Ansonsten kann man das Statement auch gefahrlos auf nicht existende Nutzer loslassen, dann passiert nichts weiter.
Was aber passieren kann: ein Unique-Constraint-Verletzung, wenn der neue Nutzername bereits existiert. Darauf sollte man gefasst sein.
dedlfix.
Hello,
Wenn alle Änderungen gleichzeitig anfallen, kann man das auch in nur einem Statement machen.
Wenn alle Änderungen gleichzeitig anfallen, kann muss man das auch in nur einem Statement machen, oder die Tabelle für die Dauer aller Änderungen sperren.
Anderenfalls gefährdet man bereits die zeilenweise Konsistenz der Tabelle, von der zeilenübergreifenden gar nicht erst zu reden...
Glück Auf
Tom vom Berg
möchte aber von jemanden eine Bestätigung haben, da ich die Datenbank nicht zerschießen will.
Die kann Dir niemand geben, weil wir zu wenig über Gesamtwerk wissen. Es kann da weitere Abhängigkeiten geben, z.B. weitere Tabellen die den Benutzername (der ja hoffentlich „unique“ genug ist) beinhalten.
Totzdem kann ich Dir helfen.
So machst Du ein Backup Deiner Tabelle in eine neue Tabelle:
CREATE TABLE `DEIN_BACKUP` LIKE `DEINE_TABELLE`;
INSERT INTO `DEIN_BACKUP` SELECT * FROM `DEINE_TABELLE`;
Wenn Du es zurückspielen wisst:
TRUNCATE TABLE `DEINE_TABELLE`;
INSERT INTO `DEINE_TABELLE` SELECT * FROM `DEIN_BACKUP`;
Auf die Alternative mit
~> mysqldump -u... -p... DEINE_DATENBANK DEINE_TABELLE > DEINE_TABELLE_DUMP.sql
mit dem „Rücksetzer“
~> mysql -u... -p... DEINE_DATENBANK < DEINE_TABELLE_DUMP.sql
sei ausdrücklich verwiesen.
Beachte bitte: In beiden Fällen gehen aber durch das Zurücksetzen alle zwischenzeitlichen Änderungen verloren!
Bis jetzt habe ich alles über Webmin geändert, was aber aus irgendwelchen Gründen nicht mehr geht
Die Formulierung „was aber aus irgendwelchen Gründen nicht mehr geht“ hält mich ebenfalls davon ab, irgendeine Erklärung dazu abzugeben, ob irgendetwas wie beabsichtigt funktionieren werde oder auch nur könnte.
Die Struktur, welche ich ändern will sieht so aus
apache_auth -> username:passwd:group:isonline
Den Status „isonline“ in der Datenbank speichern zu wollen ist, weil der Benutzer sich nicht zwingend selbst abmeldet, zweckfrei. Niemand weiß, ob der Benutzer „online“ ist.
Deshalb: Ich hoffe, Du hast das Passwort nicht im Klartext gespeichert.
select username from apache_auth where username='user2';
Ist das Feld username als unique key definiert? Sonst könntest du mehr als einen Treffer bekommen.
update apache_auth set username='user_x' where username='user_2';
user_2
ist ein anderer Datensatz als user2
Wenn das Feld username als unique key definiert ist und der Wert user_x
bereits vorhanden, gibt es einen Fehler.
Üblicherweise gibt man jedem Datensatz eine unveränderliche, einzigartige id. Wenn die angesprochen wird mit where id=839
gibt es sie nicht oder genau einmal.