labfy-investigation/database/schema_v14.sql

46 lines
2 KiB
SQL

/******************************************************************************
* Schéma SQLite V14 — affectations contextuelles multiples des personnes.
*
* L'unicité porte sur (personne, rôle, preuve, provenance) : un même rôle
* peut donc être justifié par plusieurs preuves distinctes.
******************************************************************************/
CREATE TABLE person_role_assignments
(
id TEXT PRIMARY KEY CHECK (length(trim(id)) > 0),
entity_id TEXT NOT NULL,
role_code TEXT NOT NULL CHECK (length(trim(role_code)) > 0),
evidence_id TEXT,
provenance_kind TEXT NOT NULL CHECK (
provenance_kind IN ('manual', 'legacy_manual')
),
confidence INTEGER CHECK (
confidence IS NULL OR confidence BETWEEN 0 AND 100
),
notes TEXT,
created_at TEXT NOT NULL CHECK (length(created_at) = 20),
updated_at TEXT NOT NULL CHECK (length(updated_at) = 20),
FOREIGN KEY (entity_id) REFERENCES entites(id) ON DELETE CASCADE,
FOREIGN KEY (evidence_id) REFERENCES preuves(id) ON DELETE SET NULL
);
CREATE UNIQUE INDEX idx_person_role_assignments_semantic
ON person_role_assignments(
entity_id, role_code, COALESCE(evidence_id, ''), provenance_kind
);
CREATE INDEX idx_person_role_assignments_entity
ON person_role_assignments(entity_id);
CREATE INDEX idx_person_role_assignments_evidence
ON person_role_assignments(evidence_id);
/* Les codes historiques sont conservés littéralement : aucune équivalence
* approximative n'est appliquée pendant la migration. */
INSERT INTO person_role_assignments(
id, entity_id, role_code, evidence_id, provenance_kind,
confidence, notes, created_at, updated_at
)
SELECT
lower(hex(randomblob(4))) || '-' || lower(hex(randomblob(2))) || '-4' ||
substr(lower(hex(randomblob(2))),2) || '-a' ||
substr(lower(hex(randomblob(2))),2) || '-' || lower(hex(randomblob(6))),
entity_id, role, NULL, 'legacy_manual', NULL, NULL, updated_at, updated_at
FROM person_roles;