63 lines
3.2 KiB
SQL
63 lines
3.2 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.
|
||
-- ---------------------------------------------------------------------------
|
||
|
||
-- Vorgesetzter auch fuer von Hand angelegte Personen (#020).
|
||
--
|
||
-- Bisher lief die Auskunft allein ueber `vorgesetzterExterneId`, und die ist nur
|
||
-- innerhalb einer Verzeichnisquelle eindeutig: eine Person ohne Quelle konnte
|
||
-- keinen Vorgesetzten haben, {{vorgesetzter_sam}} blieb dort immer leer.
|
||
ALTER TABLE "Mitarbeiter"
|
||
ADD COLUMN "vorgesetzterId" TEXT;
|
||
|
||
CREATE INDEX "Mitarbeiter_vorgesetzterId_idx" ON "Mitarbeiter"("vorgesetzterId");
|
||
|
||
ALTER TABLE "Mitarbeiter"
|
||
ADD CONSTRAINT "Mitarbeiter_vorgesetzterId_fkey"
|
||
FOREIGN KEY ("vorgesetzterId") REFERENCES "Mitarbeiter" ("id")
|
||
ON DELETE RESTRICT ON UPDATE CASCADE;
|
||
|
||
-- Die Mandantengrenze, wie bei Lauf und Geraet: der Vorgesetzte gehoert zum
|
||
-- selben Kunden. MATCH SIMPLE ist richtig — ist die Spalte NULL, greift der
|
||
-- Fremdschluessel nicht, eine Person ohne Vorgesetzten bleibt also erlaubt.
|
||
ALTER TABLE "Mitarbeiter"
|
||
ADD CONSTRAINT "Mitarbeiter_vorgesetzter_gleicher_kunde"
|
||
FOREIGN KEY ("vorgesetzterId", "kundeId") REFERENCES "Mitarbeiter" ("id", "kundeId")
|
||
ON DELETE RESTRICT ON UPDATE CASCADE;
|
||
|
||
-- Niemand ist sein eigener Vorgesetzter. Das ist die kuerzeste Schleife und die
|
||
-- einzige, die sich ohne Rekursion abfangen laesst; laengere haelt der Dienst
|
||
-- auf (siehe mitarbeiter.ts, vorgesetztenSetzen).
|
||
ALTER TABLE "Mitarbeiter"
|
||
ADD CONSTRAINT "Mitarbeiter_vorgesetzter_nicht_selbst"
|
||
CHECK ("vorgesetzterId" IS NULL OR "vorgesetzterId" <> "id");
|
||
|
||
-- Nachfuehrung fuer bestehende Installationen.
|
||
--
|
||
-- Ohne sie waere `{{vorgesetzter_sam}}` nach dieser Migration bei **jeder**
|
||
-- Person aus dem Verzeichnis leer, bis der naechste Abgleich laeuft -- und zwar
|
||
-- still: die Auskunft lief bisher allein ueber `vorgesetzterExterneId`, der neue
|
||
-- Leseweg nimmt nur `vorgesetzterId`. Dieselbe Falle wie beim Seed-Schluessel
|
||
-- in #021: ein Umstieg, der die vorhandenen Daten nicht mitnimmt.
|
||
--
|
||
-- Die Zuordnung laeuft ueber die `externeId` **derselben** Quelle, genau wie der
|
||
-- alte Leseweg: die Kennung ist nur dort eindeutig.
|
||
UPDATE "Mitarbeiter" AS person
|
||
SET "vorgesetzterId" = chef."id"
|
||
FROM "Mitarbeiter" AS chef
|
||
WHERE person."vorgesetzterExterneId" IS NOT NULL
|
||
AND person."quelleId" IS NOT NULL
|
||
AND chef."quelleId" = person."quelleId"
|
||
AND chef."externeId" = person."vorgesetzterExterneId"
|
||
-- Die Mandantengrenze gilt auch hier; stand je eine Zuordnung ueber Kunden
|
||
-- hinweg in den Daten, bliebe sie leer statt den Fremdschluessel zu brechen.
|
||
AND chef."kundeId" = person."kundeId"
|
||
AND chef."id" <> person."id";
|