OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

223_directory_connections.sql

3 KB
-- ============================================================
-- 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));