Tabellen namen mit migration umbenenen

In diesem Forum gibt es Starthilfe zum neuen Extension-System von phpBB 3.1/3.2. Fragen zur Entwicklung von Extensions und zur Konvertierung von phpBB 3.0.x MODs sind ebenfalls willkommen.
Benutzeravatar
chris1278
Mitglied
Beiträge: 4115
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Tabellen namen mit migration umbenenen

Beitrag von chris1278 »

Hallöchen. Ich habe um einen Tabellen namen zu ämndern in meiner Extension dies hier probiert:

Code: Alles auswählen

public function update_data()
{
	return array(

		array('custom', array(array($this, 'update_table'))),
	);
}

public function update_table()
{

	$sql = 'ALTER TABLE ' . $this->table_prefix . 'altename RENAME TO ' . $this->table_prefix . 'neuename';

	$this->db->sql_query($sql);
}

Das funktioniert auch. MeineFrage ist gibt es ein Weg dies auch kürzer zu gestallten. bzw. hat phpbb in seinem System da für eine möglichkeit.
Benutzeravatar
IMC
Mitglied
Beiträge: 900
Registriert: 25.11.2018 20:32
Wohnort: Lüneburg
Kontaktdaten:

Re: Tabellen namen mit migration umbenenen

Beitrag von IMC »

Hi Chris,

wenn dies für eine offizelle Extension ist kannst du dies so nicht machen.
Der SQL-Befehl wird so von MariaDB 5.1 und MS SQL Server 2000 nicht unterstützt.

Für eine lokale Erweiterung kein Problem.

phpbb selbst, hat keine Funktion um Tabellen oder Tabellenspalten umzubenennen.
Gruß, Thorsten

Meine Extensions
Benutzeravatar
chris1278
Mitglied
Beiträge: 4115
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: Tabellen namen mit migration umbenenen

Beitrag von chris1278 »

Ja das ist für meine Simple gallery gedacht. CIh hab da einen fehler drin und den müsste ich mit ner namens änderung beheben.

Wie kann man das den lösen ohne die tabelle neu anzulegen und die daten zu im,portieren.

Oder wäre dies hier eine alternative option:

Code: Alles auswählen

public function update_data()
{
	return array(

		array('custom', array(array($this, 'update_table'))),
	);
}

public function update_table()
{

	$sql = 'RENAME TABLE ' . $this->table_prefix . 'altename RENAME TO ' . $this->table_prefix . 'neuename';

	$this->db->sql_query($sql);
}
Benutzeravatar
IMC
Mitglied
Beiträge: 900
Registriert: 25.11.2018 20:32
Wohnort: Lüneburg
Kontaktdaten:

Re: Tabellen namen mit migration umbenenen

Beitrag von IMC »

Leider nein.
RENAME TABLE alter_name TO neuer_name;
Funktioniert soweit ich weis nur bei MySQL und MariaDB. Bei MariaDB gibt es auch unterschiede in den Programmversionen.

Der Weg, der am wenigsten Probleme mit der Kompabilität bringen wird ist eine Custom-Funktion.

-> Neue Tabelle erstellen.
-> Daten aus der alten Tabelle einlesen
-> Daten in die neue Tabelle schreiben
-> Alte Tabelle löschen

Diesen Ablauf kannst du mit den phpBB integrierten Funktionen erstellen. Zum Erstellen und Löschen der Tabelle kannst du die DB-Tools von phpBB nutzen.
https://area51.phpbb.com/docs/code/3.3. ... tools.html

Auf die Methoden von DB-Tools kanst du in der Migration direkt zugreifen.
z.B. $this->db_tools->sql_create_table(string $table_name, array $table_data)

Edit:
Kapsel deine DB Aktionen mit:

Code: Alles auswählen

	$this->db->sql_transaction('begin');
	
	// Dein Code
	
	$this->db->sql_transaction('commit');	
So kannst du sicherstellen das niemand in die Tabelle schreibt wärend du die Daten kopierst. Kann beim aktivieren wärend der Migration eigendlich nicht passieren. Aber damit ist man immer auf der sicheren Seite.
Gruß, Thorsten

Meine Extensions
Benutzeravatar
chris1278
Mitglied
Beiträge: 4115
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: Tabellen namen mit migration umbenenen

Beitrag von chris1278 »

Die tabelle erstellen ist nicht das Problem. Dies kann ich mit migration so machen:

Code: Alles auswählen

