Quelltext des aktuellen Standes
-- ============================================================
-- Verzeichnis: mehrere Anbindungen nebeneinander
-- ============================================================
-- Der Verzeichnisabgleich kannte bisher genau eine Quelle – Entra ID *oder*
-- LDAP –, hinterlegt in `config/runtime.php`. Wer mehrere Kunden oder Standorte
-- mit getrennten Verzeichnissen betreut, braucht mehrere Anbindungen mit je
-- eigenen Zugangsdaten und eigenem Zeitplan.
--
-- Der heikle Punkt ist die Abmeldung: Ein Lauf deaktivierte bisher jede Person
-- derselben `source`, die er nicht gesehen hat. Bei zwei LDAP-Anbindungen
-- nebeneinander würde damit jeder Lauf die Personen der jeweils anderen
-- stilllegen. Deshalb bekommt jede Person die Anbindung, aus der sie stammt,
-- und die Abmeldung grenzt darauf ein.
CREATE TABLE IF NOT EXISTS `directory_connections` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(120) NOT NULL COMMENT 'Erkennbarer Name, erscheint an der Person',
`type` ENUM('entra','ldap') NOT NULL,
`settings_json` TEXT NULL COMMENT 'Zugangsdaten und Zuordnung; Geheimnisse darin verschluesselt',
`enabled` TINYINT(1) NOT NULL DEFAULT 1,
`sort_order` INT NOT NULL DEFAULT 0,
`last_run_at` DATETIME NULL,
`last_status` ENUM('ok','error') NULL,
`last_message` VARCHAR(1000) NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY `uq_dirconn_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Herkunft an der Person. NULL bleibt für selbst gepflegte und per CSV
-- eingelesene Einträge – die stammen aus keiner Anbindung.
ALTER TABLE `directory_persons`
ADD COLUMN `connection_id` INT UNSIGNED NULL DEFAULT NULL
COMMENT 'Anbindung, aus der die Person stammt (NULL = manuell/CSV)'
AFTER `source`;
ALTER TABLE `directory_persons`
ADD INDEX `idx_person_connection` (`connection_id`);
-- Die bestehende Anbindung als erste Zeile übernehmen, damit vorhandene
-- Personen eine Herkunft bekommen. Die Zugangsdaten stehen in
-- `config/runtime.php` und lassen sich hier nicht lesen; sie werden beim ersten
-- Aufruf der Verzeichnis-Einstellungen nachgetragen.
INSERT IGNORE INTO `directory_connections` (`name`, `type`, `enabled`, `sort_order`)
SELECT 'Entra ID', 'entra', 1, 1 FROM DUAL
WHERE EXISTS (SELECT 1 FROM `directory_persons` WHERE `source` = 'entra');
INSERT IGNORE INTO `directory_connections` (`name`, `type`, `enabled`, `sort_order`)
SELECT 'Active Directory', 'ldap', 1, 2 FROM DUAL
WHERE EXISTS (SELECT 1 FROM `directory_persons` WHERE `source` = 'ldap');
-- Vorhandene Personen ihrer Anbindung zuordnen. Wirkt nur auf Zeilen ohne
-- Zuordnung; zu diesem Zeitpunkt gibt es je Art höchstens eine Anbindung.
UPDATE `directory_persons` p
JOIN `directory_connections` c ON c.`type` = p.`source`
SET p.`connection_id` = c.`id`
WHERE p.`connection_id` IS NULL
AND p.`source` IN ('entra', 'ldap');
-- Der Schlüssel folgt der Herkunft: Dieselbe Kennung darf in zwei Verzeichnissen
-- vorkommen, in einem aber nur einmal. Der frühere Schlüssel über `source`
-- allein ließe die zweite Anbindung derselben Art nicht zu.
ALTER TABLE `directory_persons` DROP INDEX `uq_person_external`;
ALTER TABLE `directory_persons`
ADD UNIQUE KEY `uq_person_connection` (`connection_id`, `external_id`(180));