From 0e7d75db276cf54e9c5e39ea58a94f8a96a3803d Mon Sep 17 00:00:00 2001
From: Antonio Sergio Rodrigues Figueiredo
Date: Wed, 9 Sep 2026 19:12:43 -0300
Subject: [PATCH] =?UTF-8?q?Passo=203=20v2.0.0:=20templates=20de=20amostra?=
=?UTF-8?q?=20+=20caminho=20de=20distribui=C3=A7=C3=A3o=20sem=20App=20Buil?=
=?UTF-8?q?der=20pro=20cliente?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Achado: DL_TECH_CMDB_V1/DL_TECH_VULNERABILIDADE_V2 vivem dentro de
sql/02_ampminsights_apex_app.sql via wwv_flow_imp_shared (API interna
de export/import do APEX) — não escrever isso à mão fora de um
import completo.
- templates/sample_DL_TECH_CMDB_V2.xlsx (27 col.) e
templates/sample_DL_TECH_VULNERABILIDADE_V3.xlsx (40 col.): arquivos
de amostra só-cabeçalho pra criar os perfis via upload no wizard do
APEX, em vez de preencher campo a campo.
- docs/13 reescrito: seção 5 usa o fluxo de upload de amostra; nova
seção 7 explica que só o desenvolvedor toca em App Builder uma vez,
e o cliente recebe um export completo novo (mesmo fluxo de release
já usado sempre) — nunca precisa saber o que é Data Load Definition.
Co-Authored-By: Claude Sonnet 5
---
TASKS.md | 14 +++--
docs/13-v2-perfis-carga.html | 57 +++++++++++++++---
templates/sample_DL_TECH_CMDB_V2.xlsx | Bin 0 -> 5156 bytes
.../sample_DL_TECH_VULNERABILIDADE_V3.xlsx | Bin 0 -> 5283 bytes
4 files changed, 57 insertions(+), 14 deletions(-)
create mode 100644 templates/sample_DL_TECH_CMDB_V2.xlsx
create mode 100644 templates/sample_DL_TECH_VULNERABILIDADE_V3.xlsx
diff --git a/TASKS.md b/TASKS.md
index 5f1d0dc..4814676 100644
--- a/TASKS.md
+++ b/TASKS.md
@@ -43,10 +43,16 @@ teste — a menos que você peça explicitamente o contrário.
(bloco grande) foi pulado na primeira passada — o checkpoint de compilação deu `VALID`
porque a view *antiga* (46 colunas) já era válida antes. Resolvido rodando o bloco
explicitamente; segunda checagem confirmou as 81 colunas.
-- [ ] **Mapeamento pronto e confirmado contra export real** (ver
- [docs/13-v2-perfis-carga.html](docs/13-v2-perfis-carga.html)) — falta só criar os dois
- perfis de fato no App Builder (não é scriptável, precisa ser feito na UI). `RAW_JSON`
- deliberadamente fora do escopo deste item — depende do item de staging abaixo.
+- [ ] **Mapeamento pronto + templates de amostra prontos** (ver
+ [docs/13-v2-perfis-carga.html](docs/13-v2-perfis-carga.html) e `templates/`) — falta criar
+ os dois perfis no App Builder (uma vez, seu acesso, não do cliente — upload dos templates de
+ amostra, não preenchimento campo a campo) e depois gerar um export completo novo da
+ Application 100 (captura os perfis automaticamente, com IDs corretos). O cliente só importa
+ esse export, nunca toca em Data Load Definitions — mesmo fluxo de sempre. **Achado
+ importante:** essas definições vivem dentro de `sql/02_ampminsights_apex_app.sql` via API
+ interna do APEX (`wwv_flow_imp_shared`) — não escrever isso à mão fora de um import
+ completo, risco de corromper os Shared Components. `RAW_JSON` deliberadamente fora do
+ escopo deste item — depende do item de staging abaixo.
- [ ] Pipeline de staging: bucket → `TB_26AI_TECH_V2_STG` via `DBMS_CLOUD.COPY_DATA` (tabela nova,
não mexe nas existentes)
- [ ] `MERGE` com histórico (`LOAD_BATCH_ID`, `TB_26AI_TECH_V2_HIST` — tabela nova), honrando o
diff --git a/docs/13-v2-perfis-carga.html b/docs/13-v2-perfis-carga.html
index 4a1a27e..2c476e8 100644
--- a/docs/13-v2-perfis-carga.html
+++ b/docs/13-v2-perfis-carga.html
@@ -113,17 +113,39 @@ coluna, e um `JSON_OBJECT(*)` sobre o staging resolve isso corretamente.
-5. Como criar os perfis no App Builder
-Não é scriptável de forma confiável para esta aplicação (ver decisão registrada no
-capítulo 8/histórico do projeto sobre export de página) —
-precisa ser feito manualmente no App Builder:
+5. Como criar os perfis — e por que não é um script SQL
+
+
Por que isto não vira um .sql como os Passos 1 e 2
+
As definições de carga (DL_TECH_CMDB_V1 e as duas de vulnerabilidades) já existem
+ hoje dentro de sql/02_ampminsights_apex_app.sql, criadas via
+ wwv_flow_imp_shared.create_data_profile/.create_data_profile_col/
+ .create_load_table — a API interna que o próprio export/import do APEX usa. Escrever
+ essas chamadas à mão, fora do contexto de um import completo (com os IDs que só o APEX gera
+ corretamente), arrisca corromper os Shared Components da Application 100. Por isso este passo é
+ feito uma vez no App Builder e depois capturado automaticamente num novo export
+ completo (seção 7) — o cliente nunca toca em Data Load Definitions manualmente, só importa esse
+ arquivo, exatamente como já faz hoje em cada release.
+
+
+Boa notícia: não precisa preencher campo a campo. O jeito mais rápido é criar o perfil do zero
+apontando pra um arquivo de amostra (só cabeçalho, sem dados) com todas as colunas certas — o APEX
+detecta as colunas automaticamente a partir do cabeçalho. Já preparei os dois arquivos:
+
+
+| Arquivo de amostra (no repositório) | Colunas | Perfil a criar |
+templates/sample_DL_TECH_CMDB_V2.xlsx | 27 (16 originais + 11 novas — sem RAW_JSON) | DL_TECH_CMDB_V2 |
+templates/sample_DL_TECH_VULNERABILIDADE_V3.xlsx | 40 (18 originais + 22 novas — sem RAW_JSON) | DL_TECH_VULNERABILIDADE_V3 |
+
+
+
- - App Builder → Application 100 → Shared Components → Data Load Definitions.
- - Selecione
DL_TECH_CMDB_V1 (ou DL_TECH_VULNERABILIDADE_V2) e use Copy (não edite o original) — renomeie a cópia para DL_TECH_CMDB_V2 (ou DL_TECH_VULNERABILIDADE_V3).
- - Na cópia, adicione os campos novos da tabela da seção 3 (ou 4) — cada campo novo mapeado para a coluna de destino correspondente.
- - Para os campos flag (
ATTESTED_FLAG, CISA_KEV_FLAG, EXPLOITED_BY_MALWARE_FLAG, EXPLOITED_BY_NESSUS_FLAG): configure a transformação de valor (Value Map / Column Transformation) Verdadeiro(a)/true → 1, Falso(a)/false → 0.
- - Para
U_FIM_DO_SUPORTE: configure a máscara de data como DD-MM-YYYY.
- - Salve e teste com uma planilha pequena (5-10 linhas de ativos
AM...) antes de rodar a carga completa.
+ - Baixe os dois arquivos de
templates/ neste repositório.
+ - App Builder → Application 100 → Shared Components → Data Load Definitions → Create.
+ - Na tela de criação, escolha carregar a partir de um arquivo e faça upload do
sample_DL_TECH_CMDB_V2.xlsx (ou o de vulnerabilidades) — o APEX lê o cabeçalho e monta o Data Profile com as 27 (ou 40) colunas automaticamente.
+ - Name:
DL_TECH_CMDB_V2 (ou DL_TECH_VULNERABILIDADE_V3). Target Type: Table. Table Name: TB_26AI_TECH_CMDB (ou TB_26AI_TECH_V2). Loading Method: Append — mesma configuração do perfil original (ver aba "Data Load" da tela, igual à do DL_TECH_CMDB_V1).
+ - Em Edit Data Profile, confira o tipo de cada coluna nova contra a tabela da seção 3 (ou 4) — a maioria detecta como
VARCHAR2/texto por padrão, então ajuste manualmente: DEFINITION_CVSS3_BASE_SCORE, DEFINITION_EPSS_SCORE, PORT, TIME_TO_FIX, ATTESTATION_SCORE → NUMBER; LAST_FIXED, VULN_SLA_DATE, PATCH_PUBLISHED, VULNERABILITY_PUBLISHED → data/timestamp; U_FIM_DO_SUPORTE → data, máscara DD-MM-YYYY.
+ - Para os campos flag (
ATTESTED_FLAG, CISA_KEV_FLAG, EXPLOITED_BY_MALWARE_FLAG, EXPLOITED_BY_NESSUS_FLAG): configure a transformação de valor (Column Transformation) Verdadeiro(a)/true → 1, Falso(a)/false → 0 — mesma convenção já usada em SOX/COFRE/TENABLE/SIEM.
+ - Salve e teste com uma planilha pequena (5-10 linhas de ativos
AM..., com dado real nas colunas — não só o cabeçalho) antes de rodar a carga completa.
6. Como validar
@@ -143,6 +165,21 @@ FETCH FIRST 5 ROWS ONLY;
EXPLOITED_BY_MALWARE_FLAG como 1 ou 0 (nunca texto), os
perfis estão funcionando.
+7. Como isso chega ao cliente (sem ele tocar em App Builder)
+Depois dos perfis criados e testados (seções 5 e 6), a captura definitiva é um novo
+export completo da Application 100 (App Builder → Application 100 → ícone de
+exportar/download → SQL Script) — isso gera um 02_ampminsights_apex_app.sql novo, com
+os dois perfis novos já embutidos com os IDs corretos gerados pelo próprio APEX. Esse arquivo
+substitui o atual no próximo release (mesmo fluxo já usado em toda entrega anterior — zip →
+bucket → PAR, ver o processo de release do projeto). O cliente só importa esse arquivo via
+App Builder → Import — um wizard guiado, não precisa entender Data Load Definitions.
+
+
Você faz isso uma vez; o cliente nunca faz
+
As seções 5-6 (criar e testar os perfis) são trabalho seu, num ambiente com acesso ao App
+ Builder. O cliente recebe só o resultado — o export completo atualizado — e importa como já
+ importa qualquer outra versão da aplicação.
+
+
diff --git a/templates/sample_DL_TECH_CMDB_V2.xlsx b/templates/sample_DL_TECH_CMDB_V2.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..0fa2d6066826da69dbde5c7a3996dc28c5b54cfb
GIT binary patch
literal 5156
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
M@@vcg<)8un4{v7EO8@`>
literal 0
HcmV?d00001
diff --git a/templates/sample_DL_TECH_VULNERABILIDADE_V3.xlsx b/templates/sample_DL_TECH_VULNERABILIDADE_V3.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..06303a211a9c56e193e568420b0eb664abda9125
GIT binary patch
literal 5283
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