Seite 1 von 2

Tabellen namen mit migration umbenenen

Verfasst: 24.12.2025 09:57
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.

Re: Tabellen namen mit migration umbenenen

Verfasst: 24.12.2025 11:33
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.

Re: Tabellen namen mit migration umbenenen

Verfasst: 24.12.2025 11:46
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);
}

Re: Tabellen namen mit migration umbenenen

Verfasst: 24.12.2025 12:57
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.

Re: Tabellen namen mit migration umbenenen

Verfasst: 24.12.2025 13:18
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.

Re: Tabellen namen mit migration umbenenen

Verfasst: 24.12.2025 13:56
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.

Re: Tabellen namen mit migration umbenenen

Verfasst: 24.12.2025 14:35
von LukeWCS
Die Trennung von Schema Änderungen in separate Migrationsdateien wird auch in den Ext Doks empfohlen, wenn ich das richtig in Erinnerung habe.

Re: Tabellen namen mit migration umbenenen

Verfasst: 24.12.2025 20:02
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.

Re: Tabellen namen mit migration umbenenen

Verfasst: 27.12.2025 23:44
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?

Re: Tabellen namen mit migration umbenenen

Verfasst: 28.12.2025 00:43
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);
	}