-- --------------------------------------------------------------------------- -- 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";