-- 192: бизнес-ключ gisogd_permits — идентификатор документа на портале (#2986). -- -- Было: UNIQUE (doc_group, doc_num). Ключ выбирался, чтобы склеивать ОДИН документ, -- пришедший из двух схем портала. Замер 20.08.2026 показал, что задача, ради которой -- он введён, почти отсутствует, а побочный эффект огромен: -- -- общих docNum между схемами (DocRS): 2 -- общих key между схемами (DocRS): 2 ← те же два -- -- группа документов различных key различных docNum схлопывается -- DocRS 6098 6096 4305 1793 -- DocRV 5419 5415 4969 450 -- DocIZ 548 547 393 155 -- -- Причина: docNum у ГИСОГД не уникален. Разрешение и изменения к нему носят ОДИН -- номер. Пример 66-06-06-2026: портал отдаёт два документа (key 1000130002719586 — -- само разрешение, key 1000130002752293 — изменения к нему), а UPSERT с -- предпочтением позднего date_reg оставлял только изменение. Самого разрешения в -- данных не оставалось. На проде так вытеснено 598 из 4320 строк РНС (13.8%). -- -- Стало: UNIQUE (source_key) — идентификатор документа на портале. Он разделяет -- разрешение и изменения (разные key) и по-прежнему склеивает настоящие межсхемные -- дубли (у них key ОБЩИЙ — те самые 7 записей по всем трём группам). -- -- Дедуп перед сменой ключа не нужен: на проде 20.08.2026 source_key уже уникален — -- 9182 различных на 9182 строки, NOT NULL. Констрейнт встаёт как есть. -- -- CHECK расширен значением 'IZ': группа DocIZ (изменения) есть на портале с самого -- начала, но в GROUP_CODE лоадера её не было, и 548 документов не грузились вовсе. BEGIN; SET LOCAL lock_timeout = '5s'; ALTER TABLE gisogd_permits DROP CONSTRAINT IF EXISTS gisogd_permits_doc_group_doc_num_key; ALTER TABLE gisogd_permits DROP CONSTRAINT IF EXISTS chk_gisogd_permits_doc_group; ALTER TABLE gisogd_permits ADD CONSTRAINT chk_gisogd_permits_doc_group CHECK (doc_group IN ('RS', 'RV', 'IZ')); ALTER TABLE gisogd_permits ADD CONSTRAINT uq_gisogd_permits_source_key UNIQUE (source_key); -- (doc_group, doc_num) перестаёт быть уникальным, но остаётся рабочим фильтром -- («все документы по номеру разрешения») — оставляем как обычный индекс. CREATE INDEX IF NOT EXISTS idx_gisogd_permits_group_num ON gisogd_permits (doc_group, doc_num); COMMENT ON CONSTRAINT uq_gisogd_permits_source_key ON gisogd_permits IS 'Бизнес-ключ = key документа на портале ГИСОГД-СО. docNum НЕ уникален: ' 'разрешение и изменения к нему носят один номер (#2986).'; COMMIT;