Hallo,
ich habe laut Anleitung (Shopware 6 - Gewusst wie - Testumgebung anlegen) ein Testsystem erstellt, das unter einer eigenen Subdomain mit eigenem Verzeichnis läuft. Soweit funktioniert auch alles einwandfrei, allerdings ist es nicht möglich, einen Account im Frontend zu erstellen, im Log findet sich folgender Fehler:
Syntax error or access violation: 1142 TRIGGER command denied to user 'live_shop'@'localhost' for table `testsystem`.`customer_address`
Der Datenbank-User ‚live_shop‘ kann logischerweise keinen Trigger anlegen, da er nur Rechte für die Live-Datenbank hat, nicht für die Datenbank ‚testsystem‘ - der passende User wäre ‚test_shop‘. Ich kann aber keine Stelle finden, wo der falsche Datenbank-Nutzer gespeichert wird. Ich habe per grep das gesamte Dateisystem der Testinstallation durchsuchen lassen und auch eine volle Suche über alle Datenbank-Tabellen laufen lassen. Ohne Erfolg, der User scheint nirgendwo hinterlegt zu sein.
Cache habe ich natürlich (mehrfach) geleert, auch das komplette prod_xxxx-Verzeichnis gelöscht. Das Testsystem unter dev oder debug laufen zu lassen hat auch keine hilfreichen Hinweise ergeben.
Das gleiche passiert übrigens, wenn man im Shop-Backend die Adresse eines Kunden ändern will.
Woher könnte der falsche User denn kommen?
Viele Grüße
Stephan
Den gleichen User-Name für beide DB nutzen ist wohl die einfachste Lösung für das Problem.
Die Datenbank config wird in der .env definiert. Sonst ist mir keine andere Stelle bekannt. Wäre auch absoluter Wahnsinn, Datenbank-Konfigurationen irgendwo anders im Quelltext zu speichern.
Ich gehe schwer davon aus, dass irgendwas mit deiner Konfiguration nicht stimmt und das nicht auf Symfony/Shopware zurückzuführen ist.
@tarkka.ch Einfach ja, sinnvoll nein. Warum sollte der User der Testdatenbank Rechte für die Livedatenbank haben?
Ich habe mir dann die Trigger selbst nochmal angesehen. Beim mysqldump
der Datenbank wird der DEFINER mit ausgegeben und beim Import dann auch wieder eingelesen:
/*!50003 CREATE*/ /*!50017 DEFINER=`live_shop`@`localhost`*/ /*!50003 TRIGGER customer_address_vat_id_insert AFTER INSERT ON customer_address
Das führt dann dazu, dass der TRIGGER mit diesem User ausgeführt wird, was dann zur Fehlermeldung führt. Die Lösung ist entweder den Dump mit --skip-definer
zu erzeugen (ab MySQL 5.7.8).
Oder, wenn man nicht die ganze Datenbank neu importieren will, kann man die Trigger auch separat exportieren:
mysqldump -u root -p shop --triggers --add-drop-trigger --no-create-info --no-data --no-create-db --skip-opt test > triggers.sql
In der Datei dann den DEFINER ersetzen (sind 5 Ersetzungen für SW 6.4.18) und dann in die Test-Datenbank importieren:
mysql -u root -p testsystem < triggers.sql