Trigger in MySQL erstellen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
befehl
code
datenbank
datum
email
erstellen
forum
login
methode
not
null
registrierung
software
spalten
string
system
tabelle
trigger
update
url
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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 -
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 :)
-
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 -
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. -
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 -
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. -
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. -
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? -
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. -
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. -
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 -
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 -
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 -
Gern geschehen :) ist ja kein Hexenwerk.
-
Gern geschehen :) ist ja kein Hexenwerk.
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?. -
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. -
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 -
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. -
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage