-- Mehrere Spieler können sich einen CC teilen. CREATE TABLE IF NOT EXISTS "CharacterMember" ( "id" SERIAL NOT NULL, "characterId" INTEGER NOT NULL, "playerId" INTEGER NOT NULL, "joinedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "leftAt" TIMESTAMP(3), "paidWith" "CreditKind", "note" TEXT, "createdById" INTEGER, CONSTRAINT "CharacterMember_pkey" PRIMARY KEY ("id") ); CREATE UNIQUE INDEX IF NOT EXISTS "CharacterMember_characterId_playerId_key" ON "CharacterMember"("characterId", "playerId"); CREATE INDEX IF NOT EXISTS "CharacterMember_playerId_idx" ON "CharacterMember"("playerId"); CREATE INDEX IF NOT EXISTS "CharacterMember_characterId_idx" ON "CharacterMember"("characterId"); DO $$ BEGIN ALTER TABLE "CharacterMember" ADD CONSTRAINT "CharacterMember_characterId_fkey" FOREIGN KEY ("characterId") REFERENCES "Character"("id") ON DELETE CASCADE ON UPDATE CASCADE; EXCEPTION WHEN duplicate_object THEN NULL; END $$; DO $$ BEGIN ALTER TABLE "CharacterMember" ADD CONSTRAINT "CharacterMember_playerId_fkey" FOREIGN KEY ("playerId") REFERENCES "Player"("id") ON DELETE CASCADE ON UPDATE CASCADE; EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- Bestehende CCs bekommen ihren Ersteller als erstes Mitglied. Ohne das -- taucht nach dem Update kein CC mehr beim Spieler auf, da die Zugehörigkeit -- ab jetzt über diese Tabelle läuft. INSERT INTO "CharacterMember" ("characterId", "playerId", "joinedAt", "createdById") SELECT c."id", c."playerId", c."createdAt", c."createdById" FROM "Character" c WHERE NOT EXISTS ( SELECT 1 FROM "CharacterMember" m WHERE m."characterId" = c."id" AND m."playerId" = c."playerId" );