From e3da956e0303cb16bdbaf88e551da4d3fedf5f33 Mon Sep 17 00:00:00 2001
From: Martin Weise <martin.weise@tuwien.ac.at>
Date: Mon, 24 Feb 2025 18:19:40 +0100
Subject: [PATCH] Updated migration

Signed-off-by: Martin Weise <martin.weise@tuwien.ac.at>
---
 .../target/create-event-listener.jar          | Bin 10141 -> 10141 bytes
 .../java/at/tuwien/mapper/DataMapper.java     |  13 +-
 dbrepo-metadata-db/migration/16/data.py       | 210 ++++++++++
 .../migration/16/requirements.txt             |   1 +
 .../schema.sql}                               | 374 ++++++++++++------
 .../api/container/image/DataTypeDto.java      |   6 +
 .../api/container/image/OperatorDto.java      |   2 +
 .../api/database/table/columns/ColumnDto.java |   6 +-
 .../api/database/table/columns/EnumDto.java   |  28 ++
 .../api/database/table/columns/SetDto.java    |  28 ++
 .../at/tuwien/entities/database/Database.java |   1 +
 .../database/table/columns/ColumnEnum.java    |  45 +++
 .../database/table/columns/ColumnSet.java     |  45 +++
 .../database/table/columns/TableColumn.java   |  16 +-
 .../java/at/tuwien/mapper/MetadataMapper.java |   2 +
 .../tuwien/repository/DatabaseRepository.java |   2 +
 .../at/tuwien/endpoints/DatabaseEndpoint.java |  19 +-
 .../at/tuwien/endpoints/TableEndpoint.java    |   2 +-
 .../at/tuwien/service/DatabaseService.java    |   2 +
 .../service/impl/DatabaseServiceImpl.java     |   5 +
 .../tuwien/service/impl/TableServiceImpl.java |  18 +-
 helm/dbrepo/files/create-event-listener.jar   | Bin 10141 -> 10141 bytes
 lib/python/dbrepo/RestClient.py               |  62 ++-
 lib/python/dbrepo/api/dto.py                  |  29 +-
 lib/python/tests/test_unit_ontology.py        |  35 ++
 25 files changed, 805 insertions(+), 146 deletions(-)
 create mode 100644 dbrepo-metadata-db/migration/16/data.py
 create mode 100644 dbrepo-metadata-db/migration/16/requirements.txt
 rename dbrepo-metadata-db/migration/{schema_1.6.3-to-1.7.0.sql => 16/schema.sql} (78%)
 create mode 100644 dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/EnumDto.java
 create mode 100644 dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/SetDto.java
 create mode 100644 dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/ColumnEnum.java
 create mode 100644 dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/ColumnSet.java
 create mode 100644 lib/python/tests/test_unit_ontology.py

