der henry: mysql inhalt eines Feldnamens ändern

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.

  1. Ich sehe nach ob der username existiert select username from apache_auth where username='user2';

  2. Ich ändere den usernamen update apache_auth set username='user_x' where username='user_2';

  3. Ich ändere das passwort update apache_auth set passwd='pass_neu' where username='user_x';

  4. 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

  1. Tach!

    1. Ich ändere den usernamen update apache_auth set username='user_x' where username='user_2';

    2. Ich ändere das passwort update apache_auth set passwd='pass_neu' where username='user_x';

    3. 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.

    1. 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.

    1. 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

      --
      Es gibt nichts Gutes, außer man tut es!
      Das Leben selbst ist der Sinn.
  2. 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.

  3. 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.