From ae5bd31dbde094196d558c18215c7c9593a160e4 Mon Sep 17 00:00:00 2001 From: Dmitry Dementev Date: Tue, 25 Aug 2026 17:39:41 -0400 Subject: [PATCH] =?UTF-8?q?docs(dds):=20=D1=83=D1=82=D0=BE=D1=87=D0=BD?= =?UTF-8?q?=D1=91=D0=BD=20=D0=BF=D1=83=D0=B1=D0=BB=D0=B8=D1=87=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=B0=D0=BA=D1=82=20?= =?UTF-8?q?=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: - Закрепить реалистичную границу доступа BI и убрать двусмысленность для неизвестных кодов. - Что: - Пояснены доступ к ODS, пояс счётчика и порядок DDL. - Проверка равенства строк отделена от размера конкретной загрузки. - Проверка: - `git diff --check`. - `make config-test` не стартовал: Snap требует работающий `snapd.apparmor`. --- docs/adr/0007-clickhouse-access.md | 14 ++++++++------ docs/architecture/dds/event.md | 14 +++++++++----- docs/architecture/storage.md | 4 ++-- sql/ddl/50-dds-views.sql | 3 +++ 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/docs/adr/0007-clickhouse-access.md b/docs/adr/0007-clickhouse-access.md index 61f9e32..1068a82 100644 --- a/docs/adr/0007-clickhouse-access.md +++ b/docs/adr/0007-clickhouse-access.md @@ -53,11 +53,13 @@ Стенд учит не администрированию доступа, а чтению отказа в правах: человек должен узнать в бою картину, которую видел здесь, и понимать, чего просить. Отсюда критерий отбора — модель должна читаться из текста ошибки, а не из -описания. Поэтому пользователей мало, имена у них говорящие, а `bi` отделён от -STG и от записи. Один пользователь может сверить всю цепочку DM → DDS → ODS, -не получая доступа к сырью и изменению данных. Справочники видны всем читателям -и никому на запись: зона входит в хранилище сбоку, и её содержимым владеет файл -репозитория, а не слой. +описания. Поэтому пользователей мало, имена у них говорящие. В бою BI обычно +читает витрины и модельный слой. ODS ему могут открыть для расследования или +сверки. Стенд оставляет этот доступ постоянным, но сохраняет две крупные +границы: `bi` отделён от STG и от записи. Один пользователь может сверить всю +цепочку DM → DDS → ODS, не получая доступа к сырью и изменению данных. +Справочники видны всем читателям и никому на запись: зона входит в хранилище +сбоку, и её содержимым владеет файл репозитория, а не слой. Ограничить `bi` одними `_v` поверх `Distributed` можно только отдельным маршрутом, учётной записью или копией данных. Эта механика не даёт нового урока. @@ -200,7 +202,7 @@ ClickHouse через MCP Context7 (#114). Расширение `bi_reader` проверено на живом стенде 25 августа 2026 года (#150): - `SHOW GRANTS FOR bi_reader` содержит `SELECT` на ODS, DDS и DM; -- `bi` прочитал одинаковые 401185 строк из `ods.event_v` и `dds.event_v`; +- `bi` прочитал одинаковое число строк из `ods.event_v` и `dds.event_v`; - чтение `stg.hits_raw_rep` завершилось ошибкой `ACCESS_DENIED`; - представление над `Distributed` с `SQL SECURITY DEFINER` на удалённой ноде сохранило исходного пользователя `bi`. Причина и отклонённые варианты diff --git a/docs/architecture/dds/event.md b/docs/architecture/dds/event.md index 4c4cf7a..a77f8a5 100644 --- a/docs/architecture/dds/event.md +++ b/docs/architecture/dds/event.md @@ -52,11 +52,15 @@ стенда несёт число — принятое отступление: спека, раздел 1.1), контракт возвращает ему боевой вид. -Другие коды остаются кодами. `goals_reached` — справочника целей на стенде -нет, id и есть язык. Регионы в расшифровке не нуждаются: выгрузка несёт -названия рядом с id (`region_city`, `region_country`), словарь ничего бы не -раскрыл. Идея дать менти собрать справочник регионов самому ушла в лабы — -issue #143. +Значения `device_category` 1–4 получают имена, остальные сохраняются +десятичной строкой. Новый код остаётся видимым, пока у него не появится имя в +договоре. + +Остальные кодированные атрибуты не расшифровываются. Для `goals_reached` +справочника целей на стенде нет, id и есть язык. Регионы в расшифровке не +нуждаются: выгрузка несёт названия рядом с id (`region_city`, +`region_country`), словарь ничего бы не раскрыл. Идея дать менти собрать +справочник регионов самому ушла в лабы — issue #143. ## Что скрыто diff --git a/docs/architecture/storage.md b/docs/architecture/storage.md index e3d9bc4..8b64a17 100644 --- a/docs/architecture/storage.md +++ b/docs/architecture/storage.md @@ -497,8 +497,8 @@ SQL-файлы исполняет штатный `SQLExecuteQueryOperator`. Пр ### DDL -Файлы лежат в `sql/ddl/` и применяются по порядку имён: зависимости создаются -раньше потребителей. +Файлы лежат в `sql/ddl/` и применяются по порядку имён: источник и цель +создаются до представления или матвью, которые их используют. | Файл | Что в нём | |---|---| diff --git a/sql/ddl/50-dds-views.sql b/sql/ddl/50-dds-views.sql index 4033c6d..d3136cd 100644 --- a/sql/ddl/50-dds-views.sql +++ b/sql/ddl/50-dds-views.sql @@ -9,6 +9,9 @@ -- -- event_date берётся напрямую из EventDate. Пересчёт из event_time помешал бы -- первичному индексу отбирать день до чтения. +-- +-- Europe/Samara задаёт пояс счётчика модельного мира. DDS отдаёт event_time +-- в этой временной линзе. CREATE VIEW IF NOT EXISTS dds.event_v ON CLUSTER clickstream_cluster AS SELECT -- 2.54.0