From 9a3532265f89289659bb42c4c3e37d84dbf2b0a4 Mon Sep 17 00:00:00 2001 From: Johann Hoffmann Date: Thu, 10 Sep 2026 11:50:51 +0200 Subject: [PATCH] information schema guard check for the data migration & table alter statements aswell, so they dont run on every checksystem.php invocation --- .../75469_le_optional_4_projektarbeit.php | 58 ++++++++++++------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/system/dbupdate_3.4/75469_le_optional_4_projektarbeit.php b/system/dbupdate_3.4/75469_le_optional_4_projektarbeit.php index fe4a8e117..71b45da06 100644 --- a/system/dbupdate_3.4/75469_le_optional_4_projektarbeit.php +++ b/system/dbupdate_3.4/75469_le_optional_4_projektarbeit.php @@ -22,31 +22,49 @@ foreach ($cols_to_add as $col => $type) { } } -// retrieve lehrveranstaltung_id & studiensemester_kurzbz from tbl_lehreinheit -// into new columns based on the existing reference -$migration_qry = "UPDATE lehre.tbl_projektarbeit p - SET lehrveranstaltung_id = l.lehrveranstaltung_id, - studiensemester_kurzbz = l.studiensemester_kurzbz - FROM lehre.tbl_lehreinheit l - WHERE p.lehreinheit_id = l.lehreinheit_id - AND (p.lehrveranstaltung_id IS NULL OR p.studiensemester_kurzbz IS NULL);"; +// run the data migration and the constraint change only once. +// Target state: lehrveranstaltung_id NOT NULL, studiensemester_kurzbz NOT NULL, lehreinheit_id NULLable. +// The check returns a row as long as one of the three columns is not in the target state. +$state_check = "SELECT 1 FROM information_schema.columns + WHERE table_schema = 'lehre' AND table_name = 'tbl_projektarbeit' + AND ((column_name IN ('lehrveranstaltung_id', 'studiensemester_kurzbz') AND is_nullable = 'YES') + OR (column_name = 'lehreinheit_id' AND is_nullable = 'NO'))"; -if ($db->db_query($migration_qry)) { - echo "
Datenmigration von lehreinheit_id zu lehrveranstaltung_id & studiensemester_kurzbz abgeschlossen."; +$migration_pending = false; + +if ($result = $db->db_query($state_check)) { + $migration_pending = ($db->db_num_rows($result) > 0); } else { - echo "Migration Error: ".$db->db_last_error()."
"; + echo "State Check Error: ".$db->db_last_error()."
"; } -// set NOT NULL and make lehreinheit_id NULLable -$constraint_qry = "ALTER TABLE lehre.tbl_projektarbeit - ALTER COLUMN lehrveranstaltung_id SET NOT NULL, - ALTER COLUMN studiensemester_kurzbz SET NOT NULL, - ALTER COLUMN lehreinheit_id DROP NOT NULL;"; +if ($migration_pending) { + // retrieve lehrveranstaltung_id & studiensemester_kurzbz from tbl_lehreinheit + // into new columns based on the existing reference + $migration_qry = "UPDATE lehre.tbl_projektarbeit p + SET lehrveranstaltung_id = l.lehrveranstaltung_id, + studiensemester_kurzbz = l.studiensemester_kurzbz + FROM lehre.tbl_lehreinheit l + WHERE p.lehreinheit_id = l.lehreinheit_id + AND (p.lehrveranstaltung_id IS NULL OR p.studiensemester_kurzbz IS NULL);"; -if ($db->db_query($constraint_qry)) { - echo "
Constraints updated lehrveranstaltung_id SET NOT NULL, studiensemester_kurzbz SET NOT NULL, lehreinheit_id DROP NOT NULL."; -} else { - echo "Alter Constraints Error: ".$db->db_last_error()."
"; + if ($db->db_query($migration_qry)) { + echo "
Datenmigration von lehreinheit_id zu lehrveranstaltung_id & studiensemester_kurzbz abgeschlossen."; + } else { + echo "Migration Error: ".$db->db_last_error()."
"; + } + + // set NOT NULL and make lehreinheit_id NULLable + $constraint_qry = "ALTER TABLE lehre.tbl_projektarbeit + ALTER COLUMN lehrveranstaltung_id SET NOT NULL, + ALTER COLUMN studiensemester_kurzbz SET NOT NULL, + ALTER COLUMN lehreinheit_id DROP NOT NULL;"; + + if ($db->db_query($constraint_qry)) { + echo "
Constraints updated lehrveranstaltung_id SET NOT NULL, studiensemester_kurzbz SET NOT NULL, lehreinheit_id DROP NOT NULL."; + } else { + echo "Alter Constraints Error: ".$db->db_last_error()."
"; + } } // add fkey for lehrveranstaltung_id