public function update_schema()
{
	return [
		'add_tables' => [
			$this->table_prefix . 'chris1278_sg_Info' => [
				'COLUMNS' => [
					'sg_info_id'					=> ['UINT', null, 'auto_increment'],
					'sg_info_old_user_id'			=> ['UINT'			, 0],
					'sg_info_username'				=> ['VCHAR:255'		, ''],
					'sg_info_username_clean'		=> ['VCHAR:255'		, ''],
					'sg_info_perm_dir_user_hash'	=> ['VCHAR:255'		, ''],
				],
				'PRIMARY_KEY' => [
					'sg_info_id',
				],
			]
		],
	];
}
Ich dachte ich könnte mir den weg mittels umbennen einfach machen damit ich eben nicht die ganzen einträge übernehmen muss. naja dann mus ich wohl. oder ich psse die abfrage an dann spare ich mir das mit dem umschreiben.
Benutzeravatar
IMC
Mitglied
Beiträge: 900
Registriert: 25.11.2018 20:32
Wohnort: Lüneburg
Kontaktdaten:

Re: Tabellen namen mit migration umbenenen

Beitrag von IMC »

chris1278 hat geschrieben: 24.12.2025 13:18Dies kann ich mit migration so machen:
Das ist richtig. Nur dann hat man nicht die 100%'ige Kontrolle über die Abfolge der Befehle.
Dieses Problem kann man dann lösen indem man zwei Migrationsdateien erstellt.
damit ich eben nicht die ganzen einträge übernehmen muss
Um dies Problem einfach zu lösen kann man Werte, bei denen es Sinn macht, über Konstanten definiert.
Gruß, Thorsten

Meine Extensions
Benutzeravatar
LukeWCS
Supporter
Supporter
Beiträge: 3321
Registriert: 15.12.2014 10:19

Re: Tabellen namen mit migration umbenenen

Beitrag von LukeWCS »

Die Trennung von Schema Änderungen in separate Migrationsdateien wird auch in den Ext Doks empfohlen, wenn ich das richtig in Erinnerung habe.
Möge das Backup mit dir sein. Immer.
Kein Support via PN! Siehe den Punkt "Private Nachrichten" im phpBB.de-Knigge.
Erweiterungen - Infos zur artgerechten Haltung / phpBB Ext Check - Analyse von Erweiterungen bezüglich Vorgaben und Kompatibilität
Benutzeravatar
chris1278
Mitglied
Beiträge: 4115
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: Tabellen namen mit migration umbenenen

Beitrag von chris1278 »

Ok. Da es sich aber um meine Gallery handelt brauch ich das hier nicht zu berücksichtigen:

Code: Alles auswählen

	$this->db->sql_transaction('begin');
	
	// Dein Code
	
	$this->db->sql_transaction('commit');	
weil man mus dafür ja eh die erweiterung deaktivieren und da dies nichst mit z.B. BEiträgen oder so zu tun hat besteht da eigentlich keine gefahr das da was dazwischen funkt.

@edit

habs jetzt angepasst auch das sql_tranaction hab ich am anfang und am ende eingefügt.

Hab dann drei dateien erstellt.

In der Ersten datei lege ich eine Temporäre tabelle an mit den selben spalten namen wie die info tabelle. Anschliessend lese ich die info tabell mit foreach aus und schreinbe zeile rein und lösche die geschriebene zeile und das solange bis alle in der info tabelle rübergeschoben sind.

Code: Alles auswählen

public function rename_step_2()
{
	$this->db->sql_transaction('begin');

	$sql = 'SELECT *
			FROM ' . $this->table_prefix . 'chris1278_sg_Info
			WHERE 1';
	$result = $this->db->sql_query($sql);
	$info_row	= $this->db->sql_fetchrowset($result);
	$this->db->sql_freeresult($result);

	foreach ($info_row as $row)
	{
		$sql_insert = [
			'sg_info_id'					=> $row['sg_info_id'],
			'sg_info_old_user_id'			=> $row['sg_info_old_user_id'],
			'sg_info_username'				=> $row['sg_info_username'],
			'sg_info_username_clean'		=> $row['sg_info_username_clean'],
			'sg_info_perm_dir_user_hash'	=> $row['sg_info_perm_dir_user_hash'],
		];

		$this->db->sql_query('INSERT INTO ' . $this->table_prefix . 'chris1278_temp ' . $this->db->sql_build_array('INSERT', $sql_insert));

		$sql = 'DELETE FROM ' . $this->table_prefix . 'chris1278_sg_Info
			WHERE sg_info_id = "' .  (int) $row['sg_info_id'] . '"';

		$sql = $this->db->sql_query($sql);
	}
}
}
Im zweiten schritt also in der zweiten datei lösche ich dann die leere tabelle und erstelle mit korrektem namen neu und dann führe ich das skript oben wieder aus nur andersrum.

