79 lines
3.7 KiB
SQL
79 lines
3.7 KiB
SQL
-- ---------------------------------------------------------------------------
|
||
-- HANDGESCHRIEBEN. Prisma erzeugt hier zusaetzlich Loeschbefehle fuer die
|
||
-- zusammengesetzten Fremdschluessel (Mandantengrenze), die Trigramm-Indizes
|
||
-- (Archivsuche), die partiellen eindeutigen Indizes und die Trigger auf
|
||
-- veroeffentlichten Versionen: es kennt sie nicht, weil sie sich im Schema nicht
|
||
-- ausdruecken lassen. Diese Loeschbefehle sind bewusst gestrichen.
|
||
--
|
||
-- tests/datenbankregeln.test.ts prueft, dass alle diese Objekte vorhanden sind –
|
||
-- ein versehentlich stehengelassener Loeschbefehl faellt dort sofort auf.
|
||
-- ---------------------------------------------------------------------------
|
||
|
||
-- Mandantenspalte fuer das Protokoll (#023).
|
||
--
|
||
-- CLAUDE.md verlangt sie fuer jede kundenbezogene Zeile. Das Protokoll hatte sie
|
||
-- nicht, und damit liess sich die Protokoll-Ansicht nicht nach Mandant filtern,
|
||
-- ohne je Eintrag die Entitaet nachzuschlagen. Leer heisst **global**:
|
||
-- Einstellungen, Benutzer, kundenfreie Vorlagen, Schnellstart.
|
||
ALTER TABLE "Protokoll"
|
||
ADD COLUMN "kundeId" TEXT;
|
||
|
||
CREATE INDEX "Protokoll_kundeId_erstelltAm_idx" ON "Protokoll"("kundeId", "erstelltAm");
|
||
|
||
ALTER TABLE "Protokoll"
|
||
ADD CONSTRAINT "Protokoll_kundeId_fkey"
|
||
FOREIGN KEY ("kundeId") REFERENCES "Kunde" ("id")
|
||
ON DELETE RESTRICT ON UPDATE CASCADE;
|
||
|
||
-- ---- Nachfuehrung ---------------------------------------------------------
|
||
-- Vorhandene Eintraege bekommen ihren Kunden, soweit er sich ableiten laesst.
|
||
-- Ohne das traegt jeder alte Eintrag "global" und waere fuer einen auf Kunden
|
||
-- beschraenkten Benutzer sichtbar -- dieselbe Falle wie bei den Umstiegen in
|
||
-- #021 und #020, nur hier mit Folgen fuer die Sichtbarkeit.
|
||
|
||
-- 1. Alles, was an einem Lauf haengt: der Lauf kennt seinen Kunden.
|
||
UPDATE "Protokoll" AS p
|
||
SET "kundeId" = l."kundeId"
|
||
FROM "Lauf" AS l
|
||
WHERE p."laufId" = l."id" AND p."kundeId" IS NULL;
|
||
|
||
-- 2. Die kundentragenden Entitaeten, je ueber ihre eigene Tabelle.
|
||
UPDATE "Protokoll" AS p SET "kundeId" = m."kundeId"
|
||
FROM "Mitarbeiter" AS m
|
||
WHERE p."entitaet" = 'Mitarbeiter' AND p."entitaetId" = m."id" AND p."kundeId" IS NULL;
|
||
|
||
UPDATE "Protokoll" AS p SET "kundeId" = g."kundeId"
|
||
FROM "Geraet" AS g
|
||
WHERE p."entitaet" = 'Geraet' AND p."entitaetId" = g."id" AND p."kundeId" IS NULL;
|
||
|
||
UPDATE "Protokoll" AS p SET "kundeId" = a."kundeId"
|
||
FROM "Abteilung" AS a
|
||
WHERE p."entitaet" = 'Abteilung' AND p."entitaetId" = a."id" AND p."kundeId" IS NULL;
|
||
|
||
UPDATE "Protokoll" AS p SET "kundeId" = q."kundeId"
|
||
FROM "Verzeichnisquelle" AS q
|
||
WHERE p."entitaet" = 'Verzeichnisquelle' AND p."entitaetId" = q."id" AND p."kundeId" IS NULL;
|
||
|
||
-- 3. Ein Eintrag **ueber** einen Kunden gehoert zu diesem Kunden.
|
||
UPDATE "Protokoll" AS p SET "kundeId" = k."id"
|
||
FROM "Kunde" AS k
|
||
WHERE p."entitaet" = 'Kunde' AND p."entitaetId" = k."id" AND p."kundeId" IS NULL;
|
||
|
||
-- 4. Eine Vorlage traegt nur im Modus DIENSTLEISTUNG einen Kunden; ist sie
|
||
-- kundenfrei, bleibt der Eintrag global. Genau richtig: sie gilt fuer alle.
|
||
UPDATE "Protokoll" AS p SET "kundeId" = v."kundeId"
|
||
FROM "Vorlage" AS v
|
||
WHERE p."entitaet" = 'Vorlage' AND p."entitaetId" = v."id" AND p."kundeId" IS NULL;
|
||
|
||
-- 5. Eine Version gehoert zum Kunden ihrer Vorlage.
|
||
UPDATE "Protokoll" AS p SET "kundeId" = v."kundeId"
|
||
FROM "VorlagenVersion" AS vv
|
||
JOIN "Vorlage" AS v ON v."id" = vv."vorlageId"
|
||
WHERE p."entitaet" = 'VorlagenVersion' AND p."entitaetId" = vv."id" AND p."kundeId" IS NULL;
|
||
|
||
-- Alles Uebrige bleibt leer: Einstellung, Benutzer, GeraetetypVorlage und
|
||
-- kundenfreie Vorlagen sind wirklich global. Eintraege zu **geloeschten** Zeilen
|
||
-- bleiben ebenfalls leer und sind damit nicht zuordenbar — die Abfrage zeigt sie
|
||
-- einem auf Kunden beschraenkten Benutzer deshalb **nicht** (fail closed, siehe
|
||
-- src/server/queries/protokoll.ts).
|