diff --git a/dbrepo-auth-service/listeners/target/create-event-listener.jar b/dbrepo-auth-service/listeners/target/create-event-listener.jar
index 4bf3b9382f8b919d7150ce68dfcd70b42042256b..422b57a19db31b248eb17c9cc4586df30558a85b 100644
GIT binary patch
delta 619
zcmbR1Ki6L<z?+#xgn@yBgJJK4h$xF>5&nrnO7*_MhZO|&rmOvLv}c&HtT#7ro7|S*
z(q(mb%r|WG5x&&uoArOM$yJLonXe2wZ<6mn)-6x)?VR_6+bUmb_GXuuBNq=T3S`;Y
zKY7DvwdKvJmAx-7Yz*n?@2JeyIy=4Uw0!xBLt9T<Sh+1T;nE0s<lm-sW~QFZJ1IWh
z+#T-MC0n1@pJ=SUGTqKU>h6v?y3c#Rud&!*npMUu;=cXsx<gXBf6tb){dLn&vw!mc
z<j*~EPjj5NeBL?b_use~m$<XOv#n)NZCJ8#DYO5&&?{D7KB@R03pB9eJ}qP=@nhXa
zgM{|O=lfW)<!$WC6w(7;=iGV!ej(raSjpS_zW!#M-+94#p4y*!=HDx__GPSbb*;U(
z+N$343cu#zJ(=7KXGP_GT(F95o3nyb(5ip>1#g<3eJF^N^v}3Bmuvk-WA$5^g@%`I
zF7Xi3xfE$7<!^dO<+Q`nqd8XRysl(Tn{xT`-t_QV%kQ(<Joy5z9ds^<kE&91ywE-^
zAw^~{Gbkds7#KJh81_z>ypd6rY0reoHyHIm6bF+$)7}Y_HJQ{vR3MW!h^k{U1yNg>
zyg^Esn9qTzOUyk?dnas8V42Irv}eNR|7<**AU>}^tsqEokK$|)rKvQ90~Xtpk1AP#
z#2A%LK?YbT+kvPGWqpv~N@X(;^-$RwM9HbRf~ZuLXpoXaDj^_BLNyO0*r6H+;=NFH
T0`YXzc7v#wYMCG^MBNhrpS=(S

delta 619
zcmbR1Ki6L<z?+#xgn@yBgTXBzBC1R0!NG|_O7#be4k-xiO;`JWfS=)5#-g2})fuw6
z>07?}B?L<fKRTdxZNL68Grzfhx0yF==&$YHzNY0OtHqM_33J!^x+$4)H1A|>T=3$}
zl!;R_4o<MvF5kuKon&UEoYt!+8oR>wu8hO4>`aL{%CQ-m7s40mOL?E@IHfC-r6qMI
zkbT=#p}dLpw%<2s*UmOswM{beOxAOcI;HG@CyogcHeu~TS_VJN@AH0<R+Rof;lKLx
zvb|?c@O^w>bguun^5xd#8#1O6YAV7fwrZ{^$dK;rWj(I{sY0S+vG9H!7wxKj)hD(Z
z{CybizGv(CzIoOY1Or#5TzNa+<>~z0SC&=2|7L5KxUb!$??t_OnX<Ok`d-G)*n20n
zsxRN*J@<D{c9GiauJ;dBPDj1@-SAUo`rY^i7pl(wd${Ea-@%5xB5}^E^|w@pI9O@A
zT?}zOnV{63EPAxi(8Jy9REXd4$te=gD~on+-}?0G&if_>TNw6yl55(V^|GbHaemaE
ziHRQ=K@q{lz`()4;1)1>Bcm#lYry0ijCxFN0h2kH<Uy1slNyK$WYPvvbxfupYAcgB
zNF@{VIS_S;xrfOuU~>Y?TqY3xpN)qTMDq&N3W5~(D9#2^no3hRV6i><sFD>(j8WMX
zWPpXT9f((<tPi4ADw~0*hsxF<N>0TUM5U@kgH#?;2?0?Os(B#64%Iji^+MGNMCqvQ
O22n57GC@>`x+egA0sC_R

diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java
index 65cf82bfcb..df65225a3f 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java
@@ -5,10 +5,7 @@ import at.tuwien.api.database.ViewColumnDto;
 import at.tuwien.api.database.ViewDto;
 import at.tuwien.api.database.query.QueryDto;
 import at.tuwien.api.database.table.*;
-import at.tuwien.api.database.table.columns.ColumnBriefDto;
-import at.tuwien.api.database.table.columns.ColumnDto;
-import at.tuwien.api.database.table.columns.ColumnStatisticDto;
-import at.tuwien.api.database.table.columns.ColumnTypeDto;
+import at.tuwien.api.database.table.columns.*;
 import at.tuwien.api.database.table.constraints.ConstraintsDto;
 import at.tuwien.api.database.table.constraints.foreign.ForeignKeyBriefDto;
 import at.tuwien.api.database.table.constraints.foreign.ForeignKeyDto;
@@ -140,14 +137,18 @@ public interface DataMapper {
             column.setEnums(Arrays.stream(dataType.substring(0, resultSet.getString(8).length() - 1)
                             .replace("enum(", "")
                             .split(","))
-                    .map(value -> value.replace("'", ""))
+                    .map(value -> EnumDto.builder()
+                            .value(value.replace("'", ""))
+                            .build())
                     .toList());
         }
         if (column.getColumnType().equals(ColumnTypeDto.SET)) {
             column.setSets(Arrays.stream(dataType.substring(0, dataType.length() - 1)
                             .replace("set(", "")
                             .split(","))
-                    .map(value -> value.replace("'", ""))
+                    .map(value -> SetDto.builder()
+                            .value(value.replace("'", ""))
+                            .build())
                     .toList());
         }
         /* fix boolean and set size for others */
diff --git a/dbrepo-metadata-db/migration/16/data.py b/dbrepo-metadata-db/migration/16/data.py
new file mode 100644
index 0000000000..fe627c2bef
--- /dev/null
+++ b/dbrepo-metadata-db/migration/16/data.py
@@ -0,0 +1,210 @@
+#!/usr/bin/env python3
+import os
+import uuid
+
+from dbrepo.RestClient import RestClient
+
+endpoint = os.getenv('METADATA_SERVICE_ENDPOINT', 'https://dbrepo1.ec.tuwien.ac.at')
+username = os.getenv('SYSTEM_USERNAME', 'admin')
+password = os.getenv('SYSTEM_PASSWORD', 'f24870437f82adf567c0b03179f15e21')
+client = RestClient(endpoint=endpoint, username=username, password=password)
+
+plan: [str] = []
+
+
+def update_concepts() -> None:
+    plan.append("-- concepts")
+    plan.append("BEGIN;")
+    for concept in client.get_concepts():
+        old_id: int = concept.id
+        new_id: uuid = uuid.uuid4()
+        plan.append(f"UPDATE mdb_columns_concepts SET id = '{new_id}' WHERE id = '{old_id}';")
+        plan.append(f"UPDATE mdb_concepts SET id = '{new_id}' WHERE id = '{old_id}';")
+    plan.append("COMMIT;")
+
+
+def update_ontologies() -> None:
+    plan.append("-- ontologies")
+    plan.append("BEGIN;")
+    for ontology in client.get_ontologies():
+        old_id = ontology.id
+        new_id: uuid = uuid.uuid4()
+        plan.append(f"UPDATE mdb_ontologies SET id = '{new_id}' WHERE id = '{old_id}';")
+    plan.append("COMMIT;")
+
+
+def update_units() -> None:
+    plan.append("-- units")
+    plan.append("BEGIN;")
+    for unit in client.get_units():
+        old_id: int = unit.id
+        new_id: uuid = uuid.uuid4()
+        plan.append(f"UPDATE mdb_columns_units SET id = '{new_id}' WHERE id = '{old_id}';")
+        plan.append(f"UPDATE mdb_units SET id = '{new_id}' WHERE id = '{old_id}';")
+    plan.append("COMMIT;")
+
+
+def update_images() -> None:
+    plan.append("-- images")
+    plan.append("BEGIN;")
+    for _image in client.get_images():
+        old_id: int = _image.id
+        image = client.get_image(old_id)
+        new_id: uuid = uuid.uuid4()
+        plan.append(f"UPDATE mdb_images SET id = '{new_id}' WHERE id = '{old_id}';")
+        plan.append(f"UPDATE mdb_image_operators SET image_id = '{new_id}' WHERE image_id = '{old_id}';")
+        plan.append(f"UPDATE mdb_image_types SET image_id = '{new_id}' WHERE image_id = '{old_id}';")
+        plan.append(f"UPDATE mdb_containers SET image_id = '{new_id}' WHERE image_id = '{old_id}';")
+        for operator in image.operators:
+            o_old_id: int = operator.id
+            o_new_id: uuid = uuid.uuid4()
+            plan.append(f"UPDATE mdb_image_operators SET id = '{o_new_id}' WHERE id = '{o_old_id}';")
+        for data_type in image.data_types:
+            d_old_id: int = data_type.id
+            d_new_id: uuid = uuid.uuid4()
+            plan.append(f"UPDATE mdb_image_types SET id = '{d_new_id}' WHERE id = '{d_old_id}';")
+    plan.append("COMMIT;")
+
+
+def update_containers() -> None:
+    plan.append("-- containers")
+    plan.append("BEGIN;")
+    for containers in client.get_containers():
+        old_id: int = containers.id
+        new_id: uuid = uuid.uuid4()
+        plan.append(f"UPDATE mdb_containers SET id = '{new_id}' WHERE id = '{old_id}';")
+        plan.append(f"UPDATE mdb_databases SET cid = '{new_id}' WHERE cid = '{old_id}';")
+    plan.append("COMMIT;")
+
+
+def update_databases() -> None:
+    plan.append("-- databases")
+    plan.append("BEGIN;")
+    for _database in client.get_databases():
+        database = client.get_database(database_id=_database.id)
+        old_id: int = database.id
+        new_id: uuid = uuid.uuid4()
+        plan.append(f"UPDATE mdb_tables SET tDBID = '{new_id}' WHERE tDBID = '{old_id}';")
+        plan.append(f"UPDATE mdb_have_access SET database_id = '{new_id}' WHERE database_id = '{old_id}';")
+        plan.append(f"UPDATE mdb_view SET vdbid = '{new_id}' WHERE vdbid = '{old_id}';")
+        plan.append(f"UPDATE mdb_identifiers SET dbid = '{new_id}' WHERE dbid = '{old_id}';")
+        plan.append(f"UPDATE mdb_access SET aDBID = '{new_id}' WHERE aDBID = '{old_id}';")
+        for view in database.views:
+            v_old_id: int = view.id
+            v_new_id: uuid = uuid.uuid4()
+            plan.append(f"UPDATE mdb_identifiers SET vid = '{v_new_id}' WHERE vid = '{v_old_id}';")
+            plan.append(f"UPDATE mdb_view_columns SET id = UUID(), view_id = '{v_new_id}' WHERE id = '{v_old_id}';")
+        for table in database.tables:
+            tbl_old_id: int = table.id
+            tbl_new_id: uuid = uuid.uuid4()
+            plan.append(f"UPDATE mdb_identifiers SET tid = '{tbl_new_id}' WHERE tid = '{tbl_old_id}';")
+            plan.append(f"UPDATE mdb_columns SET tID = '{tbl_new_id}' WHERE tID = '{tbl_old_id}';")
+            plan.append(f"UPDATE mdb_constraints_primary_key SET pkid = UUID(), tID = '{tbl_new_id}' WHERE tID = '{tbl_old_id}';")
+            plan.append(f"UPDATE mdb_constraints_unique SET tid = '{tbl_new_id}' WHERE tid = '{tbl_old_id}';")
+            plan.append(
+                f"UPDATE mdb_constraints_checks SET id = UUID(), tid = '{tbl_new_id}' WHERE tid = '{tbl_old_id}';")
+            for fk in table.constraints.foreign_keys:
+                fk_old_id: int = fk.id
+                fk_new_id: uuid = uuid.uuid4()
+                plan.append(
+                    f"UPDATE mdb_constraints_foreign_key SET fkid = '{fk_new_id}', tid = '{tbl_new_id}' WHERE fkid = '{fk_old_id}';")
+                for fkref in fk.references:
+                    fkref_old_id = fkref.id
+                    plan.append(
+                        f"UPDATE mdb_constraints_foreign_key_reference SET id = UUID(), fkid = '{fk_new_id}' WHERE fkid = '{fkref_old_id}';")
+            for pk in table.constraints.primary_key:
+                pk_old_id: int = pk.id
+                plan.append(
+                    f"UPDATE mdb_constraints_primary_key SET pkid = UUID(), tID = '{tbl_new_id}' WHERE tID = {pk_old_id};")
+            for uk in table.constraints.uniques:
+                uk_old_id: int = uk.id
+                uk_new_id: uuid = uuid.uuid4()
+                plan.append(
+                    f"UPDATE mdb_constraints_unique SET uid = '{uk_new_id}', tid = '{tbl_new_id}' WHERE uid = '{uk_old_id}';")
+                plan.append(
+                    f"UPDATE mdb_constraints_unique_columns SET id = UUID(), uid = '{uk_new_id}' WHERE uid = '{uk_old_id}';")
+            for column in table.columns:
+                col_old_id: int = column.id
+                col_new_id: uuid = uuid.uuid4()
+                plan.append(f"UPDATE mdb_columns SET ID = '{col_new_id}' WHERE ID = '{col_old_id}';")
+                plan.append(f"UPDATE mdb_constraints_unique_columns SET cid = '{col_new_id}' WHERE cid = '{col_old_id}';")
+                plan.append(f"UPDATE mdb_constraints_primary_key SET cid = '{col_new_id}' WHERE cid = '{col_old_id}';")
+                plan.append(
+                    f"UPDATE mdb_constraints_foreign_key_reference SET cid = '{col_new_id}' WHERE cid = '{col_old_id}';")
+                plan.append(
+                    f"UPDATE mdb_constraints_foreign_key_reference SET rcid = '{col_new_id}' WHERE rcid = '{col_old_id}';")
+                plan.append(f"UPDATE mdb_columns_concepts SET cID = '{col_new_id}' WHERE cID = '{col_old_id}';")
+                plan.append(f"UPDATE mdb_columns_units SET cID = '{col_new_id}' WHERE cID = '{col_old_id}';")
+                plan.append(f"UPDATE mdb_columns_sets SET column_id = '{col_new_id}' WHERE column_id = '{col_old_id}';")
+                plan.append(f"UPDATE mdb_columns_enums SET column_id = '{col_new_id}' WHERE column_id = '{col_old_id}';")
+                for set in column.sets:
+                    s_old_id: int = set.id
+                    s_new_id: uuid = uuid.uuid4()
+                    plan.append(f"UPDATE mdb_columns_sets SET id = '{s_new_id}' WHERE id = '{s_old_id}';")
+                for enum in column.enums:
+                    e_old_id: int = enum.id
+                    e_new_id: uuid = uuid.uuid4()
+                    plan.append(f"UPDATE mdb_columns_enums SET id = '{e_new_id}' WHERE id = '{e_old_id}';")
+            plan.append(f"UPDATE mdb_tables SET ID = '{tbl_new_id}' WHERE ID = '{tbl_old_id}';")
+        plan.append(f"UPDATE mdb_databases SET id = '{new_id}' WHERE id = '{old_id}';")
+    plan.append("COMMIT;")
+
+
+def update_messages() -> None:
+    plan.append("-- messages")
+    plan.append("BEGIN;")
+    for message in client.get_messages():
+        old_id = message.id
+        new_id: uuid = uuid.uuid4()
+        plan.append(f"UPDATE mdb_messages SET id = '{new_id}' WHERE id = '{old_id}';")
+    plan.append("COMMIT;")
+
+
+def update_identifiers() -> None:
+    plan.append("-- identifiers")
+    plan.append("BEGIN;")
+    for _identifier in client.get_identifiers():
+        identifier = client.get_identifier(identifier_id=_identifier.id)
+        i_old_id: int = identifier.id
+        i_new_id: uuid = uuid.uuid4()
+        plan.append(f"UPDATE mdb_identifiers SET ID = '{i_new_id}' WHERE id = '{i_old_id}';")
+        plan.append(f"UPDATE mdb_identifier_titles SET pid = '{i_new_id}' WHERE pid = '{i_old_id}';")
+        plan.append(f"UPDATE mdb_identifier_descriptions SET pid = '{i_new_id}' WHERE pid = '{i_old_id}';")
+        plan.append(f"UPDATE mdb_identifier_creators SET pid = '{i_new_id}' WHERE pid = '{i_old_id}';")
+        plan.append(f"UPDATE mdb_identifier_funders SET pid = '{i_new_id}' WHERE pid = '{i_old_id}';")
+        plan.append(f"UPDATE mdb_identifier_licenses SET pid = '{i_new_id}' WHERE pid = '{i_old_id}';")
+        for title in identifier.titles:
+            t_old_id = title.id
+            t_new_id: uuid = uuid.uuid4()
+            plan.append(f"UPDATE mdb_identifier_titles SET id = '{t_new_id}' WHERE id = '{t_old_id}';")
+        for description in identifier.descriptions:
+            d_old_id = description.id
+            d_new_id: uuid = uuid.uuid4()
+            plan.append(f"UPDATE mdb_identifier_descriptions SET id = '{d_new_id}' WHERE id = '{d_old_id}';")
+        for creator in identifier.creators:
+            c_old_id = creator.id
+            c_new_id: uuid = uuid.uuid4()
+            plan.append(f"UPDATE mdb_identifier_creators SET id = '{c_new_id}' WHERE id = '{c_old_id}';")
+        for funder in identifier.funders:
+            f_old_id = funder.id
+            f_new_id: uuid = uuid.uuid4()
+            plan.append(f"UPDATE mdb_identifier_funders SET id = '{f_new_id}' WHERE id = '{f_old_id}';")
+    plan.append("COMMIT;")
+
+
+if __name__ == '__main__':
+    plan.append("SET FOREIGN_KEY_CHECKS=0;")
+    plan.append("BEGIN;")
+    plan.append(f"INSERT INTO mdb_have_access SELECT uu.id as user_id, d.id as database_id, 'WRITE_ALL' as access_type, NOW() as created FROM mdb_databases d, mdb_users uu WHERE NOT EXISTS(SELECT 1 FROM mdb_have_access a JOIN mdb_users u ON a.user_id = u.id AND u.is_internal = TRUE) AND uu.is_internal = TRUE;")
+    plan.append("COMMIT;")
+    update_concepts()
+    update_units()
+    update_messages()
+    update_ontologies()
+    update_images()
+    update_containers()
+    update_databases()
+    update_identifiers()
+    update_messages()
+    plan.append("SET FOREIGN_KEY_CHECKS=1;")
+    print("\n".join(plan))
diff --git a/dbrepo-metadata-db/migration/16/requirements.txt b/dbrepo-metadata-db/migration/16/requirements.txt
new file mode 100644
index 0000000000..f7e737b2ce
--- /dev/null
+++ b/dbrepo-metadata-db/migration/16/requirements.txt
@@ -0,0 +1 @@
+dbrepo==1.6.5rc15
\ No newline at end of file
diff --git a/dbrepo-metadata-db/migration/schema_1.6.3-to-1.7.0.sql b/dbrepo-metadata-db/migration/16/schema.sql
similarity index 78%
rename from dbrepo-metadata-db/migration/schema_1.6.3-to-1.7.0.sql
rename to dbrepo-metadata-db/migration/16/schema.sql
index 272b491e0a..68a87f1a67 100644
--- a/dbrepo-metadata-db/migration/schema_1.6.3-to-1.7.0.sql
+++ b/dbrepo-metadata-db/migration/16/schema.sql
@@ -3,27 +3,28 @@ DROP TABLE IF EXISTS `mdb_columns_nom`;
 DROP TABLE IF EXISTS `mdb_columns_cat`;
 DROP TABLE IF EXISTS `mdb_update`;
 DROP TABLE IF EXISTS `mdb_databases_subjects`;
+DROP TABLE IF EXISTS `mdb_images_date`;
 -- mdb_ontologies
 ALTER TABLE `mdb_ontologies`
     DROP SYSTEM VERSIONING;
 ALTER TABLE mdb_ontologies
     CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
 ALTER TABLE `mdb_ontologies`
-    ADD SYSTEM VERSIONING;
+    DROP PRIMARY KEY;
+-- mdb_concepts
+ALTER TABLE mdb_concepts
+    DROP SYSTEM VERSIONING;
+ALTER TABLE mdb_concepts
+    CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_concepts`
+    DROP PRIMARY KEY;
 -- mdb_units
 ALTER TABLE `mdb_units`
     DROP SYSTEM VERSIONING;
 ALTER TABLE mdb_units
     CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
 ALTER TABLE `mdb_units`
-    ADD SYSTEM VERSIONING;
--- mdb_units
-ALTER TABLE `mdb_concepts`
-    DROP SYSTEM VERSIONING;
-ALTER TABLE mdb_concepts
-    CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
-ALTER TABLE `mdb_concepts`
-    ADD SYSTEM VERSIONING;
+    DROP PRIMARY KEY;
 -- mdb_messages
 ALTER TABLE `mdb_banner_messages`
     DROP SYSTEM VERSIONING;
@@ -31,7 +32,7 @@ ALTER TABLE `mdb_banner_messages` RENAME `mdb_messages`;
 ALTER TABLE mdb_messages
     CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
 ALTER TABLE `mdb_messages`
-    ADD SYSTEM VERSIONING;
+    DROP PRIMARY KEY;
 -- mdb_image_operators
 ALTER TABLE mdb_image_operators
     DROP SYSTEM VERSIONING;
@@ -39,6 +40,8 @@ ALTER TABLE mdb_image_operators
     DROP FOREIGN KEY mdb_image_operators_ibfk_1;
 ALTER TABLE mdb_image_operators
     CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_image_operators`
+    DROP PRIMARY KEY;
 ALTER TABLE mdb_image_operators
     CHANGE COLUMN image_id image_id VARCHAR(36) NOT NULL;
 -- mdb_image_types
@@ -48,41 +51,40 @@ ALTER TABLE mdb_image_types
     DROP FOREIGN KEY mdb_image_types_ibfk_1;
 ALTER TABLE mdb_image_types
     CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_image_types`
+    DROP PRIMARY KEY;
 ALTER TABLE mdb_image_types
     CHANGE COLUMN image_id image_id VARCHAR(36) NOT NULL;
--- mdb_images
-ALTER TABLE mdb_images
-    DROP SYSTEM VERSIONING;
-ALTER TABLE mdb_images
-    CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
 -- mdb_access
 ALTER TABLE mdb_access
     DROP SYSTEM VERSIONING;
 ALTER TABLE mdb_access
     DROP FOREIGN KEY mdb_access_ibfk_1;
-ALTER TABLE mdb_access
-    ADD FOREIGN KEY (aUserID) REFERENCES mdb_users (id);
 ALTER TABLE mdb_access
     CHANGE COLUMN aDBID aDBID VARCHAR(36) NOT NULL;
--- mdb_users
-ALTER TABLE mdb_users
-    DROP SYSTEM VERSIONING;
-ALTER TABLE mdb_users
-    CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_access`
+    DROP PRIMARY KEY;
 -- mdb_have_access
 ALTER TABLE mdb_have_access
     DROP SYSTEM VERSIONING;
 ALTER TABLE mdb_have_access
     DROP FOREIGN KEY mdb_have_access_ibfk_1;
+ALTER TABLE mdb_have_access
+    DROP FOREIGN KEY mdb_have_access_ibfk_2;
 ALTER TABLE mdb_have_access
     CHANGE COLUMN user_id user_id VARCHAR(36) NOT NULL;
 ALTER TABLE mdb_have_access
     CHANGE COLUMN database_id database_id VARCHAR(36) NOT NULL;
--- mdb_identifier_creators
+ALTER TABLE `mdb_have_access`
+    DROP PRIMARY KEY;-- mdb_identifier_creators
 ALTER TABLE mdb_identifier_creators
     DROP SYSTEM VERSIONING;
 ALTER TABLE mdb_identifier_creators
     DROP FOREIGN KEY mdb_identifier_creators_ibfk_1;
+ALTER TABLE mdb_identifier_creators
+    CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_identifier_creators`
+    DROP PRIMARY KEY;
 ALTER TABLE mdb_identifier_creators
     CHANGE COLUMN pid pid VARCHAR(36) NOT NULL;
 -- mdb_identifier_descriptions
@@ -90,6 +92,10 @@ ALTER TABLE mdb_identifier_descriptions
     DROP SYSTEM VERSIONING;
 ALTER TABLE mdb_identifier_descriptions
     DROP FOREIGN KEY mdb_identifier_descriptions_ibfk_1;
+ALTER TABLE mdb_identifier_descriptions
+    CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_identifier_descriptions`
+    DROP PRIMARY KEY;
 ALTER TABLE mdb_identifier_descriptions
     CHANGE COLUMN pid pid VARCHAR(36) NOT NULL;
 -- mdb_identifier_funders
@@ -97,6 +103,10 @@ ALTER TABLE mdb_identifier_funders
     DROP SYSTEM VERSIONING;
 ALTER TABLE mdb_identifier_funders
     DROP FOREIGN KEY mdb_identifier_funders_ibfk_1;
+ALTER TABLE mdb_identifier_funders
+    CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_identifier_funders`
+    DROP PRIMARY KEY;
 ALTER TABLE mdb_identifier_funders
     CHANGE COLUMN pid pid VARCHAR(36) NOT NULL;
 -- mdb_identifier_licenses
@@ -106,6 +116,8 @@ ALTER TABLE mdb_identifier_licenses
     DROP FOREIGN KEY mdb_identifier_licenses_ibfk_1;
 ALTER TABLE mdb_identifier_licenses
     CHANGE COLUMN pid pid VARCHAR(36) NOT NULL;
+ALTER TABLE `mdb_identifier_licenses`
+    DROP PRIMARY KEY;
 -- mdb_identifier_titles
 ALTER TABLE mdb_identifier_titles
     DROP SYSTEM VERSIONING;
@@ -113,6 +125,8 @@ ALTER TABLE mdb_identifier_titles
     DROP FOREIGN KEY mdb_identifier_titles_ibfk_1;
 ALTER TABLE mdb_identifier_titles
     CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_identifier_titles`
+    DROP PRIMARY KEY;
 ALTER TABLE mdb_identifier_titles
     CHANGE COLUMN pid pid VARCHAR(36) NOT NULL;
 -- mdb_identifier_licenses
@@ -123,6 +137,8 @@ ALTER TABLE mdb_related_identifiers
 ALTER TABLE mdb_related_identifiers RENAME mdb_identifier_related;
 ALTER TABLE mdb_identifier_related
     CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_identifier_related`
+    DROP PRIMARY KEY;
 ALTER TABLE mdb_identifier_related
     CHANGE COLUMN pid pid VARCHAR(36) NOT NULL;
 -- mdb_identifiers
@@ -132,17 +148,21 @@ ALTER TABLE mdb_identifiers
     DROP FOREIGN KEY mdb_identifiers_ibfk_1;
 ALTER TABLE mdb_identifiers
     CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_identifiers`
+    DROP PRIMARY KEY;
 ALTER TABLE mdb_identifiers
     CHANGE COLUMN dbid dbid VARCHAR(36) NOT NULL;
 ALTER TABLE mdb_identifiers
-    CHANGE COLUMN qid qid VARCHAR(36) NOT NULL;
+    CHANGE COLUMN qid qid VARCHAR(36);
 ALTER TABLE mdb_identifiers
-    CHANGE COLUMN tid tid VARCHAR(36) NOT NULL;
+    CHANGE COLUMN tid tid VARCHAR(36);
 ALTER TABLE mdb_identifiers
-    CHANGE COLUMN vid vid VARCHAR(36) NOT NULL;
+    CHANGE COLUMN vid vid VARCHAR(36);
 -- mdb_columns_concepts
 ALTER TABLE mdb_columns_concepts
     DROP SYSTEM VERSIONING;
+ALTER TABLE `mdb_columns_concepts`
+    DROP PRIMARY KEY;
 ALTER TABLE mdb_columns_concepts
     DROP FOREIGN KEY mdb_columns_concepts_ibfk_1;
 ALTER TABLE mdb_columns_concepts
@@ -156,6 +176,8 @@ ALTER TABLE mdb_columns_enums
     DROP FOREIGN KEY mdb_columns_enums_ibfk_1;
 ALTER TABLE mdb_columns_enums
     CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_columns_enums`
+    DROP PRIMARY KEY;
 ALTER TABLE mdb_columns_enums
     CHANGE COLUMN column_id column_id VARCHAR(36) NOT NULL;
 -- mdb_columns_sets
@@ -165,6 +187,8 @@ ALTER TABLE mdb_columns_sets
     DROP FOREIGN KEY mdb_columns_sets_ibfk_1;
 ALTER TABLE mdb_columns_sets
     CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_columns_sets`
+    DROP PRIMARY KEY;
 ALTER TABLE mdb_columns_sets
     CHANGE COLUMN column_id column_id VARCHAR(36) NOT NULL;
 -- mdb_columns_units
@@ -174,6 +198,8 @@ ALTER TABLE mdb_columns_units
     DROP FOREIGN KEY mdb_columns_units_ibfk_1;
 ALTER TABLE mdb_columns_units
     CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_columns_units`
+    DROP PRIMARY KEY;
 ALTER TABLE mdb_columns_units
     CHANGE COLUMN cID cID VARCHAR(36) NOT NULL;
 -- mdb_constraints_checks
@@ -183,6 +209,8 @@ ALTER TABLE mdb_constraints_checks
     DROP FOREIGN KEY mdb_constraints_checks_ibfk_1;
 ALTER TABLE mdb_constraints_checks
     CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_constraints_checks`
+    DROP PRIMARY KEY;
 ALTER TABLE mdb_constraints_checks
     CHANGE COLUMN tid tid VARCHAR(36) NOT NULL;
 -- mdb_constraints_foreign_key_reference
@@ -196,6 +224,8 @@ ALTER TABLE mdb_constraints_foreign_key_reference
     DROP FOREIGN KEY mdb_constraints_foreign_key_reference_ibfk_3;
 ALTER TABLE mdb_constraints_foreign_key_reference
     CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_constraints_foreign_key_reference`
+    DROP PRIMARY KEY;
 ALTER TABLE mdb_constraints_foreign_key_reference
     CHANGE COLUMN fkid fkid VARCHAR(36) NOT NULL;
 ALTER TABLE mdb_constraints_foreign_key_reference
@@ -211,6 +241,8 @@ ALTER TABLE mdb_constraints_foreign_key
     DROP FOREIGN KEY mdb_constraints_foreign_key_ibfk_2;
 ALTER TABLE mdb_constraints_foreign_key
     CHANGE COLUMN fkid fkid VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_constraints_foreign_key`
+    DROP PRIMARY KEY;
 ALTER TABLE mdb_constraints_foreign_key
     CHANGE COLUMN tid tid VARCHAR(36) NOT NULL;
 ALTER TABLE mdb_constraints_foreign_key
@@ -224,11 +256,12 @@ ALTER TABLE mdb_constraints_primary_key
     DROP FOREIGN KEY mdb_constraints_primary_key_ibfk_2;
 ALTER TABLE mdb_constraints_primary_key
     CHANGE COLUMN pkid pkid VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_constraints_primary_key`
+    DROP PRIMARY KEY;
 ALTER TABLE mdb_constraints_primary_key
     CHANGE COLUMN tID tID VARCHAR(36) NOT NULL;
--- mdb_constraints_unique
-ALTER TABLE mdb_constraints_unique
-    DROP FOREIGN KEY mdb_constraints_unique_ibfk_1;
+ALTER TABLE mdb_constraints_primary_key
+    CHANGE COLUMN cid cid VARCHAR(36) NOT NULL;
 -- mdb_constraints_unique_columns
 ALTER TABLE mdb_constraints_unique_columns
     DROP SYSTEM VERSIONING;
@@ -238,13 +271,19 @@ ALTER TABLE mdb_constraints_unique_columns
     DROP FOREIGN KEY mdb_constraints_unique_columns_ibfk_2;
 ALTER TABLE mdb_constraints_unique_columns
     CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_constraints_unique_columns`
+    DROP PRIMARY KEY;
 ALTER TABLE mdb_constraints_unique_columns
     CHANGE COLUMN uid uid VARCHAR(36) NOT NULL;
 ALTER TABLE mdb_constraints_unique_columns
     CHANGE COLUMN cid cid VARCHAR(36) NOT NULL;
 -- mdb_constraints_unique
+ALTER TABLE mdb_constraints_unique
+    DROP FOREIGN KEY mdb_constraints_unique_ibfk_1;
 ALTER TABLE mdb_constraints_unique
     CHANGE COLUMN uid uid VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_constraints_unique`
+    DROP PRIMARY KEY;
 ALTER TABLE mdb_constraints_unique
     CHANGE COLUMN tid tid VARCHAR(36) NOT NULL;
 -- mdb_columns
@@ -254,6 +293,8 @@ ALTER TABLE mdb_columns
     DROP FOREIGN KEY mdb_columns_ibfk_1;
 ALTER TABLE mdb_columns
     CHANGE COLUMN ID ID VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_columns`
+    DROP PRIMARY KEY;
 ALTER TABLE mdb_columns
     CHANGE COLUMN tID tID VARCHAR(36) NOT NULL;
 -- mdb_tables
@@ -275,6 +316,8 @@ ALTER TABLE mdb_tables
     DROP FOREIGN KEY mdb_tables_ibfk_1;
 ALTER TABLE mdb_tables
     CHANGE COLUMN ID ID VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_tables`
+    DROP PRIMARY KEY;
 ALTER TABLE mdb_tables
     CHANGE COLUMN tDBID tDBID VARCHAR(36) NOT NULL;
 -- mdb_view_columns
@@ -284,6 +327,8 @@ ALTER TABLE mdb_view_columns
     DROP FOREIGN KEY mdb_view_columns_ibfk_1;
 ALTER TABLE mdb_view_columns
     CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_view_columns`
+    DROP PRIMARY KEY;
 ALTER TABLE mdb_view_columns
     CHANGE COLUMN view_id view_id VARCHAR(36) NOT NULL;
 -- mdb_view
@@ -293,6 +338,8 @@ ALTER TABLE mdb_view
     DROP FOREIGN KEY mdb_view_ibfk_1;
 ALTER TABLE mdb_view
     CHANGE COLUMN ID ID VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_view`
+    DROP PRIMARY KEY;
 ALTER TABLE mdb_view
     CHANGE COLUMN vdbid vdbid VARCHAR(36) NOT NULL;
 -- mdb_databases
@@ -302,6 +349,8 @@ ALTER TABLE mdb_databases
     DROP FOREIGN KEY mdb_databases_ibfk_1;
 ALTER TABLE mdb_databases
     CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_databases`
+    DROP PRIMARY KEY;
 ALTER TABLE mdb_databases
     CHANGE COLUMN cid cid VARCHAR(36) NOT NULL;
 -- mdb_containers
@@ -309,164 +358,259 @@ ALTER TABLE mdb_containers
     DROP SYSTEM VERSIONING;
 ALTER TABLE mdb_containers
     CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_containers`
+    DROP PRIMARY KEY;
+ALTER TABLE mdb_containers
+    DROP FOREIGN KEY mdb_containers_ibfk_1;
 ALTER TABLE mdb_containers
     CHANGE COLUMN image_id image_id VARCHAR(36) NOT NULL;
 -- mdb_images
 ALTER TABLE mdb_images
-    ADD SYSTEM VERSIONING;
--- mdb_identifiers
-ALTER TABLE mdb_identifiers
-    ADD FOREIGN KEY (dbid) REFERENCES mdb_databases (id);
-ALTER TABLE mdb_identifiers
-    ADD FOREIGN KEY (tid) REFERENCES mdb_tables (id);
-ALTER TABLE mdb_identifiers
-    ADD FOREIGN KEY (vid) REFERENCES mdb_view (id);
-ALTER TABLE mdb_identifiers
-    ADD SYSTEM VERSIONING;
--- mdb_identifier_licenses
-ALTER TABLE mdb_identifier_licenses
-    ADD FOREIGN KEY (pid) REFERENCES mdb_identifiers (id);
-ALTER TABLE mdb_identifier_licenses
-    ADD SYSTEM VERSIONING;
--- mdb_identifier_titles
-ALTER TABLE mdb_identifier_titles
-    ADD FOREIGN KEY (pid) REFERENCES mdb_identifiers (id);
-ALTER TABLE mdb_identifier_titles
-    ADD SYSTEM VERSIONING;
--- mdb_identifier_funders
-ALTER TABLE mdb_identifier_funders
-    ADD FOREIGN KEY (pid) REFERENCES mdb_identifiers (id);
-ALTER TABLE mdb_identifier_funders
-    ADD SYSTEM VERSIONING;
--- mdb_identifier_descriptions
-ALTER TABLE mdb_identifier_descriptions
-    ADD FOREIGN KEY (pid) REFERENCES mdb_identifiers (id);
-ALTER TABLE mdb_identifier_descriptions
-    ADD SYSTEM VERSIONING;
--- mdb_identifier_creators
-ALTER TABLE mdb_identifier_creators
-    ADD FOREIGN KEY (pid) REFERENCES mdb_identifiers (id);
-ALTER TABLE mdb_identifier_creators
-    ADD SYSTEM VERSIONING;
--- mdb_identifier_related
-ALTER TABLE mdb_identifier_related
-    ADD FOREIGN KEY (pid) REFERENCES mdb_identifiers (id);
-ALTER TABLE mdb_identifier_related
+    DROP SYSTEM VERSIONING;
+ALTER TABLE mdb_images
+    CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
+ALTER TABLE `mdb_images`
+    DROP PRIMARY KEY;
+-- mdb_users
+ALTER TABLE mdb_users
+    DROP SYSTEM VERSIONING;
+ALTER TABLE mdb_users
+    CHANGE COLUMN id id VARCHAR(36) NOT NULL DEFAULT UUID();
+-- mdb_images
+ALTER TABLE mdb_images
+    ADD PRIMARY KEY (id);
+ALTER TABLE mdb_images
     ADD SYSTEM VERSIONING;
 -- mdb_containers
+ALTER TABLE mdb_containers
+    ADD PRIMARY KEY (id);
 ALTER TABLE mdb_containers
     ADD FOREIGN KEY (image_id) REFERENCES mdb_images (id);
 ALTER TABLE mdb_containers
     ADD SYSTEM VERSIONING;
--- mdb_access
-ALTER TABLE mdb_access
-    ADD FOREIGN KEY (aDBID) REFERENCES mdb_databases (id);
-ALTER TABLE mdb_access
-    ADD SYSTEM VERSIONING;
--- mdb_columns_concepts
-ALTER TABLE mdb_columns_concepts
-    ADD FOREIGN KEY (id) REFERENCES mdb_concepts (id);
-ALTER TABLE mdb_columns_concepts
-    ADD FOREIGN KEY (cID) REFERENCES mdb_columns (id);
-ALTER TABLE mdb_columns_concepts
-    ADD SYSTEM VERSIONING;
--- mdb_columns_enums
-ALTER TABLE mdb_columns_enums
-    ADD FOREIGN KEY (column_id) REFERENCES mdb_columns (id);
-ALTER TABLE mdb_columns_enums
+-- mdb_concepts
+ALTER TABLE mdb_concepts
+    ADD PRIMARY KEY (id);
+ALTER TABLE mdb_concepts
     ADD SYSTEM VERSIONING;
--- mdb_columns_sets
-ALTER TABLE mdb_columns_sets
-    ADD FOREIGN KEY (column_id) REFERENCES mdb_columns (id);
-ALTER TABLE mdb_columns_sets
+-- mdb_databases
+ALTER TABLE mdb_databases
+    ADD FOREIGN KEY (cid) REFERENCES mdb_containers (id);
+ALTER TABLE mdb_databases
+    ADD PRIMARY KEY (id);
+ALTER TABLE mdb_databases
     ADD SYSTEM VERSIONING;
--- mdb_columns_units
-ALTER TABLE mdb_columns_units
-    ADD FOREIGN KEY (id) REFERENCES mdb_units (id);
-ALTER TABLE mdb_columns_units
-    ADD FOREIGN KEY (cID) REFERENCES mdb_columns (id);
-ALTER TABLE mdb_columns_units
+-- mdb_tables
+ALTER TABLE mdb_tables
+    ADD FOREIGN KEY (tDBID) REFERENCES mdb_databases (id);
+ALTER TABLE mdb_tables
+    ADD PRIMARY KEY (ID);
+ALTER TABLE mdb_tables
     ADD SYSTEM VERSIONING;
 -- mdb_constraints_checks
 ALTER TABLE mdb_constraints_checks
     ADD FOREIGN KEY (tid) REFERENCES mdb_tables (id);
+ALTER TABLE mdb_constraints_checks
+    ADD PRIMARY KEY (id);
 ALTER TABLE mdb_constraints_checks
     ADD SYSTEM VERSIONING;
 -- mdb_constraints_foreign_key
 ALTER TABLE mdb_constraints_foreign_key
     ADD FOREIGN KEY (tid) REFERENCES mdb_tables (id);
 ALTER TABLE mdb_constraints_foreign_key
-    ADD FOREIGN KEY (rtid) REFERENCES mdb_constraints_foreign_key_reference (id);
-ALTER TABLE mdb_constraints_foreign_key
+    ADD PRIMARY KEY (fkid);
+-- mdb_columns
+ALTER TABLE mdb_columns
+    ADD FOREIGN KEY (tID) REFERENCES mdb_tables (id);
+ALTER TABLE mdb_columns
+    ADD PRIMARY KEY (ID);
+ALTER TABLE mdb_columns
     ADD SYSTEM VERSIONING;
 -- mdb_constraints_foreign_key_reference
+ALTER TABLE mdb_constraints_foreign_key_reference
+    ADD PRIMARY KEY (id);
 ALTER TABLE mdb_constraints_foreign_key_reference
     ADD FOREIGN KEY (fkid) REFERENCES mdb_constraints_foreign_key (fkid);
 ALTER TABLE mdb_constraints_foreign_key_reference
     ADD FOREIGN KEY (cid) REFERENCES mdb_columns (ID);
 ALTER TABLE mdb_constraints_foreign_key_reference
-    ADD FOREIGN KEY (rcid) REFERENCES mdb_constraints_foreign_key_reference (ID);
+    ADD FOREIGN KEY (rcid) REFERENCES mdb_columns (ID);
 ALTER TABLE mdb_constraints_foreign_key_reference
     ADD SYSTEM VERSIONING;
+-- mdb_constraints_foreign_key
+ALTER TABLE mdb_constraints_foreign_key
+    ADD FOREIGN KEY (rtid) REFERENCES mdb_tables (`id`) ON DELETE CASCADE;
+ALTER TABLE mdb_constraints_foreign_key
+    ADD SYSTEM VERSIONING;
 -- mdb_constraints_primary_key
 ALTER TABLE mdb_constraints_primary_key
-    ADD FOREIGN KEY (pkid) REFERENCES mdb_tables (ID);
+    ADD PRIMARY KEY (pkid);
+ALTER TABLE mdb_constraints_primary_key
+    ADD FOREIGN KEY (tID) REFERENCES mdb_tables (ID);
 ALTER TABLE mdb_constraints_primary_key
-    ADD FOREIGN KEY (tID) REFERENCES mdb_columns (ID);
+    ADD FOREIGN KEY (cid) REFERENCES mdb_columns (ID);
 ALTER TABLE mdb_constraints_primary_key
     ADD SYSTEM VERSIONING;
 -- mdb_constraints_unique
+ALTER TABLE mdb_constraints_unique
+    ADD PRIMARY KEY (uid);
 ALTER TABLE mdb_constraints_unique
     ADD FOREIGN KEY (tid) REFERENCES mdb_tables (ID);
 ALTER TABLE mdb_constraints_unique
     ADD SYSTEM VERSIONING;
 -- mdb_constraints_unique_columns
+ALTER TABLE mdb_constraints_unique_columns
+    ADD PRIMARY KEY (id);
 ALTER TABLE mdb_constraints_unique_columns
     ADD FOREIGN KEY (uid) REFERENCES mdb_constraints_unique (uid);
 ALTER TABLE mdb_constraints_unique_columns
     ADD FOREIGN KEY (cid) REFERENCES mdb_columns (ID);
 ALTER TABLE mdb_constraints_unique_columns
     ADD SYSTEM VERSIONING;
--- mdb_columns
-ALTER TABLE mdb_columns
-    ADD FOREIGN KEY (tID) REFERENCES mdb_tables (id);
-ALTER TABLE mdb_columns
+-- mdb_columns_enums
+ALTER TABLE mdb_columns_enums
+    ADD PRIMARY KEY (id);
+ALTER TABLE mdb_columns_enums
+    ADD FOREIGN KEY (column_id) REFERENCES mdb_columns (id);
+ALTER TABLE mdb_columns_enums
     ADD SYSTEM VERSIONING;
--- mdb_tables
-ALTER TABLE mdb_tables
-    ADD FOREIGN KEY (tDBID) REFERENCES mdb_databases (id);
-ALTER TABLE mdb_tables
+-- mdb_columns_sets
+ALTER TABLE mdb_columns_sets
+    ADD PRIMARY KEY (id);
+ALTER TABLE mdb_columns_sets
+    ADD FOREIGN KEY (column_id) REFERENCES mdb_columns (id);
+ALTER TABLE mdb_columns_sets
     ADD SYSTEM VERSIONING;
--- mdb_view_columns
-ALTER TABLE mdb_view_columns
-    ADD FOREIGN KEY (view_id) REFERENCES mdb_view (id);
-ALTER TABLE mdb_view_columns
+-- mdb_units
+ALTER TABLE mdb_units
+    ADD PRIMARY KEY (id);
+-- mdb_columns_units
+ALTER TABLE mdb_units
+    ADD SYSTEM VERSIONING;
+ALTER TABLE mdb_columns_units
+    ADD PRIMARY KEY (id);
+ALTER TABLE mdb_columns_units
+    ADD FOREIGN KEY (id) REFERENCES mdb_units (id);
+ALTER TABLE mdb_columns_units
+    ADD FOREIGN KEY (cID) REFERENCES mdb_columns (id);
+ALTER TABLE mdb_columns_units
+    ADD SYSTEM VERSIONING;
+-- mdb_columns_concepts
+ALTER TABLE mdb_columns_concepts
+    ADD PRIMARY KEY (id, cid);
+ALTER TABLE mdb_columns_concepts
+    ADD FOREIGN KEY (id) REFERENCES mdb_concepts (id);
+ALTER TABLE mdb_columns_concepts
+    ADD FOREIGN KEY (cID) REFERENCES mdb_columns (id);
+ALTER TABLE mdb_columns_concepts
     ADD SYSTEM VERSIONING;
 -- mdb_view
+ALTER TABLE mdb_view
+    ADD PRIMARY KEY (id);
 ALTER TABLE mdb_view
     ADD FOREIGN KEY (vdbid) REFERENCES mdb_databases (id);
 ALTER TABLE mdb_view
     ADD SYSTEM VERSIONING;
--- mdb_databases
-ALTER TABLE mdb_databases
-    ADD FOREIGN KEY (cid) REFERENCES mdb_containers (id);
-ALTER TABLE mdb_databases
+-- mdb_view_columns
+ALTER TABLE mdb_view_columns
+    ADD PRIMARY KEY (id);
+ALTER TABLE mdb_view_columns
+    ADD FOREIGN KEY (view_id) REFERENCES mdb_view (id);
+ALTER TABLE mdb_view_columns
+    ADD SYSTEM VERSIONING;
+-- mdb_access
+ALTER TABLE mdb_access
+    ADD PRIMARY KEY (aUserID, aDBID);
+ALTER TABLE mdb_access
+    ADD FOREIGN KEY (aDBID) REFERENCES mdb_databases (id);
+ALTER TABLE mdb_access
+    ADD FOREIGN KEY (aUserID) REFERENCES mdb_users (id);
+ALTER TABLE mdb_access
+    ADD SYSTEM VERSIONING;
+-- mdb_identifiers
+ALTER TABLE mdb_identifiers
+    ADD PRIMARY KEY (id);
+ALTER TABLE mdb_identifiers
+    ADD FOREIGN KEY (dbid) REFERENCES mdb_databases (id);
+ALTER TABLE mdb_identifiers
+    ADD FOREIGN KEY (tid) REFERENCES mdb_tables (id);
+ALTER TABLE mdb_identifiers
+    ADD FOREIGN KEY (vid) REFERENCES mdb_view (id);
+ALTER TABLE mdb_identifiers
+    ADD SYSTEM VERSIONING;
+-- mdb_identifier_licenses
+ALTER TABLE mdb_identifier_licenses
+    ADD PRIMARY KEY (pid, license_id);
+ALTER TABLE mdb_identifier_licenses
+    ADD FOREIGN KEY (pid) REFERENCES mdb_identifiers (id);
+ALTER TABLE mdb_identifier_licenses
+    ADD SYSTEM VERSIONING;
+-- mdb_identifier_titles
+ALTER TABLE mdb_identifier_titles
+    ADD PRIMARY KEY (id);
+ALTER TABLE mdb_identifier_titles
+    ADD FOREIGN KEY (pid) REFERENCES mdb_identifiers (id);
+ALTER TABLE mdb_identifier_titles
+    ADD SYSTEM VERSIONING;
+-- mdb_identifier_funders
+ALTER TABLE mdb_identifier_funders
+    ADD PRIMARY KEY (id);
+ALTER TABLE mdb_identifier_funders
+    ADD FOREIGN KEY (pid) REFERENCES mdb_identifiers (id);
+ALTER TABLE mdb_identifier_funders
+    ADD SYSTEM VERSIONING;
+-- mdb_identifier_descriptions
+ALTER TABLE mdb_identifier_descriptions
+    ADD PRIMARY KEY (id);
+ALTER TABLE mdb_identifier_descriptions
+    ADD FOREIGN KEY (pid) REFERENCES mdb_identifiers (id);
+ALTER TABLE mdb_identifier_descriptions
+    ADD SYSTEM VERSIONING;
+-- mdb_identifier_creators
+ALTER TABLE mdb_identifier_creators
+    ADD PRIMARY KEY (id);
+ALTER TABLE mdb_identifier_creators
+    ADD FOREIGN KEY (pid) REFERENCES mdb_identifiers (id);
+ALTER TABLE mdb_identifier_creators
+    ADD SYSTEM VERSIONING;
+-- mdb_identifier_related
+ALTER TABLE mdb_identifier_related
+    ADD PRIMARY KEY (id);
+ALTER TABLE mdb_identifier_related
+    ADD FOREIGN KEY (pid) REFERENCES mdb_identifiers (id);
+ALTER TABLE mdb_identifier_related
     ADD SYSTEM VERSIONING;
 -- mdb_users
 ALTER TABLE mdb_users
     ADD SYSTEM VERSIONING;
 -- mdb_have_access
+ALTER TABLE mdb_have_access
+    ADD PRIMARY KEY (user_id, database_id);
 ALTER TABLE mdb_have_access
     ADD FOREIGN KEY (database_id) REFERENCES mdb_databases (id);
+ALTER TABLE mdb_have_access
+    ADD FOREIGN KEY (user_id) REFERENCES mdb_users (id);
 ALTER TABLE mdb_have_access
     ADD SYSTEM VERSIONING;
 -- mdb_image_types
+ALTER TABLE mdb_image_types
+    ADD PRIMARY KEY (id);
 ALTER TABLE mdb_image_types
     ADD FOREIGN KEY (image_id) REFERENCES mdb_images (id);
 ALTER TABLE mdb_image_types
     ADD SYSTEM VERSIONING;
 -- mdb_image_operators
+ALTER TABLE mdb_image_operators
+    ADD PRIMARY KEY (id);
 ALTER TABLE mdb_image_operators
     ADD FOREIGN KEY (image_id) REFERENCES mdb_images (id);
 ALTER TABLE mdb_image_operators
+    ADD SYSTEM VERSIONING;
+-- mdb_ontologies
+ALTER TABLE mdb_ontologies
+    ADD PRIMARY KEY (id);
+ALTER TABLE mdb_ontologies
+    ADD SYSTEM VERSIONING;
+-- mdb_messages
+ALTER TABLE `mdb_messages`
     ADD SYSTEM VERSIONING;
\ No newline at end of file
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/DataTypeDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/DataTypeDto.java
index a4215c0392..908f54a1b4 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/DataTypeDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/DataTypeDto.java
@@ -7,6 +7,8 @@ import jakarta.validation.constraints.NotNull;
 import lombok.*;
 import lombok.extern.jackson.Jacksonized;
 
+import java.util.UUID;
+
 @Getter
 @Setter
 @Builder
@@ -17,6 +19,10 @@ import lombok.extern.jackson.Jacksonized;
 @ToString
 public class DataTypeDto {
 
+    @NotNull
+    @Schema(example = "816f55d5-1098-4f60-a4af-c8121c04dcca")
+    private UUID id;
+
     @NotBlank
     @JsonProperty("display_name")
     @Schema(example = "TIME(fsp)")
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/OperatorDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/OperatorDto.java
index b4b9061354..7eaee04810 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/OperatorDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/OperatorDto.java
@@ -19,6 +19,8 @@ import java.util.UUID;
 @ToString
 public class OperatorDto {
 
+    @NotNull
+    @Schema(example = "816f55d5-1098-4f60-a4af-c8121c04dccf")
     private UUID id;
 
     @NotBlank
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/ColumnDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/ColumnDto.java
index d50945740e..0df8efbf23 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/ColumnDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/ColumnDto.java
@@ -120,12 +120,10 @@ public class ColumnDto {
     @Schema(example = "false")
     private Boolean isNullAllowed;
 
-    @Schema(example = "[\"val1\"]")
     @Parameter(description = "enum values, only considered when type = ENUM")
-    private List<String> enums;
+    private List<EnumDto> enums;
 
-    @Schema(example = "[\"val1\"]")
     @Parameter(description = "enum values, only considered when type = ENUM")
-    private List<String> sets;
+    private List<SetDto> sets;
 
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/EnumDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/EnumDto.java
new file mode 100644
index 0000000000..1922dc308b
--- /dev/null
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/EnumDto.java
@@ -0,0 +1,28 @@
+package at.tuwien.api.database.table.columns;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.*;
+import lombok.extern.jackson.Jacksonized;
+
+import java.util.UUID;
+
+@Getter
+@Setter
+@Builder
+@EqualsAndHashCode
+@NoArgsConstructor
+@AllArgsConstructor
+@Jacksonized
+@ToString
+public class EnumDto {
+
+    @NotNull
+    @Schema(example = "1")
+    private UUID id;
+
+    @NotNull
+    @Schema(example = "3")
+    private String value;
+
+}
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/SetDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/SetDto.java
new file mode 100644
index 0000000000..763968e8f5
--- /dev/null
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/SetDto.java
@@ -0,0 +1,28 @@
+package at.tuwien.api.database.table.columns;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.*;
+import lombok.extern.jackson.Jacksonized;
+
+import java.util.UUID;
+
+@Getter
+@Setter
+@Builder
+@EqualsAndHashCode
+@NoArgsConstructor
+@AllArgsConstructor
+@Jacksonized
+@ToString
+public class SetDto {
+
+    @NotNull
+    @Schema(example = "1")
+    private UUID id;
+
+    @NotNull
+    @Schema(example = "3")
+    private String value;
+
+}
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java
index 41e161dbe4..b57f040668 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java
@@ -33,6 +33,7 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 })
 @NamedQueries({
         @NamedQuery(name = "Database.findAllDesc", query = "select distinct d from Database d order by d.id desc"),
+        @NamedQuery(name = "Database.findAllByInternalNameDesc", query = "select distinct d from Database d where d.internalName = ?1 order by d.id desc"),
         @NamedQuery(name = "Database.findAllAtLestReadAccessDesc", query = "select distinct d from Database d where exists(select a.hdbid from DatabaseAccess a where a.huserid = ?1 and a.hdbid = d.id) order by d.id desc"),
         @NamedQuery(name = "Database.findAllPublicOrSchemaPublicDesc", query = "select distinct d from Database d where d.isPublic = true or d.isSchemaPublic = true order by d.id desc"),
         @NamedQuery(name = "Database.findAllPublicOrSchemaPublicOrReadAccessDesc", query = "select distinct d from Database d where d.isPublic = true or d.isSchemaPublic = true or exists(select a.hdbid from DatabaseAccess a where a.huserid = ?1 and a.hdbid = d.id) order by d.id desc"),
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/ColumnEnum.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/ColumnEnum.java
new file mode 100644
index 0000000000..99002c8129
--- /dev/null
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/ColumnEnum.java
@@ -0,0 +1,45 @@
+package at.tuwien.entities.database.table.columns;
+
+import jakarta.persistence.*;
+import lombok.*;
+import org.hibernate.annotations.JdbcTypeCode;
+
+import java.util.UUID;
+
+import static jakarta.persistence.GenerationType.IDENTITY;
+
+@Data
+@Entity
+@Builder(toBuilder = true)
+@ToString
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode
+@jakarta.persistence.Table(name = "mdb_columns_enums", uniqueConstraints = {
+        @UniqueConstraint(columnNames = {"value"})
+})
+public class ColumnEnum {
+
+    @Id
+    @JdbcTypeCode(java.sql.Types.VARCHAR)
+    @Column(columnDefinition = "VARCHAR(36)")
+    private UUID id;
+
+    @ToString.Exclude
+    @EqualsAndHashCode.Exclude
+    @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
+    @JoinColumns({
+            @JoinColumn(name = "column_id", referencedColumnName = "id", nullable = false)
+    })
+    private TableColumn column;
+
+    @Column(columnDefinition = "VARCHAR(255)")
+    private String value;
+
+    @PrePersist
+    public void prePersist() {
+        if (this.id == null) {
+            this.id = UUID.randomUUID();
+        }
+    }
+}
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/ColumnSet.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/ColumnSet.java
new file mode 100644
index 0000000000..036c0202db
--- /dev/null
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/ColumnSet.java
@@ -0,0 +1,45 @@
+package at.tuwien.entities.database.table.columns;
+
+import jakarta.persistence.*;
+import lombok.*;
+import org.hibernate.annotations.JdbcTypeCode;
+
+import java.util.UUID;
+
+import static jakarta.persistence.GenerationType.IDENTITY;
+
+@Data
+@Entity
+@Builder(toBuilder = true)
+@ToString
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode
+@Table(name = "mdb_columns_sets", uniqueConstraints = {
+        @UniqueConstraint(columnNames = {"value"})
+})
+public class ColumnSet {
+
+    @Id
+    @JdbcTypeCode(java.sql.Types.VARCHAR)
+    @Column(columnDefinition = "VARCHAR(36)")
+    private UUID id;
+
+    @ToString.Exclude
+    @EqualsAndHashCode.Exclude
+    @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
+    @JoinColumns({
+            @JoinColumn(name = "column_id", referencedColumnName = "id", nullable = false)
+    })
+    private TableColumn column;
+
+    @Column(columnDefinition = "VARCHAR(255)")
+    private String value;
+
+    @PrePersist
+    public void prePersist() {
+        if (this.id == null) {
+            this.id = UUID.randomUUID();
+        }
+    }
+}
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java
index 8d16959062..eefa648dfd 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java
@@ -5,6 +5,8 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import jakarta.persistence.*;
 import lombok.*;
 import org.hibernate.annotations.JdbcTypeCode;
+import org.hibernate.annotations.OnDelete;
+import org.hibernate.annotations.OnDeleteAction;
 import org.springframework.data.annotation.CreatedDate;
 import org.springframework.data.annotation.LastModifiedDate;
 import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@@ -85,15 +87,13 @@ public class TableColumn implements Comparable<TableColumn> {
             inverseJoinColumns = @JoinColumn(name = "id", referencedColumnName = "id"))
     private TableColumnUnit unit;
 
-    @ElementCollection(fetch = FetchType.LAZY, targetClass = String.class)
-    @CollectionTable(name = "mdb_columns_enums", joinColumns = @JoinColumn(name = "column_id"))
-    @Column(name = "value", nullable = false)
-    private List<String> enums;
+    @OnDelete(action = OnDeleteAction.CASCADE)
+    @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST}, mappedBy = "column")
+    private List<ColumnEnum> enums;
 
-    @ElementCollection(fetch = FetchType.LAZY, targetClass = String.class)
-    @CollectionTable(name = "mdb_columns_sets", joinColumns = @JoinColumn(name = "column_id"))
-    @Column(name = "value", nullable = false)
-    private List<String> sets;
+    @OnDelete(action = OnDeleteAction.CASCADE)
+    @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST}, mappedBy = "column")
+    private List<ColumnSet> sets;
 
     @Column
     private Long size;
diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java
index ebe69cd7d7..88eef55622 100644
--- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java
+++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java
@@ -766,6 +766,8 @@ public interface MetadataMapper {
             @Mapping(target = "isNullAllowed", source = "data.nullAllowed"),
             @Mapping(target = "name", source = "data.name"),
             @Mapping(target = "internalName", expression = "java(nameToInternalName(data.getName()))"),
+            @Mapping(target = "enums", ignore = true),
+            @Mapping(target = "sets", ignore = true),
     })
     TableColumn columnCreateDtoToTableColumn(CreateTableColumnDto data, ContainerImage image);
 
diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/repository/DatabaseRepository.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/repository/DatabaseRepository.java
index 67c0df76ee..d984cb3337 100644
--- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/repository/DatabaseRepository.java
+++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/repository/DatabaseRepository.java
@@ -23,4 +23,6 @@ public interface DatabaseRepository extends JpaRepository<Database, UUID> {
 
     List<Database> findAllPublicOrSchemaPublicByInternalNameDesc(String internalName);
 
+    List<Database> findAllByInternalNameDesc(String internalName);
+
 }
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java
index ec0810b23c..de510dd970 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java
@@ -80,15 +80,24 @@ public class DatabaseEndpoint extends AbstractEndpoint {
         final List<Database> databases;
         if (principal != null) {
             if (internalName != null) {
-                log.debug("filter request to contain only public databases or where user with id {} has at least read access that match internal name {}", getId(principal), internalName);
-                databases = databaseService.findAllPublicOrSchemaPublicOrReadAccessByInternalName(getId(principal), internalName);
+                if (isSystem(principal)) {
+                    log.debug("filter request to contain only databases that match internal name: {}", internalName);
+                    databases = databaseService.findByInternalName(internalName);
+                } else {
+                    log.debug("filter request to contain only public databases or where user with id {} has at least read access that match internal name: {}", getId(principal), internalName);
+                    databases = databaseService.findAllPublicOrSchemaPublicOrReadAccessByInternalName(getId(principal), internalName);
+                }
             } else {
-                log.debug("filter request to contain only databases where user with id {} has at least read access", getId(principal));
-                databases = databaseService.findAllPublicOrSchemaPublicOrReadAccess(getId(principal));
+                if (isSystem(principal)) {
+                    databases = databaseService.findAll();
+                } else {
+                    log.debug("filter request to contain only databases where user with id {} has at least read access", getId(principal));
+                    databases = databaseService.findAllPublicOrSchemaPublicOrReadAccess(getId(principal));
+                }
             }
         } else {
             if (internalName != null) {
-                log.debug("filter request to contain only public databases that match internal name {}", internalName);
+                log.debug("filter request to contain only public databases that match internal name: {}", internalName);
                 databases = databaseService.findAllPublicOrSchemaPublicByInternalName(internalName);
             } else {
                 log.debug("filter request to contain only public databases");
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java
index c3f4ad1a71..2f3d38b64c 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java
@@ -99,7 +99,7 @@ public class TableEndpoint extends AbstractEndpoint {
         endpointValidator.validateOnlyPrivateSchemaHasRole(database, principal, "list-tables");
         return ResponseEntity.ok(database.getTables()
                 .stream()
-                .filter(t -> t.getIsPublic() || t.getIsSchemaPublic())
+                .filter(t -> t.getIsPublic() || t.getIsSchemaPublic() || (principal != null && isSystem(principal)))
                 .map(metadataMapper::tableToTableBriefDto)
                 .collect(Collectors.toList()));
     }
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java
index 0d56952073..2f6aa6f372 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java
@@ -23,6 +23,8 @@ public interface DatabaseService {
 
     List<Database> findAllPublicOrSchemaPublic();
 
+    List<Database> findByInternalName(String internalName);
+
     List<Database> findAllPublicOrSchemaPublicOrReadAccessByInternalName(UUID userId, String internalName);
 
     /**
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java
index 7e3298ef09..d01e5c0b6e 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java
@@ -62,6 +62,11 @@ public class DatabaseServiceImpl implements DatabaseService {
         return databaseRepository.findAllPublicOrSchemaPublicDesc();
     }
 
+    @Override
+    public List<Database> findByInternalName(String internalName) {
+        return databaseRepository.findAllByInternalNameDesc(internalName);
+    }
+
     @Override
     public List<Database> findAllPublicOrSchemaPublicOrReadAccessByInternalName(UUID userId, String internalName) {
         return databaseRepository.findAllPublicOrSchemaPublicOrReadAccessByInternalNameDesc(userId, internalName);
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java
index 01c0c990b7..6df1265b75 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java
@@ -9,9 +9,7 @@ import at.tuwien.api.database.table.columns.concepts.ColumnSemanticsUpdateDto;
 import at.tuwien.config.RabbitConfig;
 import at.tuwien.entities.database.Database;
 import at.tuwien.entities.database.table.Table;
-import at.tuwien.entities.database.table.columns.TableColumn;
-import at.tuwien.entities.database.table.columns.TableColumnConcept;
-import at.tuwien.entities.database.table.columns.TableColumnUnit;
+import at.tuwien.entities.database.table.columns.*;
 import at.tuwien.entities.user.User;
 import at.tuwien.exception.*;
 import at.tuwien.gateway.DataServiceGateway;
@@ -116,6 +114,20 @@ public class TableServiceImpl implements TableService {
             for (int i = 0; i < data.getColumns().size(); i++) {
                 final CreateTableColumnDto c = data.getColumns().get(i);
                 final TableColumn column = metadataMapper.columnCreateDtoToTableColumn(c, database.getContainer().getImage());
+                column.setEnums(c.getEnums()
+                        .stream()
+                        .map(e -> ColumnEnum.builder()
+                                .column(column)
+                                .value(e)
+                                .build())
+                        .toList());
+                column.setSets(c.getSets()
+                        .stream()
+                        .map(e -> ColumnSet.builder()
+                                .column(column)
+                                .value(e)
+                                .build())
+                        .toList());
                 column.setOrdinalPosition(idx[0]++);
                 column.setTable(table);
                 if (c.getUnitUri() != null) {
diff --git a/helm/dbrepo/files/create-event-listener.jar b/helm/dbrepo/files/create-event-listener.jar
index 4bf3b9382f8b919d7150ce68dfcd70b42042256b..422b57a19db31b248eb17c9cc4586df30558a85b 100644
GIT binary patch
delta 619
zcmbR1Ki6L<z?+#xgn@yBgJJK4h$xF>5&nrnO7*_MhZO|&rmOvLv}c&HtT#7ro7|S*
z(q(mb%r|WG5x&&uoArOM$yJLonXe2wZ<6mn)-6x)?VR_6+bUmb_GXuuBNq=T3S`;Y
zKY7DvwdKvJmAx-7Yz*n?@2JeyIy=4Uw0!xBLt9T<Sh+1T;nE0s<lm-sW~QFZJ1IWh
z+#T-MC0n1@pJ=SUGTqKU>h6v?y3c#Rud&!*npMUu;=cXsx<gXBf6tb){dLn&vw!mc
z<j*~EPjj5NeBL?b_use~m$<XOv#n)NZCJ8#DYO5&&?{D7KB@R03pB9eJ}qP=@nhXa
zgM{|O=lfW)<!$WC6w(7;=iGV!ej(raSjpS_zW!#M-+94#p4y*!=HDx__GPSbb*;U(
z+N$343cu#zJ(=7KXGP_GT(F95o3nyb(5ip>1#g<3eJF^N^v}3Bmuvk-WA$5^g@%`I
zF7Xi3xfE$7<!^dO<+Q`nqd8XRysl(Tn{xT`-t_QV%kQ(<Joy5z9ds^<kE&91ywE-^
zAw^~{Gbkds7#KJh81_z>ypd6rY0reoHyHIm6bF+$)7}Y_HJQ{vR3MW!h^k{U1yNg>
zyg^Esn9qTzOUyk?dnas8V42Irv}eNR|7<**AU>}^tsqEokK$|)rKvQ90~Xtpk1AP#
z#2A%LK?YbT+kvPGWqpv~N@X(;^-$RwM9HbRf~ZuLXpoXaDj^_BLNyO0*r6H+;=NFH
T0`YXzc7v#wYMCG^MBNhrpS=(S

delta 619
zcmbR1Ki6L<z?+#xgn@yBgTXBzBC1R0!NG|_O7#be4k-xiO;`JWfS=)5#-g2})fuw6
z>07?}B?L<fKRTdxZNL68Grzfhx0yF==&$YHzNY0OtHqM_33J!^x+$4)H1A|>T=3$}
zl!;R_4o<MvF5kuKon&UEoYt!+8oR>wu8hO4>`aL{%CQ-m7s40mOL?E@IHfC-r6qMI
zkbT=#p}dLpw%<2s*UmOswM{beOxAOcI;HG@CyogcHeu~TS_VJN@AH0<R+Rof;lKLx
zvb|?c@O^w>bguun^5xd#8#1O6YAV7fwrZ{^$dK;rWj(I{sY0S+vG9H!7wxKj)hD(Z
z{CybizGv(CzIoOY1Or#5TzNa+<>~z0SC&=2|7L5KxUb!$??t_OnX<Ok`d-G)*n20n
zsxRN*J@<D{c9GiauJ;dBPDj1@-SAUo`rY^i7pl(wd${Ea-@%5xB5}^E^|w@pI9O@A
zT?}zOnV{63EPAxi(8Jy9REXd4$te=gD~on+-}?0G&if_>TNw6yl55(V^|GbHaemaE
ziHRQ=K@q{lz`()4;1)1>Bcm#lYry0ijCxFN0h2kH<Uy1slNyK$WYPvvbxfupYAcgB
zNF@{VIS_S;xrfOuU~>Y?TqY3xpN)qTMDq&N3W5~(D9#2^no3hRV6i><sFD>(j8WMX
zWPpXT9f((<tPi4ADw~0*hsxF<N>0TUM5U@kgH#?;2?0?Os(B#64%Iji^+MGNMCqvQ
O22n57GC@>`x+egA0sC_R

diff --git a/lib/python/dbrepo/RestClient.py b/lib/python/dbrepo/RestClient.py
index 0cd8afe272..76eeaa18a1 100644
--- a/lib/python/dbrepo/RestClient.py
+++ b/lib/python/dbrepo/RestClient.py
@@ -1680,6 +1680,20 @@ class RestClient:
         raise ResponseCodeError(f'Failed to get licenses: response code: {response.status_code} is not '
                                 f'200 (OK): {response.text}')
 
+    def get_ontologies(self) -> List[OntologyBrief]:
+        """
+        Get list of ontologies.
+
+        :returns: List of ontologies, if successful.
+        """
+        url = f'/api/ontology'
+        response = self._wrapper(method="get", url=url)
+        if response.status_code == 200:
+            body = response.json()
+            return TypeAdapter(List[OntologyBrief]).validate_python(body)
+        raise ResponseCodeError(f'Failed to get ontologies: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
+
     def get_concepts(self) -> List[ConceptBrief]:
         """
         Get list of concepts known to the metadata database.
@@ -1696,7 +1710,7 @@ class RestClient:
 
     def get_identifiers(self, database_id: str = None, subset_id: str = None, view_id: str = None,
                         table_id: str = None, type: IdentifierType = None, status: IdentifierStatusType = None) -> List[
-                                                                                                                       Identifier] | str:
+                                                                                                                       Identifier]:
         """
         Get list of identifiers, filter by the remaining optional arguments.
 
@@ -1745,7 +1759,49 @@ class RestClient:
         raise ResponseCodeError(f'Failed to get identifiers: response code: {response.status_code} is not '
                                 f'200 (OK): {response.text}')
 
-    def get_images(self) -> List[ImageBrief] | str:
+    def get_identifier(self, identifier_id: str) -> Identifier:
+        """
+        Get list of identifiers, filter by the remaining optional arguments.
+
+        :param identifier_id: The identifier id.
+
+        :returns: The identifier, if successful.
+
+        :raises NotExistsError: If the identifier does not exist.
+        :raises ResponseCodeError: If something went wrong with the retrieval of the identifier.
+        """
+        url = f'/api/identifier/{identifier_id}'
+        response = self._wrapper(method="get", url=url, headers={'Accept': 'application/json'})
+        if response.status_code == 200:
+            body = response.json()
+            return Identifier.model_validate(body)
+        if response.status_code == 404:
+            raise NotExistsError(f'Failed to get identifier: not found')
+        raise ResponseCodeError(f'Failed to get identifier: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
+
+    def get_image(self, image_id: str) -> Image:
+        """
+        Get container image.
+
+        :param image_id: The image id.
+
+        :returns: The image, if successful.
+
+        :raises NotExistsError: If the image does not exist.
+        :raises ResponseCodeError: If something went wrong with the retrieval of the image.
+        """
+        url = f'/api/image/{image_id}'
+        response = self._wrapper(method="get", url=url, headers={'Accept': 'application/json'})
+        if response.status_code == 200:
+            body = response.json()
+            return Image.model_validate(body)
+        if response.status_code == 404:
+            raise NotExistsError(f'Failed to get image: not found')
+        raise ResponseCodeError(f'Failed to get image: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
+
+    def get_images(self) -> List[ImageBrief]:
         """
         Get list of container images.
 
@@ -1759,7 +1815,7 @@ class RestClient:
         raise ResponseCodeError(f'Failed to get images: response code: {response.status_code} is not '
                                 f'200 (OK): {response.text}')
 
-    def get_messages(self) -> List[Message] | str:
+    def get_messages(self) -> List[Message]:
         """
         Get list of messages.
 
diff --git a/lib/python/dbrepo/api/dto.py b/lib/python/dbrepo/api/dto.py
index c378a6d9aa..d004a9faa3 100644
--- a/lib/python/dbrepo/api/dto.py
+++ b/lib/python/dbrepo/api/dto.py
@@ -24,6 +24,13 @@ class Image(BaseModel):
     data_types: List[DataType] = field(default_factory=list)
 
 
+
+class Operator(BaseModel):
+    id: str
+    display_name: str
+    value: str
+    documentation: str
+
 class ImageBrief(BaseModel):
     id: str
     name: str
@@ -464,6 +471,15 @@ class License(BaseModel):
     description: str
 
 
+class OntologyBrief(BaseModel):
+    id: str
+    uri: str
+    prefix: str
+    sparql: bool
+    rdf: bool
+    uri_pattern: Optional[str] = None
+
+
 class Tuple(BaseModel):
     data: dict
 
@@ -666,7 +682,7 @@ class Identifier(BaseModel):
     publication_month: Optional[int] = None
 
 class Message(BaseModel):
-    id: int
+    id: str
     type: str
     link: Optional[str] = None
     link_text: Optional[str] = None
@@ -945,7 +961,18 @@ class UpdateQuery(BaseModel):
     persist: bool
 
 
+class ColumnEnum(BaseModel):
+    id: str
+    value: str
+
+
+class ColumnSet(BaseModel):
+    id: str
+    value: str
+
+
 class DataType(BaseModel):
+    id: str
     display_name: str
     value: str
     documentation: str
diff --git a/lib/python/tests/test_unit_ontology.py b/lib/python/tests/test_unit_ontology.py
new file mode 100644
index 0000000000..55565b6cd2
--- /dev/null
+++ b/lib/python/tests/test_unit_ontology.py
@@ -0,0 +1,35 @@
+import unittest
+
+import requests_mock
+
+from dbrepo.RestClient import RestClient
+from dbrepo.api.dto import OntologyBrief
+
+
+class OntologyUnitTest(unittest.TestCase):
+
+    def test_get_ontologies_empty_succeeds(self):
+        with requests_mock.Mocker() as mock:
+            # mock
+            mock.get('/api/ontology', json=[])
+            # test
+            response = RestClient().get_ontologies()
+            self.assertEqual([], response)
+
+    def test_get_ontologies_succeeds(self):
+        with requests_mock.Mocker() as mock:
+            exp = [OntologyBrief(id="ec6ee082-b6b2-4d65-b931-2f1735f25759",
+                                 uri="http://www.ontology-of-units-of-measure.org/resource/om-2/",
+                                 prefix="om",
+                                 sparql=False,
+                                 rdf=True,
+                                 uri_pattern="http://www.ontology-of-units-of-measure.org/resource/om-2/.*")]
+            # mock
+            mock.get('/api/ontology', json=[exp[0].model_dump()])
+            # test
+            response = RestClient().get_ontologies()
+            self.assertEqual(exp, response)
+
+
+if __name__ == "__main__":
+    unittest.main()
-- 
GitLab