2012-03-31 3 views
5

Wenn eine SQL-Dump mit phpmyadmin Export schafft es die VIEW-Tabelle wie folgt aus:Phpmyadmin Export VIEW ohne DATABASE_NAME oder ALGORITHM

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER 
VIEW `database`.`table` etc.. 

Jedes Mal, wenn ich manuell die SQL-Dump bearbeiten Sie die root Benutzer und database Namen zu entfernen .

+0

Ist dies überhaupt möglich:

sed -e 's/ALGORITHM.*DEFINER VIEW/VIEW/' backup-mysqldump.sql > backup.sql 

Sie auch mit mysqldump in einem einzigen Befehl, mit einem Rohr unter Verwendung können? Bin ich die einzige 1, die dieses Problem hat –

+0

Warum müssen Sie sie manuell entfernen? Führt es zu Problemen, wenn Sie versuchen, Ihre Daten in phpMyAdmin zu importieren? – Liyali

+0

Ja, weil dieser Benutzer in der anderen Umgebung nicht existiert. Auch der Datenbankname ändert sich manchmal. Es scheint nur seltsam, wie alle anderen Tabellen ohne diese exportieren. –

Antwort

10

Vielleicht verstehe ich nicht ... aber das hat immer für mich funktioniert. Es gibt keine Hinweise auf den Namen der Datenbank und alle definers bekommen ausgelöscht, so ist es super-einfach aus der Datei wiederherstellen erzeugt:

mysqldump -uUSERNAME -pPASSWORD database | sed -e 's/DEFINER=[^*]*\*/\*/' > backup.sql 

wieder her:

mysql -uUSERNAME -pPASSWORD database < backup.sql 

Solange die Datenbank, die Sie Wiederherstellen zu existieren (leer oder nicht), funktioniert wie ein Charme.

+0

Perfekt danke –

0

Erzeugt eine Sicht mit DEFINER = {Benutzer | CURRENT_USER} und mit vollständig qualifiziertem Tabellennamen, da PHPMyADMIN während des Exportvorgangs SHOW CREATE VIEW database_name ausführt. view_name; Das gibt alle diese Werte zurück, da es Teil des Ergebnisses SHOW CREATE VIEW ist. Siehe this.

1

Um Datenbanknamen aus dem Ergebnis zu entfernen, sollten Sie den Standard-Datenbanknamen, z. -

CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER VIEW `view1` 
AS SELECT `table1`.`column1` AS `column1` FROM `table1` 

Die definer ist eine Ansicht Eigenschaft, ich habe keine Optionen gesehen, die diese Eigenschaft aus dem entfernen konnte -

USE db_name; 
SHOW CREATE VIEW view_name; 

Sie werden so etwas wie dieses (DDL ohne Datenbanknamen) erhalten SHOW CREATE VIEW Ergebnis. Also müssen Sie den Text analysieren und manuell ändern.


Außerdem können Sie versuchen, 'generieren Schema Script' oder 'Backup' Werkzeug mit 'Klauseln DEFINER und SQL SECURITY ausschließen' Option in dbForge Studio for MySQL. Es wird Ihnen helfen, das Skript, das Sie in wenigen Schritten erzeugen möchten:

  • wählen Ansicht im Datenbank-Explorer
  • öffnen Popup-Menü und klicken Sie auf ‚Gene Schema Script ...‘ Befehl
  • Fund Option 'DEFINER- und SQL SECURITY-Klauseln ausschließen' und aktivieren Sie diese Option
  • Klicken Sie auf 'Erzeugen', um SQL-Text zu erstellen und zu öffnen.
+0

Leider musste ich immer noch phpmyadmin verwenden. Irgendwelche Ideen, wie man den phpmyadmin Quellcode bearbeitet? –

1

Wenn eine SQL-Dump mit phpmyadmin Export schafft es die VIEW-Tabelle wie folgt aus:

Ich habe mit mysqldump geprüft, die genau tut das gleiche. Sowohl mysqldump als auch PHPMyAdmin scheinen SHOW CREATE auszuführen, was dazu führt, dass in der create-Anweisung ein Sicherheitsdefinierer vorhanden ist. Ich sehe keinen Weg, "es auszuschalten".

Jedes Mal muss ich den SQL-Dump manuell bearbeiten, um den Root-Benutzer und den Datenbanknamen zu entfernen.

Hier kann ich aber helfen. Manuelles Bearbeiten einer SQL-Datei ist die Hölle und es ist zu fehleranfällig. Ich hatte diese Probleme zuvor, wo der exportierende Benutzer nicht auf der Plattform vorhanden war, die ich importieren wollte. Das einzige, was ich bearbeiten musste, war alles zwischen CREATE und VIEW.

Jetzt, da Sie Ihre Frage mit php markiert haben, stelle ich mir vor, Sie wissen, wie man es von der Befehlszeile aus verwendet.Hier ist ein Skript, das alle nicht-notwendigen Werte mit einem leeren String ersetzt:

<?php 

$string = 'CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER 
    VIEW `database`.`table` AS'; 

$string = preg_replace(
    '/CREATE .*(TABLE|VIEW) `[^`]+`\.(`[^`]+`)/s', 
    'CREATE $1 $2', 
    $string 
); 

var_dump($string); 

Vielleicht nicht eine direkte Antwort auf Ihre Frage, aber es sollten Sie vermeiden, dass manuell die Deponien bearbeiten.

+0

Sehr überrascht, das ist keine Option in phpmyadmin, die einfach ausgeschaltet werden kann. Wo kann ich den Code bearbeiten, den Sie im phpmyadmin-Quellcode vorgeschlagen haben? –

0

Ich benutze dieses einfache Skript zum Entfernen nach

mit mysqldump Export
<?php 
$file = file_get_contents($argv[1]); 
$position = strpos($file, 'Final view structure for view'); 
if (false !== $position) { 
    echo substr($file, 0, $position); 
} 
else { 
    die('not found'); 
} 

https://gist.github.com/kissarat/bbf33d10f9d7a3bc1adb

-1

In Linux ist es sehr einfach unerwünschte Informationen in einer Textdatei zu entfernen. Da CREATE VIEW schafft so etwas wie:

CREATE ALGORITHM = UNDEFINED DEFINER = USER @HOST SQL SECURITY DEFINER VIEW VIEWNAME ... etc.

Sie können folgende sed verwenden:

mysqldump -uUSERNAME -pPASSWORD database |sed -e 's/ALGORITHM.*DEFINER VIEW/VIEW/' > backup.sql