in der Dritten datei lösche ich die temporäre tabelle und fertig.
Benutzeravatar
LukeWCS
Supporter
Supporter
Beiträge: 3321
Registriert: 15.12.2014 10:19

Re: Tabellen namen mit migration umbenenen

Beitrag von LukeWCS »

Hi Thorsten

Normal halte ich mich bei SQL raus, weil so gar nicht mein Gebiet. :oops: Aber da das Problem mit der falsch benannten Tabelle aktuell auch in unserem privaten Bastelforum ein Thema ist bezüglich Details, erinnerte ich mich an das Thema hier und grätsche mal rein.
IMC hat geschrieben: 24.12.2025 11:33 wenn dies für eine offizelle Extension ist kannst du dies so nicht machen.
Der SQL-Befehl wird so von MariaDB 5.1 und MS SQL Server 2000 nicht unterstützt.
Sind diese alten Versionen der DB Engines wirklich noch relevant? Laut dem End-Of-Life Dienst, gäbe es folgende Daten dazu:
MSSQL Server 2000:

Entwicklung:
Ended 17 years ago
(08 Apr 2008)

Security Support:
Ended 12 years ago
(09 Apr 2013)

MariaDB 5.1:

Entwicklung:
Ended 10 years ago
(01 Feb 2015)

Security Support:
Ended 10 years ago
(01 Feb 2015)
Quelle: https://endoflife.date

Ich würde behaupten, das diese "Antiquitäten" heute eher keine Rolle mehr spielen und nicht mehr berücksichtigt werden müssen. Wer noch so "alten" Kram auf seinem Server hat, der kann eh keine aktuelle phpBB Version ausführen, weil da auch mit Sicherheit alles andere hoffnungslos veraltet ist und nicht die Voraussetzungen für phpBB 3.3 erfüllen kann.

Ich frage deswegen, weil die ganze manuelle Umsetzung der Daten von alter Tabelle in neue Tabelle ist ja übelster Aufwand, nur um eine Tabelle umzubenennen. :o Das Problem ist unter anderem auch, das noch eine temporäre Tabelle als Zwischenschritt benötigt wird, weil es je nach OS noch Unterschiede bezüglich "case sensitive" gibt. Bei Windows basierten Servern wäre das wohl nötig, bei Linux basierten dagegen nicht, wenn meine Recherche stimmt.

Dann habe ich mich mal in meinem lokalen Ext Archiv umgeschaut, wo ich im Laufe vieler Jahre viele Exts gesammelt habe. Da wurde ich auch direkt fündig bei der offiziellen phpBB Ext "Pages". Schon die Version 2.0.5 von 2021 hat ALTER TABLE xxx RENAME TO yyy genutzt.

Deswegen würde ich behaupten, dass das eher kein Problem (mehr) darstellen sollte. Oder wie siehst du das?
Möge das Backup mit dir sein. Immer.
Kein Support via PN! Siehe den Punkt "Private Nachrichten" im phpBB.de-Knigge.
Erweiterungen - Infos zur artgerechten Haltung / phpBB Ext Check - Analyse von Erweiterungen bezüglich Vorgaben und Kompatibilität
Benutzeravatar
IMC
Mitglied
Beiträge: 900
Registriert: 25.11.2018 20:32
Wohnort: Lüneburg
Kontaktdaten:

Re: Tabellen namen mit migration umbenenen

Beitrag von IMC »

Das Thema DB Unterstützung ist auch gerade Thema in der Area51. Allerding im Thema von phpBB 4.0.
Da wurde ich auch direkt fündig bei der offiziellen phpBB Ext "Pages". Schon die Version 2.0.5 von 2021 hat ALTER TABLE xxx RENAME TO yyy genutzt.
Wird vom MariaDB erst seit 10.5 unterstützt. Ist seit einen 1/2 Jahr auch EOL.

Von SQL Server, soweit ich weis, garnicht. Deshalb wird in der Funktion auch die DB abgefragt.
Das ist die Lösung für Chris. Du bist echt gut im Lösungen finden. 👍👍

Code: Alles auswählen

	public function rename_pages_table()
	{
		switch ($this->db->get_sql_layer())
		{
			// SQL Server dbms support this syntax
			case 'mssql':
			case 'mssql_odbc':
			case 'mssqlnative':
				$sql = "EXEC sp_rename '{$this->table_prefix}pages', '{$this->table_prefix}pages_mod_backup'";
			break;

			// All other dbms support this syntax
			default:
				$sql = "ALTER TABLE {$this->table_prefix}pages RENAME TO {$this->table_prefix}pages_mod_backup";
			break;
		}

		$this->db->sql_query($sql);
	}
Gruß, Thorsten

Meine Extensions
Antworten

Zurück zu „Extension Bastelstube“