DiveLogix360 – UC00-Datenbank-Iststand¶
Stand: 15.10.2026 15:41 Branch: main Status: Aktiv
Zweck: Reproduzierbarer Nachweis des tatsächlich ausgerollten UC00-Datenbankstands in der Entwicklungsumgebung.
Abgrenzung: Der Nachweis bestätigt weder eine Produktionsfreigabe noch die vollständige Backend-, Sicherheits- oder RLS-Testabdeckung.
1. Geprüfte Ausgangslage¶
Vor der Veränderung wurde die Entwicklungsdatenbank nur lesend inventarisiert. Der alte Stand enthielt:
- 22 Anwendungstabellen ohne Prisma-Migrationshistorie;
- keine Tenants, Benutzer, Vertragsdokumente oder sonstigen fachlichen beziehungsweise personenbezogenen Datensätze;
- drei globale Benachrichtigungsvorlagen und vier Plan-Features als einzige Referenzdaten.
Die sieben Referenzdatensätze entsprachen bereits eingecheckten historischen Seed-Quellen. Weil keine zu erhaltenden Fach- oder Personendaten vorlagen, war ein kontrollierter Neuaufbau aus der freigegebenen Migrationsfolge vertretbar. Der Neuaufbau wurde erst nach dieser Prüfung mit prisma migrate reset --force ausgeführt.
2. Ausgerollte Migrationsfolge¶
Die Supabase-Entwicklungsdatenbank verwendet PostgreSQL 17.6. Folgende eingecheckte Migrationen wurden vollständig und ohne Rollback angewendet:
| Reihenfolge | Migration | Inhalt |
|---|---|---|
| 1 | 20260809145000_uc00_prisma_v4_initial |
Prisma-v4-Initialschema mit 35 Fachtabellen, Relationen, Indizes und Fremdschlüsseln |
| 2 | 20260809151500_uc00_database_guardrails |
PostgreSQL-Constraints, drei UC00-Rollen, minimale Rechte, Kontextfunktionen sowie ENABLE und FORCE ROW LEVEL SECURITY |
| 3 | 20260809165000_uc00_email_identity_guardrails |
Partieller globaler Eindeutigkeitsindex für gültige offene Einladungen; abgelaufene Einladungen werden vor der Indexerstellung statusgerecht überführt |
| 4 | 20260809180000_uc00_contract_party_contact_fields |
Additive Vertragskontaktfelder contract_contact_name und contract_contact_email am Tenant |
| 5 | 20261012231500_uc00_notification_log_invitation_link |
Einladungsverweis notification_log.invitation_token_id mit tenantgebundenem Fremdschlüssel, eindeutige Kombination id/tenant_id auf invitation_tokens, zwei Indizes und erweiterte Prüfregel (ADR-024) |
| 6 | 20261014111600_uc00_revoke_login_direct_privileges |
Entzieht den Runtime-Logins dlx_login_platform und dlx_login_tenant alle direkten Rechte auf Tabellen und Sequenzen in public, auf Funktionen und das Schema app sowie das direkt vergebene USAGE auf public (ADR-012) |
prisma migrate deploy hat die sechste Migration am 14.10.2026 angewendet; Datenbank und alle sechs eingecheckten Migrationen stimmen überein.
3. Basis-Seed¶
Der Basis-Seed wurde auf nicht personenbezogene, versionierte Referenzdaten begrenzt. Er erzeugt idempotent:
- drei globale deutsche Benachrichtigungsvorlagen;
- vier Plan-Features für den vorbereiteten Test-, Starter-, Professional- und Enterprise-Umfang.
Benutzer, Tenants, Passwörter, Einladungs-, Vertrags- oder Authentifizierungstoken werden nicht automatisch erzeugt. Fachliche Testdaten erhalten einen getrennten und kontrollierten Aufbau im Rahmen der vertikalen UC00-Implementierung.
4. Nachgewiesener Iststand¶
| Merkmal | Nachgewiesener Stand |
|---|---|
| Tabellen | 36 einschliesslich _prisma_migrations; davon 35 Fachtabellen |
| Migrationshistorie | 6 erfolgreich abgeschlossene Migrationen (sechste am 14.10.2026) |
| Nicht leere Tabellen und Datensätze | 8 Tabellen mit 44 Datensätzen (Inventur über DIRECT_URL vom 14.10.2026) |
| UC00-Rollen | dlx_migrator, dlx_app_tenant, dlx_app_platform |
| Row-Level Security (RLS, zeilenbasierte Zugriffskontrolle) | Auf allen 35 Fachtabellen aktiviert und erzwungen |
| Automatische Verwaltungszuweisung | Für die Migrationsverbindung mit ADMIN, aber ohne INHERIT und ohne SET; daher keine automatische Nutzung als Anwendungsrolle |
| Fach- oder Personendaten | Keine Kunden- oder Produktivdaten; vorhanden sind das Entwicklungskonto des Superadmins mit Sitzungen und Anmeldeprotokoll |
| Rechte der Runtime-Logins | Keine direkten Rechte; Zugriff nur über SET LOCAL ROLE in die Anwendungsrolle (DB-RLS-B09, CTX-00) |
PostgreSQL 17 verwaltet ADMIN, INHERIT und SET bei Rollenzuweisungen getrennt. Die sichere Ausgangskonfiguration wurde vor und nach der Laufzeitprüfung exakt verglichen. Grundlagen: PostgreSQL-Rollenattribute, SET ROLE und REVOKE.
5. Grundlegende RLS-Laufzeitprüfung¶
Das Prüfskript backend/scripts/test-uc00-database-guards.mjs führt neun Datenbankschutzprüfungen aus. Der letzte erfolgreiche Gesamtlauf erfolgte am 14.10.2026 nach der sechsten Migration:
| ID | Prüfung | Ergebnis |
|---|---|---|
| DB-RLS-B01 | SET-Berechtigung nur innerhalb des Tests und vollständige Wiederherstellung |
Erfolgreich |
| DB-RLS-B02 | Standardverweigerung der Tenant-Rolle ohne Tenant-Kontext | Erfolgreich |
| DB-RLS-B03 | Tenant A kann Tenant B nicht lesen | Erfolgreich |
| DB-RLS-B04 | Tenantgebundene Schreib- und Leseoperation für das eigene Profil | Erfolgreich |
| DB-RLS-B05 | Kontextwechsel blendet Daten des vorherigen Tenants vollständig aus | Erfolgreich |
| DB-RLS-B06 | Globale Benachrichtigungsvorlagen sind tenantseitig lesbar | Erfolgreich |
| DB-RLS-B07 | Getrennte Plattformrolle besitzt die vorgesehene tenantübergreifende Sicht | Erfolgreich |
| DB-RLS-B08 | Dieselbe normalisierte E-Mail kann tenantübergreifend nur eine offene Einladung besitzen; widerrufene Historie bleibt zulässig | Erfolgreich |
| DB-RLS-B09 | Die Runtime-Logins besitzen keine direkten Rechte auf Tabellen, Sequenzen, Funktionen oder das Schema app |
Erfolgreich (seit 14.10.2026) |
Alle temporären Testdaten und Rollenerweiterungen liegen in einer absichtlich zurückgerollten Transaktion. Eine anschliessende Inventur bestätigte damals wieder genau zehn Datensätze sowie die unveränderten sicheren Rollenoptionen. Nach Anwendung der vierten additiven Migration bestätigen prisma migrate status und die Inventur den aktuellen Datenbankstand mit elf Datensätzen. Der erneute Schutzprüfungslauf scheiterte damals an der nicht erreichbaren Runtime-Verbindung. Seit DATABASE_URL auf den Laufzeitzugang dlx_login_platform zeigt, der nur einer der beiden App-Rollen angehört, muss das Skript mit dem Migrationszugang aus DIRECT_URL ausgeführt werden (Abschnitt 6). So ausgeführt, waren am 13.10.2026 alle acht Prüfungen erfolgreich.
5.1 Kontextprüfung der Runtime-Logins (14.10.2026)¶
Inventur im SQL-Editor vom 14.10.2026:
| Anwendungsrolle | Login | Erbt Rechte (INHERIT) |
Darf wechseln (SET) |
|---|---|---|---|
dlx_app_platform |
dlx_login_platform |
Nein | Ja |
dlx_app_tenant |
dlx_login_tenant |
Nein | Ja |
Inventur vor Paket 4: Beide Logins besassen direkte Rechte (SELECT, INSERT, UPDATE, DELETE) auf allen 36 Tabellen in public, vergeben von postgres, ausserdem ein direktes USAGE auf die Schemas public und app; dlx_login_tenant durfte zusätzlich fünf Funktionen in app ausführen. Standardrechte für künftige Tabellen bestanden nicht. Einzige Tabelle ohne RLS war _prisma_migrations; dort hätten die Logins ohne Kontext den Migrationsverlauf lesen, ändern und löschen können. Die sechste Migration hat diese Rechte am 14.10.2026 entzogen.
Das Prüfskript backend/scripts/test-uc00-context-runtime.ts (npm run context:check) ergab am 14.10.2026 (CTX-07 seit Paket 2, CTX-08 seit Paket 3):
| ID | Prüfung | Ergebnis |
|---|---|---|
| CTX-00 | Direkter Zugriff des Logins dlx_login_platform ohne Kontextwrapper |
Vor Paket 4 (Information): rolbypassrls = false, sieht 0 von 1 Benutzer. Seit Paket 4 geprüft: abgewiesen (permission denied) |
| CTX-01 | Tenant-Kontext eines unbekannten Tenants sieht keine Benutzer | Erfolgreich |
| CTX-02 | invitation_tokens ist im Tenant-Kontext gesperrt |
Erfolgreich (permission denied) |
| CTX-03 | refresh_tokens ist im Tenant-Kontext gesperrt |
Erfolgreich (permission denied) |
| CTX-04 | Plattform-Kontext liest Einladungen und Sitzungen | Erfolgreich |
| CTX-05 | Tenant-Kontext sieht genau die eigenen Benutzer | Ohne Aussagekraft: kein Tenant mit Benutzern vorhanden |
| CTX-06 | UsersService.findAll eines Tenant-Admins |
Übersprungen: kein aktiver Tenant-Admin vorhanden |
| CTX-07 | tenant_profiles, tenant_onboardings und onboarding_steps bleiben für einen fremden Tenant leer (Paket 2) |
Ohne Aussagekraft: in diesen Tabellen sind noch keine Daten vorhanden |
| CTX-08 | TenantsService.findAll liefert dieselbe Anzahl wie eine Zählung im Plattform-Kontext (Paket 3) |
Ohne Aussagekraft: noch keine Tenants vorhanden |
Vor Paket 4 sah ein Lesezugriff ohne Kontextwrapper in den 35 Fachtabellen keine Zeilen (Inventur mit dem Laufzeit-Login vom 14.10.2026: nur _prisma_migrations sichtbar). Seit Paket 4 wird jeder Zugriff ohne Kontext abgewiesen. Die Tenant-Isolation auf Datenbankebene belegen DB-RLS-B03 bis B05. Den positiven Nachweis über die Anwendungsdienste erbringt die Isolationsprüfung in Abschnitt 5.2.
Das Anmeldeprotokoll (auth_log) wurde vor der Umstellung auf den Plattform-Kontext nie geschrieben: Am 14.10.2026 enthielt die Tabelle genau einen Eintrag, die erste Anmeldung nach der Umstellung (login_success), obwohl zuvor mehrere Anmeldungen stattgefunden hatten. Seit der Umstellung wird das Protokoll geschrieben.
5.2 Isolationsprüfung mit kontrollierten Testdaten (14.10.2026)¶
Das Prüfskript backend/scripts/test-uc00-isolation.ts (npm run isolation:check) legt pro Lauf über den Migrationszugang zwei Test-Tenants mit je einem Tenant-Admin, einem Mitarbeiter und einer offenen Einladung an (Präfix «DLX-ISO-TEST», Adressen unter example.test, nicht anmeldefähig). Geprüft wird über die echten Dienste mit den Runtime-Logins; danach werden alle Testdaten entfernt. Für ISO-08 wird kurzzeitig ein vollständiges Testprofil für Tenant A angelegt; der Einladungsversand ist während der Prüfung durch eine leere Funktion ersetzt, es wird keine E-Mail versendet.
| ID | Prüfung | Ergebnis |
|---|---|---|
| ISO-01 | Benutzerliste von Admin A enthält nur Benutzer von Tenant A | Erfolgreich |
| ISO-02 | Benutzer von Tenant B ist für Admin A nicht sichtbar (404) | Erfolgreich |
| ISO-03 | Statusänderung an einem Benutzer von B wird abgewiesen (404); der Benutzer bleibt unverändert | Erfolgreich |
| ISO-04 | Einladungsliste von Admin A enthält nur die Einladung von Tenant A | Erfolgreich |
| ISO-05 | Onboarding-Status von A berührt das Onboarding von B nicht | Erfolgreich |
| ISO-06 | Superadmin sieht in der Tenant-Liste beide Test-Tenants | Erfolgreich |
| ISO-07 | Einladung durch Admin A ohne vollständiges Schulprofil wird mit 409 school_profile_incomplete abgewiesen; es entsteht keine Einladung (G6, T13) |
Erfolgreich |
| ISO-08 | Nach Erfassung eines vollständigen Schulprofils wird die Einladung zugelassen (pending) |
Erfolgreich |
| ISO-99 | Testdaten nach dem Lauf vollständig entfernt | Erfolgreich |
Aussagegrenze: Die Dienste schränken ihre Abfragen zusätzlich selbst auf den eigenen Tenant ein. ISO-01 bis ISO-04 belegen das korrekte Zusammenspiel von Diensten, Kontextwrapper und RLS, nicht die Wirkung von RLS allein; diese belegen DB-RLS-B03 bis B05 und CTX-01.
6. Reproduzierbare Prüfungen¶
Die folgenden Befehle wurden im Verzeichnis backend für den aktuellen Stand erfolgreich ausgeführt:
npm.cmd run prisma:migrate:status
npm.cmd run prisma:migrations:validate
npm.cmd exec -- prisma validate
npm.cmd run prisma:seed
npm.cmd run prisma:inventory -- --summary
Die Datenbankschutzprüfungen benötigen den Migrationszugang, weil sie vorübergehend Rollenoptionen setzen und wiederherstellen. npm run prisma:guards:test verwendet DATABASE_URL und bricht deshalb mit dem Laufzeitzugang mit «Beide UC00-Rollen muessen vorliegen» ab. Ausgeführt wird die Prüfung ohne Änderung der .env mit:
node -e "require('dotenv').config(); process.env.DATABASE_URL = process.env.DIRECT_URL; import('./scripts/test-uc00-database-guards.mjs');"
Letzter erfolgreicher Lauf: 14.10.2026 nach der sechsten Migration, neun von neun Prüfungen. Basis-Seed (npm run prisma:seed), Inventur (npm run prisma:inventory) und prisma/seed-dev-superadmin.ts verbinden sich seit Paket 4 selbst über DIRECT_URL.
Die Kontextprüfung der Runtime-Logins läuft mit den Laufzeitzugängen aus der .env und ändert keine Daten:
npm run context:check
Die Isolationsprüfung (Abschnitt 5.2) legt kurzzeitig Testdaten an und entfernt sie wieder:
npm run isolation:check
Der Backend-Build ist davon getrennt zu bewerten. Nach erneuter Prisma-Client-Erzeugung ist er zuletzt am 14.10.2026 mit 149 Unit-Tests in 16 Testdateien erfolgreich. Dies ändert den hier nachgewiesenen Datenbank-Iststand nicht.
7. Verbleibende Grenzen¶
Der Entwicklungsdatenbank-Rollout und die grundlegende RLS-Wirksamkeit sind nachgewiesen. Weiterhin offen bleiben insbesondere:
- vollständige Laufzeitnachweise für die provisionierten, nicht administrativen Login-Rollen
dlx_login_platformunddlx_login_tenant; ihre Rollenzuweisungen sind per Inventur vom 12.10.2026 bestätigt und der Auth-Flow T-01 bis T-11 ist mit ihnen manuell nachgewiesen; - Umstellung aller betroffenen Backend-Dienste auf die implementierten Prisma-Runtime-Clients und den transaktionsgebundenen Tenant-, Benutzer- und Request-Kontext;
- vollständige Rollen-, Ressourcen-, Negativ-, Schreib-, Lösch- und Connection-Pooling-Tests;
- Laufzeitprüfungen für alle Fachtabellen und sicherheitsrelevanten Constraints;
- Integrationsprüfung der ausgerollten Vertragskontaktfelder im vollständigen Vertragsablauf;
- vollständige Backend-Umstellung auf das Prisma-v4-Zielschema;
- produktive Provisionierung, Härtung, Überwachung und Rechteprüfung.
Die acht Basisprüfungen sind daher ein belastbarer Zwischenbeleg, aber kein Ersatz für die vollständigen Testkriterien UC00-09-03 und UC00-09-23.
Änderungshistorie¶
| Datum, Uhrzeit | Version | Änderung | Autor |
|---|---|---|---|
| 15.10.2026 15:41 | 1.19 | 2 Verweise auf Kriterien der UC00-Abschlusscheckliste direkt verlinkt | Claude |
| 14.10.2026 13:59 | 1.18 | Abschnitt 5.2 um ISO-07 und ISO-08 (Einladung erst nach vollständigem Schulprofil, G6/T13) ergänzt; 149 Unit-Tests in 16 Testdateien | Claude |
| 14.10.2026 13:42 | 1.17 | Abschnitt 5.2 Isolationsprüfung mit kontrollierten Testdaten (ISO-01 bis ISO-06, ISO-99) vom 14.10.2026 ergänzt | Claude |
| 14.10.2026 13:32 | 1.16 | Sechste Migration (Entzug der direkten Login-Rechte), DB-RLS-B09, CTX-00 als Prüfung, Inventur vor und nach Paket 4 sowie Iststand vom 14.10.2026 nachgeführt | Claude |
| 14.10.2026 13:06 | 1.15 | Einträge der Änderungshistorie vom 14.10.2026 an die richtige Stelle verschoben und fehlerhafte Zeitangaben korrigiert; inhaltlich unverändert | Claude |
| 14.10.2026 13:03 | 1.14 | CTX-08 (Paket 3) und geprüfter Schreibzugriff auf auth_log ergänzt; teststand nachgeführt: 139 Unit-Tests in 15 Testdateien erfolgreich (14.10.2026) |
Claude |
| 14.10.2026 12:40 | 1.13 | Kontextprüfung um CTX-07 (Onboarding-Tabellen, Paket 2) ergänzt; teststand nachgeführt: 90 Unit-Tests in 15 Testdateien erfolgreich (14.10.2026) | Claude |
| 14.10.2026 12:15 | 1.12 | Abschnitt 5.1 Kontextprüfung der Runtime-Logins ergänzt (Rollenzuweisungen, direkte Tabellenrechte, CTX-00 bis CTX-06); Schutzprüfung vom 14.10.2026 und teststand nachgeführt: 81 Unit-Tests in 14 Testdateien erfolgreich (14.10.2026) | Claude |
| 14.10.2026 10:14 | 1.11 | Teststand nachgeführt: 71 Unit-Tests in 12 Testdateien und OpenAPI-Prüfung mit 35 Operationen und 67 Testfällen erfolgreich (14.10.2026) | Claude |
| 14.10.2026 08:10 | 1.10 | Teststand nachgeführt: 59 Unit-Tests in 11 Testdateien erfolgreich (14.10.2026) | Claude |
| 13.10.2026 14:20 | 1.9 | Teststand nachgeführt: 43 Unit-Tests in 9 Testdateien und OpenAPI-Prüfung mit 63 Testfällen erfolgreich (13.10.2026) | Claude |
| 13.10.2026 00:38 | 1.8 | Verbleibende Grenzen bereinigt: Login-Rollen sind provisioniert und per Inventur bestätigt; offen bleiben vollständige Laufzeitnachweise | Claude |
| 13.10.2026 00:34 | 1.7 | Fünfte Migration (ADR-024) und erfolgreiche Wiederholung der acht Datenbankschutzprüfungen vom 13.10.2026 nachgeführt; Ausführung mit DIRECT_URL dokumentiert | Claude |
| 12.10.2026 09:58 | 1.6 | Änderungshistorie ans Dokumentende verschoben und Sprunglink «Änderungshistorie anzeigen» unter dem Kopf ergänzt (einheitlicher Dokumentaufbau gemäss AGENTS.md) | Claude |
| 12.10.2026 09:08 | 1.5 | Explizite Sprungmarke für Abschnitt 5 ergänzt, damit der Verweis der Abschlusscheckliste auch in MkDocs funktioniert | Claude |
| 10.08.2026 20:00 | 1.4 | Sicheren UC00-Merge-Stand nach main übernommen und Branch-Nachführung ergänzt |
Codex |
| 10.08.2026 19:46 | 1.3 | Erfolgreichen Backend-Build sowie kontrollierten Rollout und Inventarnachweis der vierten Migration nachgeführt | Codex |
| 09.08.2026 17:32 | 1.2 | E-Mail-Schutzmigration ausgerollt, Datenbankinventur aktualisiert und globale Einladungsadresse als achte Laufzeitprüfung nachgewiesen | Codex |
| 09.08.2026 16:40 | 1.1 | Getrennte Prisma-Runtime-Clients und Kontextwrapper als implementierten, noch nicht provisionierten Anwendungspfad abgegrenzt | Codex |
| 09.08.2026 16:25 | 1.0 | Kontrollierten Neuaufbau der Entwicklungsdatenbank, Basis-Seed und grundlegende RLS-Laufzeitprüfung dokumentiert | Codex |