kostenloser Webspace werbefrei: lima-city


Trigger in MySQL erstellen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    j****x

    Hallo zusammen,

    gibt es hier jemanden der mir eine Trigger Anweisung zum erstellen eines Triggers in einer MySQL Datenbank erstellen kann? Kurz zur Erklärung:

    Ich habe eine Tabelle "accounts", dort sind die Registrierten User mit den Spalten username, email und password. Diese 3 Spalten in der Tabelle sollen automatisch auch ins externe Forum übernommen werden das die gleichen Spalten und Bezeichnungen führt. Eben nur in einer anderen Tabelle. Das Forum ist in der gleichen Datenbank aber die Tabelle heißt dort "forumusers". Leider bin ich absoluter Anfänger was MySql angeht. Hab die verschiedensten Beispiele gelesen etc aber bekomme es leider nicht hin. Bisher kopiere ich die Einträge noch manuell per Hand, was aber auch keine gute Lösung ist.

    Es wäre echt super, wenn sich da jemand auskennt und mir hier weiterhelfen könnte.

    Viele liebe Grüße
    Ronny
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. h***********r

    Wieso kopierst du nicht nur bei einer Registrierung? Da dann einfach erst in Tabelle 1 und dann in Tabelle 2 dir Werte schreiben. Das wäre die schnellste Variante. Ansonsten geht auch noch das mit nem Cron die DB auslesen und jeden Eintrag der noch nicht in db2 ist zu erstellen. Oder einfacher, Tabelle in db2 leeren und komplett aus db1 kopieren. Allerdings gibt es dabei ne Verzögerung von der Registrierung bis dann dir Daten auch für den Foren Login da sind.

    Beitrag zuletzt geändert: 19.10.2017 8:13:58 von horstexplorer
  4. fussballturnier

    fussballturnier hat kostenlosen Webspace.

    horstexplorer schrieb:
    Wieso kopierst du nicht nur bei einer Registrierung? Da dann einfach erst in Tabelle 1 und dann in Tabelle 2 dir Werte schreiben.

    Da hat horstexplorer wohl recht und muss ihm zustimmen. Du müsstest im PHP Code einfach das gleiche Statement nochmal in die andere Tabelle ausführen dann hättest du dir den Trigger gespart.

    Aufwändig ist so ein Trigger nun gar nicht und es ist demnach auch (eigentlich) besser viel Logik in die Datenbank zu kriegen als in die Anwendung (PHP) selbst.

    Wenn du noch Hilfe benötigst beim erstellen des Triggers kann ich dir ja helfen. Oder du versuchst es in der Programmlogik zu lösen das du das selbe Statement nur mit einer anderen Zieltabelle ausführst.

    Kannst hier ja kurz bescheid geben wie du verfahren willst :)

  5. Autor dieses Themas

    j****x

    Wieso kopierst du nicht nur bei einer Registrierung? Da dann einfach erst in Tabelle 1 und dann in Tabelle 2 dir Werte schreiben. Das wäre die schnellste Variante. Ansonsten geht auch noch das mit nem Cron die DB auslesen und jeden Eintrag der noch nicht in db2 ist zu erstellen. Oder einfacher, Tabelle in db2 leeren und komplett aus db1 kopieren. Allerdings gibt es dabei ne Verzögerung von der Registrierung bis dann dir Daten auch für den Foren Login da sind.


    Hallo,

    danke für Eure Antworten. An diese Lösung dachte ich eben auch schon, da die Software die ich nutze aber noch recht neu ist und sehr viel immer noch verändert wird und schon wurde am Code würde bei jedem Update der Code wieder überschrieben werden. Hinzu kommt das es noch ein Facebook, Instagram und Twitter Login gibt. Hier ist mir dann einfach der Weg mittels Trigger lieber, auch muss ich dann bei Updates der Dateien nicht immer alles neu eintragen.

    Viele herzliche Grüße
    Ronny
  6. h***********r

    jippyx schrieb:
    Wieso kopierst du nicht nur bei einer Registrierung? Da dann einfach erst in Tabelle 1 und dann in Tabelle 2 dir Werte schreiben. Das wäre die schnellste Variante. Ansonsten geht auch noch das mit nem Cron die DB auslesen und jeden Eintrag der noch nicht in db2 ist zu erstellen. Oder einfacher, Tabelle in db2 leeren und komplett aus db1 kopieren. Allerdings gibt es dabei ne Verzögerung von der Registrierung bis dann dir Daten auch für den Foren Login da sind.


    Hallo,

    danke für Eure Antworten. An diese Lösung dachte ich eben auch schon, da die Software die ich nutze aber noch recht neu ist und sehr viel immer noch verändert wird und schon wurde am Code würde bei jedem Update der Code wieder überschrieben werden. Hinzu kommt das es noch ein Facebook, Instagram und Twitter Login gibt. Hier ist mir dann einfach der Weg mittels Trigger lieber, auch muss ich dann bei Updates der Dateien nicht immer alles neu eintragen.

    Viele herzliche Grüße
    Ronny


    Dann würde ich das Login System komplett anders machen. Schreib es einfach alles in eine Tabelle, dann ist es egal für welche Anwendung du die nutzt. Also dein Formular auf die gleiche Datenbank /Tabelle legen.

    Ist resourcen spaarender.
  7. Autor dieses Themas

    j****x

    Dann würde ich das Login System komplett anders machen. Schreib es einfach alles in eine Tabelle, dann ist es egal für welche Anwendung du die nutzt. Also dein Formular auf die gleiche Datenbank /Tabelle legen.

    Ist resourcen spaarender.


    Wie gesagt, es handelt sich hier um zwei unterschiedliche Systeme. Einmal die Hauptseite und zum anderen das Forum. Bei jedem Update würden diese Dateien wieder überschrieben und deshalb wäre mir der Weg des Triggers lieber, zumal ich dann auch ein System wie zb das Forum mal flexibel austauschen kann ohne Dateien groß wieder ändern zu müssen etc. Ein weiterer Grund ist das ich den ganzen gestrigen Tag schon damit verbracht habe, die entsprechende Datei zu finden die diese Anweisung enthält aber es ist bis jetzt mir nicht gelungen diese zu finden. Vieles enthält auch Scripte, so das es durchaus sein kann das es in ein Script ausgelagert ist.

    Ich möchte daraus kein Staatsakt machen und deshalb sehe ich die Möglichkeit des Triggers einfach als die bessere für mich an. Ich brauche einfach nur eine gute Möglichkeit die Daten immer von Tabelle 1 in Tabelle 2 zu bekommen sobald sich jemand Registriert. Ich bin jetzt leider mit Chron und MySQl nicht so wirklich fit.

    Oder einfacher, Tabelle in db2 leeren und komplett aus db1 kopieren. Allerdings gibt es dabei ne Verzögerung von der Registrierung bis dann dir Daten auch für den Foren Login da sind.


    Die Datenbank des Forums enthält auch noch andere Spalten die nicht mit der Ersten Software identisch sind. Nur username, email und passoword sind identisch mit der ersten Tabelle falls das Hilft. Deshalb möchte ich auch nur diese Werte übernehmen alles andere kann der User im Forenprofil selbst eintragen

    Beitrag zuletzt geändert: 19.10.2017 13:37:06 von jippyx
  8. fussballturnier

    fussballturnier hat kostenlosen Webspace.

    Bei den Triggern könnte ich dir dann weiterhelfen, bräuchte dann nur nochmal ne exakte Auflistung der Datenbanktabellen die dort miteinander agieren sollen.
    Bedenke, MySQL kann keine Zirkelbezüge verarbeiten (zumindest kenne ich das noch so) d.h. du musst festlegen von welcher Tabelle die Daten in die andere geschrieben werden sollen. Du kannst nicht auf beiden Trigger erzeugen die jeweils in die andere die Daten kopieren dann biste in nem Deadlock.
  9. Autor dieses Themas

    j****x

    Bei den Triggern könnte ich dir dann weiterhelfen, bräuchte dann nur nochmal ne exakte Auflistung der Datenbanktabellen die dort miteinander agieren sollen.
    Bedenke, MySQL kann keine Zirkelbezüge verarbeiten (zumindest kenne ich das noch so) d.h. du musst festlegen von welcher Tabelle die Daten in die andere geschrieben werden sollen. Du kannst nicht auf beiden Trigger erzeugen die jeweils in die andere die Daten kopieren dann biste in nem Deadlock.


    Vielen lieben Dank, das ist echt total nett von Dir.
    Also die Tabelle accounts ist die Haupttabelle wo die Spalten username, password und email relevant sind. Diese sollen automatisch in die Tabelle forumusers in die Spalten username, pasword und email geschrieben werden.

    Cool wäre auch das es sich automatisch abgleicht wenn man mal ein neues Passwort festlegt, aber keine Ahnung ob das geht. Also der Trigger in die eine Richtung reicht hier völlig aus, beidseitig bräuchte ich auch nicht da das Forum keine eigene Registrationsmöglichkeit für User hat, da ich die Daten bislang ja manuell eingetragen habe.
  10. fussballturnier

    fussballturnier hat kostenlosen Webspace.


    Cool wäre auch das es sich automatisch abgleicht wenn man mal ein neues Passwort festlegt, aber keine Ahnung ob das geht. Also der Trigger in die eine Richtung reicht hier völlig aus, beidseitig bräuchte ich auch nicht da das Forum keine eigene Registrationsmöglichkeit für User hat, da ich die Daten bislang ja manuell eingetragen habe.


    Wie meinst du das genau? Es ist so, wenn du über die Datenbank oder über ein PHP Script Daten veränderst wie beispielsweise die Emailadresse dann würde der Trigger greifen und die Daten von Tabelle "accounts" in die tabelle "forumusers" schreiben. Wieso willst du es denn abgleichen wenn es sich geändert hat?
  11. Autor dieses Themas

    j****x

    Wie meinst du das genau? Es ist so, wenn du über die Datenbank oder über ein PHP Script Daten veränderst wie beispielsweise die Emailadresse dann würde der Trigger greifen und die Daten von Tabelle "accounts" in die tabelle "forumusers" schreiben. Wieso willst du es denn abgleichen wenn es sich geändert hat?


    Genau das meinte ich auch damit, ich habe mich nur doof ausgedrückt, sorry. Genau das brauche ich.
  12. Um welche Produkte handelt es sich denn überhaupt?
    Ob die Passwörter überhaupt ohne Anpassung der Software 1:1 übernommen werden können ist fraglich.
    Je nachdem, ob beide die selben Methoden zum Hashen von Passwörtern nutzen oder nicht.
  13. Autor dieses Themas

    j****x

    Je nachdem, ob beide die selben Methoden zum Hashen von Passwörtern nutzen oder nicht.


    Das tun sie. Ich kopiere ja auch nur die Daten der Spalten der jeweiligen Tabelle mauell in die andere und ein Login Funktioniert bisher einwandfrei. Also das von Dir angesprochene Problem tritt hier nicht auf.

    Das Forum ist das FluxBB Forum und die Hauptsoftware ist eine abgewandelte Beta der Humhub Software
  14. fussballturnier

    fussballturnier hat kostenlosen Webspace.

    So, ich habe mal in einer XAMPP Installation dein Beispiel angelegt und dir den SQL-Code Exportiert.

    --
    -- Tabellenstruktur für Tabelle `accounts`
    --
    
    DROP TABLE IF EXISTS `accounts`;
    CREATE TABLE IF NOT EXISTS `accounts` (
    `A_ID` int(11) NOT NULL,
      `Username` varchar(100) COLLATE utf8_bin NOT NULL,
      `Email` varchar(100) COLLATE utf8_bin NOT NULL,
      `Passwort` varchar(100) COLLATE utf8_bin NOT NULL
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;


    --
    -- Tabellenstruktur für Tabelle `forumusers`
    --
    
    DROP TABLE IF EXISTS `forumusers`;
    CREATE TABLE IF NOT EXISTS `forumusers` (
    `F_ID` int(11) NOT NULL,
      `Username` varchar(100) COLLATE utf8_bin NOT NULL,
      `Email` varchar(100) COLLATE utf8_bin NOT NULL,
      `Passwort` varchar(100) COLLATE utf8_bin NOT NULL
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;


    Das hier müsstest du wohl einfügen.
    --
    -- Trigger `accounts`
    --
    DROP TRIGGER IF EXISTS `copy_on_update_accounts`;
    DELIMITER //
    CREATE TRIGGER `copy_on_update_accounts` AFTER INSERT ON `accounts`
     FOR EACH ROW BEGIN
    	INSERT into forumusers (username, email, passwort)
    	VALUES(new.username, new.email, new.passwort);
    END
    //
    DELIMITER ;


    Das ganze habe ich gerade eben mit:
    INSERT INTO `accounts` (`A_ID`, `Username`, `Email`, `Passwort`) VALUES
    (1, 'Test User', 'Test Email', 'Test Passwort');

    getestet und die Testdaten waren in beiden Tabellen.

    Und wieder muss ich den Text bearbeiten. Ich vergas zu fragen ob du das nur für ein Update benötigst oder auch für Inserts oder Deletes?


    muellerlukas schrieb:
    Um welche Produkte handelt es sich denn überhaupt?
    Ob die Passwörter überhaupt ohne Anpassung der Software 1:1 übernommen werden können ist fraglich.
    Je nachdem, ob beide die selben Methoden zum Hashen von Passwörtern nutzen oder nicht.

    Das habe ich nicht bedacht, guter Punkt aber es scheint wohl auch so zu funktionieren.

    Beitrag zuletzt geändert: 19.10.2017 15:11:05 von fussballturnier
  15. Autor dieses Themas

    j****x

    Vielen herzlichen Dank für die tolle Hilfe. Es hat geklappt. Vielen Dank auch für das Aufzeigen anderer Lösungswege und Bedenken.

    Viele liebe Grüße
    Ronny
  16. fussballturnier

    fussballturnier hat kostenlosen Webspace.

    Gern geschehen :) ist ja kein Hexenwerk. :thumb:
  17. Autor dieses Themas

    j****x

    Gern geschehen :) ist ja kein Hexenwerk. :thumb:


    Wenn man sich mit auskennt dann nicht, lach


    Aber einen Schönheitsfehler hat das ganze mit dem Trigger im Live betrieb wie ich festgestellt habe.Obwohl die Standard Sprache Deutsch ist stellt er sie auf English. Das konnte ich fixen indem ich den Trigger um die language erweitert habe. Soweit sogut klappt das auch.

    ABER. Er legt alle als Gäste in der Datenbank an mit der Group_id2, im Registrierungsformular des Forums werden die User aber z.B. als group_id4 (Mitglieder) registriert. Kann man dem trigger auch diesen "festen" Wert group_id4 mitgeben für neu angelegte User? Im account Ordner des Haupt Systems gibt es leider die group_id nicht als Spalte. Hat zur folge das ich dennoch alle User manuell von Gast die Mitglieder Gruppe zuweisen muss, was auch nervig ist

    Geht das auch mit so einem Trigger?.
  18. fussballturnier

    fussballturnier hat kostenlosen Webspace.

    Language im Trigger? Wie denn das? Oder meinst du einen String 'Deutsch' den du in eine Spalte language schreibst?

    Wenn ich das richtig verstehe müsstest du nur das INSERT um (group_id) erweitern und als VALUE ('group_id4') übertragen.
  19. Autor dieses Themas

    j****x

    Language im Trigger? Wie denn das? Oder meinst du einen String 'Deutsch' den du in eine Spalte language schreibst?


    Ja genau so meinte ich das auch. Ich Probiere das mal aus ob das klappt, das wäre super. Du wirst noch zu meinem persönlichen Held, Danke für Deine Hilfe :)

    hab es so abgeändert, hoffe das ist richtig so...

    BEGIN
    INSERT into forumusers (username, email, password, group_id, language)
    VALUES(new.username, new.email, new.password, group_id4, new.language);
    END

    Edit: wenn ich es so eintrage nimmt die Datenbank es zwar, aber Registrierungen gehen nicht mehr :(


    Beitrag zuletzt geändert: 20.10.2017 13:20:00 von jippyx
  20. fussballturnier

    fussballturnier hat kostenlosen Webspace.

    BEGIN
    INSERT into forumusers (username, email, password, group_id, language)
    VALUES(new.username, new.email, new.password, 'group_id4' , new.language);
    END

    Wenn group_id ein string ist dann musst du es als string Casten wenn es ein integer ist dann musst du eine zahl eintragen.
    Was bekommst du denn für eine Fehlermeldung?

    Ohne Zugriff auf die db kann ich grade keine Ferndiagnose betreiben da ich das datenmodell nicht kenne.
  21. Autor dieses Themas

    j****x

    Ohne Zugriff auf die db kann ich grade keine Ferndiagnose betreiben da ich das datenmodell nicht kenne.


    Keine Fehlermeldung, die Registration dreht sich ewig und es passiert nichts. Entferne ich das "group_id4"' wieder aus dem Trigger geht die Registrierung wieder einwandfrei
  22. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!