45 lines
1.8 KiB
PL/PgSQL
45 lines
1.8 KiB
PL/PgSQL
-- Migration 2026-04-17 : lier users ↔ contacts ↔ LDAP proprement (FK + index)
|
|
--
|
|
-- Avant : users.itop_person_id (int) pointe vers iTop (pas vers contacts.id)
|
|
-- -> lien indirect fragile entre users et contacts via itop_id
|
|
--
|
|
-- Apres : users.contact_id (FK propre vers contacts.id)
|
|
-- contacts.ldap_dn (trace la source AD quand le contact vient d'un import LDAP)
|
|
-- Les 3 tables sont jointes directement : users.contact_id = contacts.id
|
|
-- La source LDAP est identifiee par contacts.ldap_dn IS NOT NULL et/ou
|
|
-- users.auth_type = 'ldap'.
|
|
|
|
BEGIN;
|
|
|
|
-- 1. users.contact_id : FK vers contacts.id
|
|
ALTER TABLE users ADD COLUMN IF NOT EXISTS contact_id INTEGER;
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM pg_constraint WHERE conname = 'users_contact_id_fkey'
|
|
) THEN
|
|
ALTER TABLE users ADD CONSTRAINT users_contact_id_fkey
|
|
FOREIGN KEY (contact_id) REFERENCES contacts(id) ON DELETE SET NULL;
|
|
END IF;
|
|
END$$;
|
|
CREATE INDEX IF NOT EXISTS idx_users_contact_id ON users (contact_id);
|
|
|
|
-- 2. contacts.ldap_dn : trace provenance AD
|
|
ALTER TABLE contacts ADD COLUMN IF NOT EXISTS ldap_dn varchar(500);
|
|
CREATE INDEX IF NOT EXISTS idx_contacts_ldap_dn ON contacts (ldap_dn)
|
|
WHERE ldap_dn IS NOT NULL;
|
|
|
|
-- 3. Backfill users.contact_id depuis users.email <-> contacts.email
|
|
-- (pour les users deja presents dont l'email matche un contact)
|
|
UPDATE users u
|
|
SET contact_id = c.id
|
|
FROM contacts c
|
|
WHERE u.contact_id IS NULL
|
|
AND u.email IS NOT NULL
|
|
AND lower(u.email) = lower(c.email);
|
|
|
|
COMMENT ON COLUMN users.contact_id IS 'FK vers contacts.id — lien direct user ↔ contact (le meme email)';
|
|
COMMENT ON COLUMN contacts.ldap_dn IS 'DN AD d''ou provient ce contact (import LDAP). NULL si import iTop ou saisie manuelle';
|
|
|
|
COMMIT;
|