14 Commits

Author SHA1 Message Date
71a6c2ac9b Passo 3 v2.0.0: DL_TECH_CMDB_V2 (27 col.) e DL_TECH_VULNERABILIDADE_V3 (40 col.) criados
Confirmado pelo usuário: os dois perfis novos existem com todas as
colunas certas. 'No data found' na query de validação é esperado —
ainda não houve upload real através deles. Restam: testar carga real
e gerar export completo novo da Application 100.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-09 20:41:40 -03:00
26ebdd15b2 docs/13: roteiro completo confirmado (Add Column) + investigação APEX_DATA_LOADING
Consolida tudo confirmado tela a tela nesta sessão:
- Formulário 'Data Profile Column' completo (Column Type, Name, Data
  Type, Length condicional, Selector Type/Selector, Value
  Transformation).
- Tabela final das 11 colunas do CMDB com Data Type/Length exatos, e
  das 22 de vulnerabilidades (incluindo a máscara de timestamp
  confirmada contra FIRST_OBSERVED/LAST_SEEN/RESURFACED_DATE já
  existentes).
- Correção: ATTESTED_FLAG (e os 3 flags de vulnerabilidade) não usam
  Value Transformation - conversão true/false -> 1/0 é manual no
  Excel, mesma regra já documentada no capítulo 10 pra COFRE/SOX/etc.
- Nova nota: investigação do pacote público APEX_DATA_LOADING
  (owner real APEX_240200.WWV_FLOW_DATA_LOADING_API) - só tem
  GET_FILE_PROFILE/LOAD_DATA (executar carga), não serve pra
  criar/editar colunas de um Data Profile. Não reabrir essa via.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-09 20:19:31 -03:00
3604f2f9e0 docs/13: confirma passos 7-10 (cópia, pegadinha do To Name, rename/delete)
Confirmado tela a tela pelo usuário: o campo 'To Name' na tela 'As
Copy' é ignorado (as 3 cópias nascem com nome padrão 'Copy of X',
mesmo a que estava marcada No). Documenta a correção: identificar cada
cópia pelo Target Name na visão em tabela, apagar a indesejada
(Copy of DL_TECH_VULNERABILIDADES, aponta pra TB_26AI_TECH legada,
não TB_26AI_TECH_V2), renomear as outras duas via campo Name/Static ID
+ Apply Changes. Lista final de 5 definições confirmada.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-09 19:32:37 -03:00
8ef36eb1cc Corrige docs/13: roteiro real (Copy), não upload de amostra (inventado)
Confirmado contra prints reais do App Builder: o wizard de criação só
oferece 'From scratch' ou 'As copy of an existing Data Load
Definition' — não existe tela de upload de amostra para autodetectar
colunas, como eu tinha documentado antes sem verificar. Corrige o
roteiro pra seguir exatamente as telas reais (Method -> Application ->
As Copy, renomeando DL_TECH_CMDB_V1 -> DL_TECH_CMDB_V2 e
DL_TECH_VULNERABILIDADE_V2 -> DL_TECH_VULNERABILIDADE_V3 na mesma
tela). Marca explicitamente onde o roteiro ainda não está confirmado
(tela pós-'Copy Data Load Definition') em vez de continuar
adivinhando. Reposiciona os templates/*.xlsx: servem para testar a
carga depois de pronta, não para criar o perfil.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-09 19:23:17 -03:00
0e7d75db27 Passo 3 v2.0.0: templates de amostra + caminho de distribuição sem App Builder pro cliente
- 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 <noreply@anthropic.com>
2026-09-09 19:12:43 -03:00
df0d775540 Passo 3 v2.0.0: mapeamento de perfis de carga confirmado contra export real
- docs/13-v2-perfis-carga.html: mapeamento completo coluna a coluna pra
  DL_TECH_CMDB_V2 (12 campos) e DL_TECH_VULNERABILIDADE_V3 (23 campos),
  conferido campo a campo contra um export real (Artefatos/ da
  V1_Cliente, só linhas AM...) em vez de suposição.
- Correções encontradas na conferência: definition.patch_published e
  definition.vulnerability_published têm prefixo 'definition.' no
  export real (não estava assim documentado antes); flags booleanos
  confirmados como texto 'true'/'false' (Tenable) e
  'Verdadeiro(a)'/'Falso(a)' (ServiceNow, mesma convenção já usada em
  SOX/COFRE/TENABLE/SIEM no capítulo 10).
- RAW_JSON deliberadamente fora do escopo deste passo — Data Load só
  carrega colunas mapeadas, não a linha completa; população real de
  RAW_JSON depende da tabela de staging (próximo item do TASKS.md).
- Nav (13 páginas) e pillnav do capítulo 12 atualizados.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-09 17:30:42 -03:00
530c07cd94 Passo 2 v2.0.0 validado: V_26AI_TECH (81 colunas) e PRC_26AI_TECH VALID
Checkpoint completo confirmado pelo usuário: as 81 colunas da view na
ordem certa, ambos objetos VALID, teste manual retornou linhas (NULL
nos campos novos, esperado sem carga ainda). Registra a pegadinha do
CREATE OR REPLACE VIEW sendo pulado ao rodar statement a statement.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-09 17:12:49 -03:00
f8595435e0 Passo 1 v2.0.0 validado: TB_26AI_TECH_V2 (23) e TB_26AI_TECH_CMDB (12) OK
Checkpoint rodado pelo usuário no ambiente AMPMINSIGHTS confirmou
STATUS = 'OK' nas duas tabelas. TASKS.md marca o item como concluído;
docs/11 troca o aviso de 'em validação' por confirmação.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-09 16:32:18 -03:00
dd40d0a42a Corrige docs/11: query de validação abreviada causava ORA-00903
O capítulo 11 mostrava a query de checkpoint com placeholders '/* ... */'
só ilustrativos, mas com botão 'Copiar' ao lado — usuário copiou e
rodou direto, e 'FROM (/* ver script completo */)' virou subquery
vazia (ORA-00903 invalid table name). Substitui pela query real e
completa, idêntica à de sql/03_v2_ddl_schema_evolution.sql. Os ALTER
TABLE em si rodaram OK, não foi um problema do DDL.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-09 16:30:36 -03:00
e519811f80 Adiciona ROADMAP_AGENTICO.md: análise para v3.0.0 (sistema agêntico)
- Diagnóstico do padrão atual (PRC_26AI_TECH single-shot) vs. padrão de
  agentes/tasks/tools/teams de um case bancário de referência
  (DBMS_CLOUD_AI_AGENT, Property Graph, Blockchain Table, VPD, Knowledge
  Graph chain).
- Mapeamento de analogia Persona/Agente/Task/Tools aplicado ao domínio de
  vulnerability management do AMPM.
- Achado prático destacado: padrão fn_analise_carteira_json (separar
  cálculo determinístico de narrativa da IA) — não depende de agentes,
  pode entrar como v2.1.0.
- Achado de acelerador: app pronto da Oracle 'Ask Oracle Select AI
  Chatbot' já expõe builder visual de agentes sobre o mesmo
  DBMS_CLOUD_AI_AGENT.
- Sequenciamento: v3.0.0 depende do v2.0.0 estar em produção primeiro.
  Nenhuma mudança no trabalho em andamento do v2.0.0.
- README.md e TASKS.md referenciam o novo doc.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-09 16:19:20 -03:00
561f26608e Docs v2.0.0: capítulos 11 e 12 (evolução de schema + view/procedure)
- docs/11-v2-evolucao-schema.html: documenta o Passo 1
  (sql/03_v2_ddl_schema_evolution.sql) — o quê, por quê, script resumido,
  como rodar, validação, rollback. Callout deixa explícito que ainda está
  em validação, não é procedimento definitivo.
- docs/12-v2-view-procedure.html: documenta o Passo 2
  (sql/04_v2_view_procedure_update.sql), mesmo formato, com dependência
  explícita do capítulo 11.
- Nav lateral (sidebar) atualizada nas 12 páginas do doc set para incluir
  os capítulos novos; pillnav do capítulo 10 ganhou link 'next' para o 11.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-09 15:01:48 -03:00
e25fd93bf8 Passo 2 v2.0.0: V_26AI_TECH + prc_26ai_tech expõem campos novos ao LLM
- sql/04_v2_view_procedure_update.sql: CREATE OR REPLACE VIEW V_26AI_TECH
  (+35 colunas: 23 de TB_26AI_TECH_V2 + 12 de TB_26AI_TECH_CMDB, RAW_JSON de
  cada tabela virou RAW_JSON_TENABLE/RAW_JSON_CMDB pra não colidir nome) e
  CREATE OR REPLACE PROCEDURE prc_26ai_tech (só o json_object do ramo VUL
  ganhou os campos novos; ramo SYS, prompt, vetorização, log e exceção
  ficam byte-a-byte idênticos ao script original).
- Depende do Passo 1 (03_v2_ddl_schema_evolution.sql) já ter rodado no
  mesmo ambiente.
- TASKS.md atualizado.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-09 14:55:17 -03:00
d37140b36b Passo 1 v2.0.0: DDL aditivo (ALTER TABLE + RAW_JSON), pronto p/ validação do usuário
- sql/03_v2_ddl_schema_evolution.sql: 23 colunas novas em TB_26AI_TECH_V2 +
  12 em TB_26AI_TECH_CMDB (Tier-1 de ANALISE_DADOS_v1.4.0_gap_schema.md
  seções 2.2/3.1), + RAW_JSON CLOB catch-all em cada tabela. 100% ALTER ADD,
  nenhum DROP, checkpoint de validação embutido.
- TASKS.md: registra o fluxo de trabalho (usuário roda/valida cada passo,
  eu documento) e marca este item como pronto/aguardando execução.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-09 14:42:01 -03:00
b54fcb4f38 Adiciona README.md: mapa do repositório (branches, tags, por onde começar)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-09 11:38:05 -03:00
20 changed files with 1724 additions and 6 deletions

36
README.md Normal file
View File

@@ -0,0 +1,36 @@
# ampmInsights
Oracle APEX + AI Vector Search (Select AI / ONNX embeddings) para gestão de vulnerabilidades e
CMDB do cliente AM/PM (grupo Ultrapar). Repositório central do projeto — antes disso, o trabalho
vivia em pastas locais soltas, sem remoto.
## Estrutura deste repositório
| Branch | O que é | Status |
|---|---|---|
| `main` | **V2** — segunda geração, trabalho ativo. Fork de V1 (09/09/2026) + overhaul de schema (v2.0.0) para expor CVE/pacote/remediação ao AI Insight. | 🚧 Em desenvolvimento, nada executado em banco ainda |
| `v1-cliente-frozen` (ver branch `src/branch/v1-cliente-frozen`) | **V1** — pacote cliente-facing, tags `v1.0.0`→`v1.3.0`. É exatamente o que está implementado e validado no ambiente do cliente hoje. | 🔒 Congelado, só leitura — não editar |
Tags `v1.0.0`–`v1.3.0` (na branch `v1-cliente-frozen`) e `v2.0.0-fork-baseline` (nesta branch)
preservam o histórico completo de releases.
## Por onde começar
- **Board de tarefas / próximos passos:** [TASKS.md](TASKS.md)
- **Histórico de versões da V2:** [CHANGELOG.md](CHANGELOG.md)
- **Roadmap agêntico (v3.0.0, ainda não iniciado):** [ROADMAP_AGENTICO.md](ROADMAP_AGENTICO.md)
- **Mapeamento de gap de schema (v1.4.0→v2.0.0):** `../ANALISE_DADOS_v1.4.0_gap_schema.md` (fora
deste repo por enquanto — planejamento interno, ainda não movido para cá)
- **Documentação passo a passo (instalação, arquitetura, operação):** [docs/](docs/) —
`docs/index.html`, publicado também como página única navegável (ver TASKS.md para o link
quando existir)
- **Regra de ouro do release:** v2.0.0 chega ao ambiente do cliente por evolução **aditiva**
(`ALTER TABLE`, tabelas novas, `MERGE`) — nunca `DROP`+recriação.
## O que NÃO fazer
- Não editar a branch `v1-cliente-frozen` — ela precisa continuar espelhando exatamente o que
está validado e rodando no cliente.
- Não commitar segredos: tokens, senhas de banco/wallet, exports brutos de CMDB/Vulnerabilidades
(contêm dados reais de outras empresas do grupo Ultrapar — Ipiranga, Ultrapar, Iconic). Ver
`.gitignore` e a seção de segurança em `docs/07-seguranca-boas-praticas.html`.

119
ROADMAP_AGENTICO.md Normal file
View File

@@ -0,0 +1,119 @@
# Roadmap — ampmInsights Agêntico (v3.0.0, ainda não iniciado)
Análise feita em 2026-09-09 a partir de um material de referência compartilhado pelo usuário (case
bancário "DEMO_CONVERGENTE" — Oracle AI Database 26ai + APEX, com `DBMS_CLOUD_AI_AGENT`, Property
Graph, Blockchain Table, VPD e Knowledge Graph chain) e de dois repositórios `oracle-devrel`. Este
documento **não implementa nada** — é a base para decidir se/quando o AMPM evolui de um Q&A
semântico de tiro único para um sistema agêntico. Não altera nem depende de nenhuma tarefa aberta
do v2.0.0 (`TASKS.md`), exceto onde indicado explicitamente na seção 4.
## 1. Diagnóstico: onde o ampmInsights está hoje
`PRC_26AI_TECH` é **single-shot**: monta um JSON com a linha de `V_26AI_TECH` e manda para **um
único prompt genérico**, que responde de uma vez os 4 blocos (análise, diagnóstico,
recomendações, plano de ação). Não há divisão de trabalho — é um "analista generalista"
respondendo tudo, sempre.
## 2. O padrão do case bancário (Agent Framework)
O case usa `DBMS_CLOUD_AI_AGENT` para construir uma hierarquia:
```
TEAM (supervisor_agent = ROTEADOR)
├─ AGENT "ANALISE_CENARIO_ECONOMICO" → TASK → TOOL (function)
├─ AGENT "OBTER_DADOS_DE_CLIENTE" → TASK → TOOL (SQL profile)
└─ AGENT "OBTER_PERFIL_INVESTIDOR" → TASK → TOOL (function)
```
O agente roteador (`supervisor: true`) **classifica a pergunta e delega para um único
especialista** — nunca responde ele mesmo, nunca deixa dois agentes tentarem a mesma pergunta.
Cada especialista só vê o profile/tools do seu domínio (ex.: `OBTER_DADOS_DE_CLIENTE` não consegue
interpretar perfil de risco, mesmo que o dado estivesse acessível).
## 3. Mapeamento de analogia para o AMPM
Do slide original (Persona → Agente/Competências → Task → Tools), aplicado ao domínio de gestão
de vulnerabilidades:
| Slide (genérico) | Case bancário | AMPM (proposta) |
|---|---|---|
| Persona/Cargo | Gerente de Investimento | Gestor de Vulnerabilidades / CISO Ops |
| Agente (competências) | Cenário econômico / Dados cliente / Perfil investidor | **Triagem CVE/Threat Intel**, **Contexto de Ativo (CMDB)**, **Remediação/Patch Plan**, **Relatório Executivo** |
| Task | "responder pergunta sobre X" | "priorizar achado", "explicar exposição do ativo", "montar plano 30-60-90" |
| Tools | `CONSULTAR_DADOS_CLIENTE`, `CONSULTAR_PERFIL_INVESTIDOR` | `CONSULTAR_CVE_CRITICO` (CVSS/EPSS/CISA KEV), `CONSULTAR_CONTEXTO_ATIVO` (CMDB: criticidade, responsável, SO), `CONSULTAR_HISTORICO_REMEDIACAO` |
Um roteador (`ROTEADOR_VULNERABILIDADES`, `supervisor: true`) classificaria a pergunta/achado e
delegaria a **um** especialista — resolvendo o problema real de hoje, onde um único prompt tenta
simultaneamente avaliar severidade técnica, contexto de negócio do ativo e plano de ação.
**Pré-requisito de dados:** os tools de triagem/CMDB só funcionam depois que as colunas Tier-1
do v2.0.0 (`DEFINITION_CVE`, `DEFINITION_CVSS3_BASE_SCORE`, `DEFINITION_EPSS_SCORE`,
`CISA_KEV_FLAG`, etc. — ver `sql/03_v2_ddl_schema_evolution.sql`) estiverem carregadas com dado
real. **v3.0.0 depende do v2.0.0 estar em produção, não o contrário.**
## 4. O achado mais diretamente portável — não depende de agentes
`fn_analise_carteira_json` → `fn_analise_carteira_com_ia_json` é o padrão de maior valor prático
do material, e é **ortogonal** à arquitetura de agentes:
1. Uma função PL/SQL determinística calcula em SQL puro (sem LLM) os números que importam —
no case: concentração por emissor, por grau de risco, por prazo. No AMPM seria: % de achados na
lista CISA KEV, distribuição por faixa de CVSS/EPSS, aging vs. SLA de correção, concentração por
sistema/criticidade — usando exatamente os campos novos do v2.0.0.
2. Uma segunda função monta um prompt que **só interpreta esse JSON já calculado** (não pede pro
LLM "adivinhar" a matemática) e devolve uma narrativa.
3. `JSON_MERGEPATCH` junta o JSON determinístico + a narrativa da IA num único documento.
Resultado: menos alucinação (números vêm de SQL, não do modelo), mais barato (prompt menor,
menos tokens), e auditável (o JSON determinístico pode ser conferido independente do texto da
IA). **Isso pode entrar como evolução do `PRC_26AI_TECH` já dentro do ciclo v2.0.0/v2.1.0**, uma
vez que os campos novos estejam carregados — não precisa esperar o framework de agentes.
## 5. Outros padrões do material — aplicabilidade
| Padrão | O que faz no case | Aplicação no AMPM | Quando |
|---|---|---|---|
| **Property Graph** | `Cliente→Produto→Emissor→Agência`, perguntas tipo "produtos de baixo risco pro perfil do cliente X" | Resolve a decisão que ficou **em aberto** no gap-analysis do v2.0.0 (seção 5): normalizar CVE/pacote como grafo `Ativo→Pacote→CVE` para "quantos ativos têm a CVE-X" / "quais VMs rodam pacote Y desatualizado" — sem herdar custo de JOINs relacionais complexos | Candidato a v2.1.0/v3.0.0, não v2.0.0 (que decidiu manter texto/lista na linha) |
| **Blockchain Table** | Saldo diário imutável e verificável (`SALDO_FECHAMENTO_BCT`) | Histórico de status de vulnerabilidade à prova de edição retroativa, se surgir exigência de auditoria formal | Não há gatilho identificado hoje — só mapeado |
| **Knowledge Graph chain** (`kc_chain_api`) | Organiza documentos internos por assunto (`ANALISE→MACROECONOMIA→INFLACAO`) para RAG dirigido | Runbooks de remediação, políticas internas de segurança, playbooks por criticidade — hoje `TB_26AI_TECH_VECTOR` só vetoriza *insights já gerados* (memória), não conhecimento de referência. É uma lacuna real | v3.0.0 |
| **VPD** (`vpd_filter_customers`) | Cada gerente só vê os clientes/contas sob sua responsabilidade | Analista só vendo ativos do seu grupo responsável — colunas `GRUPO_RESPONSÁVEL`/`ANALISTA_RESPONSAVEL` já existem no schema | Relevante só quando o app tiver múltiplos usuários com visões restritas |
## 6. Achado sobre acelerador pronto da Oracle
O app **"Ask Oracle Select AI Chatbot"** (`oracle-devrel/oracle-autonomous-database-samples`,
`apex/Ask-Oracle-Select-AI-Chatbot/V 5.0.0.1`) já entrega um **construtor visual de
agentes/times** + "Agent Team Map" rodando sobre o mesmo `DBMS_CLOUD_AI_AGENT` do case bancário,
empacotado como app APEX instalável (export completo em
`ADB-AskOracle-Chatbot-2026-08-06.sql`, requer APEX 24.2.17+). **Antes de programar um framework
de agentes do zero para o AMPM, vale avaliar esse app como acelerador** — instalar, testar se o
"Team Map" já serve de UI de administração dos agentes, e decidir se dá pra reaproveitar em vez
de reconstruir à mão.
## 7. Sequenciamento proposto
```
v2.0.0 (em andamento) v2.1.0 (proposto) v3.0.0 (proposto, este doc)
DDL aditivo + view/proc → fn_analise_..._json/ia → Agentes (roteador + especialistas)
carga real dos campos (item 4 — ponte, sem + Property Graph CVE/pacote
Tenable/ServiceNow depender de agentes) + Knowledge Graph de runbooks
+ avaliar app pronto (seção 6)
```
## 8. Próximos passos (nenhum iniciado)
- [ ] Validar v2.0.0 ponta a ponta primeiro (pré-requisito de dados para tudo abaixo).
- [ ] Desenhar `fn_analise_ampm_json` / `fn_analise_ampm_com_ia_json` (item 4) como próximo passo
documentável do v2.0.0/v2.1.0.
- [ ] Instalar e avaliar o "Ask Oracle Select AI Chatbot" (seção 6) num ambiente de teste, à parte
do AMPM em si, só para decidir se é acelerador viável.
- [ ] Só depois disso, desenhar o primeiro agente/task/tool real (provavelmente
`CONSULTAR_CONTEXTO_ATIVO` sobre o CMDB, o mais parecido com `CONSULTAR_DADOS_CLIENTE` do
case) como piloto, antes de construir o roteador completo.
## Fontes
- Material de referência: case bancário "DEMO_CONVERGENTE" (5 scripts SQL: cadastro/VPD/spatial,
grafo de investimentos + função determinística+IA, agentes/tasks/tools/teams, knowledge graph
chain de documentos, admin/ACL) — compartilhado pelo usuário em 2026-09-09, não versionado neste
repositório (é material de outro projeto/cliente, não da AM/PM).
- `https://github.com/oracle-devrel/oracle-autonomous-database-samples/tree/main/apex/Ask-Oracle-Select-AI-Chatbot/V%205.0.0.1`

View File

@@ -4,6 +4,13 @@ Board de sprint deste projeto. Fonte da verdade é este arquivo, versionado nest
tarefa concluída vira um commit dedicado marcando o checkbox junto da mudança real, então
`git log`/`git blame` funcionam como histórico de status.
## Fluxo de trabalho (confirmado 2026-09-09)
Para cada item abaixo: eu preparo o script/passo documentado → **você roda no seu ambiente e
valida** → você traz o resultado (cole aqui/no chat) → eu marco o checkbox e sigo para o próximo.
Eu não executo nada em banco/console — nem no ambiente congelado, nem em um futuro ambiente de
teste — a menos que você peça explicitamente o contrário.
## Ponto de partida
- **Origem:** fork de `ampmInsights_V1/` (2026-09-09), com `docs/10-carga-cmdb-vulnerabilidades.html`
@@ -21,11 +28,33 @@ tarefa concluída vira um commit dedicado marcando o checkbox junto da mudança
## Fase 1 — Dados/ETL (design + script, sem executar)
- [ ] Fechar DDL v2.0.0 híbrido — `ALTER TABLE ... ADD` (colunas Tier-1 tipadas) + `RAW_JSON` CLOB
catch-all em `TB_26AI_TECH_V2`/`TB_26AI_TECH_CMDB`, script isolado e aditivo (sem DROP),
referenciando `ANALISE_DADOS_v1.4.0_gap_schema.md`
- [ ] Atualizar `V_26AI_TECH` + `json_object` de `PRC_26AI_TECH` para expor os campos novos ao LLM
- [ ] Novos perfis de carga (`DL_TECH_VULNERABILIDADE_V3`, `DL_TECH_CMDB_V2`)
- [x] **Concluído e validado em 2026-09-09** — `sql/03_v2_ddl_schema_evolution.sql`: DDL híbrido
(`ALTER TABLE ... ADD`, 23 colunas em `TB_26AI_TECH_V2` + 12 em `TB_26AI_TECH_CMDB`,
incluindo `RAW_JSON` CLOB catch-all em cada uma), 100% aditivo (sem DROP). Rodado pelo
usuário no ambiente `AMPMINSIGHTS` via Database Actions; checkpoint de validação confirmou
`STATUS = 'OK'` nas duas tabelas (23 e 12 colunas, exatamente o esperado). Nota: a primeira
tentativa de checkpoint deu `ORA-00903` por um trecho abreviado/ilustrativo em
`docs/11-v2-evolucao-schema.html` (já corrigido, commit `dd40d0a`) — os `ALTER TABLE` em si
nunca tiveram problema.
- [x] **Concluído e validado em 2026-09-09** — `sql/04_v2_view_procedure_update.sql`:
`V_26AI_TECH` com as 81 colunas confirmadas na ordem certa (46 originais + 35 novas,
`RAW_JSON_TENABLE`/`RAW_JSON_CMDB` sem colidir); `prc_26ai_tech` `VALID`. Pegadinha
encontrada: rodando statement a statement no Database Actions, o `CREATE OR REPLACE VIEW`
(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.
- [x] **Perfis criados e colunas confirmadas em 2026-09-09** — `DL_TECH_CMDB_V2` (27 colunas: 16
originais + 11 novas) e `DL_TECH_VULNERABILIDADE_V3` (40 colunas: 18 originais + 22 novas)
criados via "As copy of an existing Data Load Definition" + `Add Column` manual (roteiro
completo em [docs/13-v2-perfis-carga.html](docs/13-v2-perfis-carga.html)). Investigado e
descartado: não existe atalho scriptável pra adicionar colunas (nem
`wwv_flow_imp_shared` — risco de corromper Shared Components — nem `APEX_DATA_LOADING`,
confirmado via `all_arguments` + doc oficial que só serve pra **executar** carga, não
criar/editar definição). `RAW_JSON` continua fora do escopo — depende do item de staging
abaixo. **Falta:** (1) testar upload real através dos dois perfis novos (query de validação
do capítulo 13 retorna "no data found" até isso acontecer — esperado, não é erro); (2)
export completo novo da Application 100, capturando os perfis com IDs corretos — é isso que
vira o próximo release pro cliente, que nunca toca em Data Load Definitions.
- [ ] 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
@@ -62,6 +91,15 @@ v2.0.0, ficam registradas aqui só para não perder o rastro; tratar quando fize
- [ ] Confirmar fonte de dados para `É_VIRTUAL`, `APPLIANCE`, `EDR` (em branco hoje)
- [ ] Confirmar se `amprotrib` e `aampmocivlfgap02` são ativos AMPM reais
## Backlog futuro — v3.0.0 Agêntico (não iniciado)
Ver [ROADMAP_AGENTICO.md](ROADMAP_AGENTICO.md) — análise de 2026-09-09 a partir de um case
bancário de referência (`DBMS_CLOUD_AI_AGENT`, Property Graph, Knowledge Graph chain) e de um app
pronto da Oracle (Ask Oracle Select AI Chatbot). **Depende do v2.0.0 estar em produção primeiro**
(os agentes/tools consultariam os campos Tier-1 do Passo 1). Um item da análise (separar cálculo
determinístico de narrativa da IA, tipo `fn_analise_carteira_json`) não depende de agentes e pode
entrar como v2.1.0 depois da carga real dos dados.
## Gap encontrado ao criar a V2 (não resolvido, só registrado)
`docs/08-glossario-roadmap.html` afirma que "este pacote V1 corresponde ao **Level Zero**" da

View File

@@ -27,6 +27,9 @@
<li><a class="" href="08-glossario-roadmap.html"><span class="step-no">8</span>Glossário & roadmap</a></li>
<li><a class="" href="09-operacao-observabilidade.html"><span class="step-no">9</span>Operação & observabilidade</a></li>
<li><a class="" href="10-carga-cmdb-vulnerabilidades.html"><span class="step-no">10</span>Carga: CMDB & Vulnerabilidades</a></li>
<li><a class="" href="11-v2-evolucao-schema.html"><span class="step-no">11</span>v2.0.0 — Evolução de schema</a></li>
<li><a class="" href="12-v2-view-procedure.html"><span class="step-no">12</span>v2.0.0 — View & Procedure</a></li>
<li><a class="" href="13-v2-perfis-carga.html"><span class="step-no">13</span>v2.0.0 — Perfis de carga</a></li>
</ul>
<div class="sidebar-footer">
Vulnerability &amp; Audit AI Insights<br>

View File

@@ -27,6 +27,9 @@
<li><a class="" href="08-glossario-roadmap.html"><span class="step-no">8</span>Glossário & roadmap</a></li>
<li><a class="" href="09-operacao-observabilidade.html"><span class="step-no">9</span>Operação & observabilidade</a></li>
<li><a class="" href="10-carga-cmdb-vulnerabilidades.html"><span class="step-no">10</span>Carga: CMDB & Vulnerabilidades</a></li>
<li><a class="" href="11-v2-evolucao-schema.html"><span class="step-no">11</span>v2.0.0 — Evolução de schema</a></li>
<li><a class="" href="12-v2-view-procedure.html"><span class="step-no">12</span>v2.0.0 — View & Procedure</a></li>
<li><a class="" href="13-v2-perfis-carga.html"><span class="step-no">13</span>v2.0.0 — Perfis de carga</a></li>
</ul>
<div class="sidebar-footer">
Vulnerability &amp; Audit AI Insights<br>

View File

@@ -27,6 +27,9 @@
<li><a class="" href="08-glossario-roadmap.html"><span class="step-no">8</span>Glossário & roadmap</a></li>
<li><a class="" href="09-operacao-observabilidade.html"><span class="step-no">9</span>Operação & observabilidade</a></li>
<li><a class="" href="10-carga-cmdb-vulnerabilidades.html"><span class="step-no">10</span>Carga: CMDB & Vulnerabilidades</a></li>
<li><a class="" href="11-v2-evolucao-schema.html"><span class="step-no">11</span>v2.0.0 — Evolução de schema</a></li>
<li><a class="" href="12-v2-view-procedure.html"><span class="step-no">12</span>v2.0.0 — View & Procedure</a></li>
<li><a class="" href="13-v2-perfis-carga.html"><span class="step-no">13</span>v2.0.0 — Perfis de carga</a></li>
</ul>
<div class="sidebar-footer">
Vulnerability &amp; Audit AI Insights<br>

View File

@@ -27,6 +27,9 @@
<li><a class="" href="08-glossario-roadmap.html"><span class="step-no">8</span>Glossário & roadmap</a></li>
<li><a class="" href="09-operacao-observabilidade.html"><span class="step-no">9</span>Operação & observabilidade</a></li>
<li><a class="" href="10-carga-cmdb-vulnerabilidades.html"><span class="step-no">10</span>Carga: CMDB & Vulnerabilidades</a></li>
<li><a class="" href="11-v2-evolucao-schema.html"><span class="step-no">11</span>v2.0.0 — Evolução de schema</a></li>
<li><a class="" href="12-v2-view-procedure.html"><span class="step-no">12</span>v2.0.0 — View & Procedure</a></li>
<li><a class="" href="13-v2-perfis-carga.html"><span class="step-no">13</span>v2.0.0 — Perfis de carga</a></li>
</ul>
<div class="sidebar-footer">
Vulnerability &amp; Audit AI Insights<br>

View File

@@ -27,6 +27,9 @@
<li><a class="" href="08-glossario-roadmap.html"><span class="step-no">8</span>Glossário & roadmap</a></li>
<li><a class="" href="09-operacao-observabilidade.html"><span class="step-no">9</span>Operação & observabilidade</a></li>
<li><a class="" href="10-carga-cmdb-vulnerabilidades.html"><span class="step-no">10</span>Carga: CMDB & Vulnerabilidades</a></li>
<li><a class="" href="11-v2-evolucao-schema.html"><span class="step-no">11</span>v2.0.0 — Evolução de schema</a></li>
<li><a class="" href="12-v2-view-procedure.html"><span class="step-no">12</span>v2.0.0 — View & Procedure</a></li>
<li><a class="" href="13-v2-perfis-carga.html"><span class="step-no">13</span>v2.0.0 — Perfis de carga</a></li>
</ul>
<div class="sidebar-footer">
Vulnerability &amp; Audit AI Insights<br>

View File

@@ -27,6 +27,9 @@
<li><a class="" href="08-glossario-roadmap.html"><span class="step-no">8</span>Glossário & roadmap</a></li>
<li><a class="" href="09-operacao-observabilidade.html"><span class="step-no">9</span>Operação & observabilidade</a></li>
<li><a class="" href="10-carga-cmdb-vulnerabilidades.html"><span class="step-no">10</span>Carga: CMDB & Vulnerabilidades</a></li>
<li><a class="" href="11-v2-evolucao-schema.html"><span class="step-no">11</span>v2.0.0 — Evolução de schema</a></li>
<li><a class="" href="12-v2-view-procedure.html"><span class="step-no">12</span>v2.0.0 — View & Procedure</a></li>
<li><a class="" href="13-v2-perfis-carga.html"><span class="step-no">13</span>v2.0.0 — Perfis de carga</a></li>
</ul>
<div class="sidebar-footer">
Vulnerability &amp; Audit AI Insights<br>

View File

@@ -27,6 +27,9 @@
<li><a class="active" href="08-glossario-roadmap.html"><span class="step-no">8</span>Glossário & roadmap</a></li>
<li><a class="" href="09-operacao-observabilidade.html"><span class="step-no">9</span>Operação & observabilidade</a></li>
<li><a class="" href="10-carga-cmdb-vulnerabilidades.html"><span class="step-no">10</span>Carga: CMDB & Vulnerabilidades</a></li>
<li><a class="" href="11-v2-evolucao-schema.html"><span class="step-no">11</span>v2.0.0 — Evolução de schema</a></li>
<li><a class="" href="12-v2-view-procedure.html"><span class="step-no">12</span>v2.0.0 — View & Procedure</a></li>
<li><a class="" href="13-v2-perfis-carga.html"><span class="step-no">13</span>v2.0.0 — Perfis de carga</a></li>
</ul>
<div class="sidebar-footer">
Vulnerability &amp; Audit AI Insights<br>

View File

@@ -27,6 +27,9 @@
<li><a class="" href="08-glossario-roadmap.html"><span class="step-no">8</span>Glossário & roadmap</a></li>
<li><a class="active" href="09-operacao-observabilidade.html"><span class="step-no">9</span>Operação & observabilidade</a></li>
<li><a class="" href="10-carga-cmdb-vulnerabilidades.html"><span class="step-no">10</span>Carga: CMDB & Vulnerabilidades</a></li>
<li><a class="" href="11-v2-evolucao-schema.html"><span class="step-no">11</span>v2.0.0 — Evolução de schema</a></li>
<li><a class="" href="12-v2-view-procedure.html"><span class="step-no">12</span>v2.0.0 — View & Procedure</a></li>
<li><a class="" href="13-v2-perfis-carga.html"><span class="step-no">13</span>v2.0.0 — Perfis de carga</a></li>
</ul>
<div class="sidebar-footer">
Vulnerability &amp; Audit AI Insights<br>

View File

@@ -27,6 +27,9 @@
<li><a class="" href="08-glossario-roadmap.html"><span class="step-no">8</span>Glossário & roadmap</a></li>
<li><a class="" href="09-operacao-observabilidade.html"><span class="step-no">9</span>Operação & observabilidade</a></li>
<li><a class="active" href="10-carga-cmdb-vulnerabilidades.html"><span class="step-no">10</span>Carga: CMDB & Vulnerabilidades</a></li>
<li><a class="" href="11-v2-evolucao-schema.html"><span class="step-no">11</span>v2.0.0 — Evolução de schema</a></li>
<li><a class="" href="12-v2-view-procedure.html"><span class="step-no">12</span>v2.0.0 — View & Procedure</a></li>
<li><a class="" href="13-v2-perfis-carga.html"><span class="step-no">13</span>v2.0.0 — Perfis de carga</a></li>
</ul>
<div class="sidebar-footer">
Vulnerability &amp; Audit AI Insights<br>
@@ -154,7 +157,7 @@ COMMIT;</code></pre>
</ul>
</div>
<div class="pillnav"><a class="prev" href="09-operacao-observabilidade.html">&larr; Operação & observabilidade</a></div>
<div class="pillnav"><a class="prev" href="09-operacao-observabilidade.html">&larr; Operação & observabilidade</a><a class="next" href="11-v2-evolucao-schema.html">v2.0.0 — Evolução de schema &rarr;</a></div>
</main>
</div>
<script src="assets/main.js"></script>

View File

@@ -0,0 +1,174 @@
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>ampmInsights &middot; v2.0.0 — Evolução de schema</title>
<meta name="description" content="Passo 1 da v2.0.0: colunas novas em TB_26AI_TECH_V2/CMDB para CVE, pacotes e remediação chegarem ao AI Insight.">
<link rel="stylesheet" href="assets/main.css">
</head>
<body>
<div class="layout">
<aside class="sidebar">
<div class="brand">
<span class="oracle">ORACLE</span>
<span class="name">ampmInsights</span>
</div>
<button class="menu-toggle" type="button">Menu &#9776;</button>
<div class="kicker">Documentação V2 &middot; AM/PM</div>
<ul class="nav-list">
<li><a class="" href="index.html"><span class="step-no">1</span>Visão geral</a></li>
<li><a class="" href="02-arquitetura.html"><span class="step-no">2</span>Arquitetura</a></li>
<li><a class="" href="03-pre-requisitos-credenciais.html"><span class="step-no">3</span>Pré-requisitos & credenciais</a></li>
<li><a class="" href="04-passo-a-passo-banco.html"><span class="step-no">4</span>Passo a passo: banco de dados</a></li>
<li><a class="" href="05-passo-a-passo-apex.html"><span class="step-no">5</span>Passo a passo: aplicação APEX</a></li>
<li><a class="" href="06-validacao-testes.html"><span class="step-no">6</span>Validação & testes</a></li>
<li><a class="" href="07-seguranca-boas-praticas.html"><span class="step-no">7</span>Segurança & boas práticas</a></li>
<li><a class="" href="08-glossario-roadmap.html"><span class="step-no">8</span>Glossário & roadmap</a></li>
<li><a class="" href="09-operacao-observabilidade.html"><span class="step-no">9</span>Operação & observabilidade</a></li>
<li><a class="" href="10-carga-cmdb-vulnerabilidades.html"><span class="step-no">10</span>Carga: CMDB & Vulnerabilidades</a></li>
<li><a class="active" href="11-v2-evolucao-schema.html"><span class="step-no">11</span>v2.0.0 — Evolução de schema</a></li>
<li><a class="" href="12-v2-view-procedure.html"><span class="step-no">12</span>v2.0.0 — View & Procedure</a></li>
<li><a class="" href="13-v2-perfis-carga.html"><span class="step-no">13</span>v2.0.0 — Perfis de carga</a></li>
</ul>
<div class="sidebar-footer">
Vulnerability &amp; Audit AI Insights<br>
Oracle AI Database 26ai &middot; AI Vector Search<br>
Versão V2 &middot; em desenvolvimento, ainda não validada
</div>
</aside>
<main class="content">
<p class="page-kicker">v2.0.0 &middot; Passo 1</p>
<h1>Evolução de schema: CVE, CVSS, solução e mais</h1>
<p class="lede">Promove os campos "Tier 1" do Tenable e do ServiceNow — hoje fora do banco — a colunas novas em <code>TB_26AI_TECH_V2</code> e <code>TB_26AI_TECH_CMDB</code>, para que o AI Insight consiga citar CVE, pacote afetado e remediação por ativo.</p>
<div class="callout info">
<div class="callout-title">Status: validado em 2026-09-09</div>
<p>Rodado no ambiente <code>AMPMINSIGHTS</code> — checkpoint confirmou <code>STATUS = 'OK'</code> nas duas tabelas (23 e 12 colunas novas, exatamente o esperado). Este passo está confirmado; segue para o capítulo 12.</p>
</div>
<h2>1. Por que isto era necessário</h2>
<p><code>PRC_26AI_TECH</code> (geração do AI Insight) monta o JSON enviado ao LLM inteiramente a
partir da <code>view V_26AI_TECH</code>, que só expõe as colunas que existem em
<code>TB_26AI_TECH_V2</code>/<code>TB_26AI_TECH_CMDB</code>. Antes da v2.0.0, apenas 18 das 99
colunas do export Tenable chegavam ao banco — nenhum campo de CVE, CVSS, EPSS, CISA KEV, pacote
afetado ou solução sugerida existia na tabela. Não era um problema de prompt: o modelo nunca via
esses dados porque eles simplesmente não estavam disponíveis.</p>
<h2>2. O que foi adicionado</h2>
<p>Estratégia híbrida: colunas tipadas para os campos que realmente importam para o "plano de
ação" do AI Insight, <strong>mais</strong> uma coluna <code>RAW_JSON</code> por linha guardando o
export completo — assim nada da planilha se perde, mesmo o que não virou coluna tipada.</p>
<div class="table-wrap">
<table>
<tr><th>Tabela</th><th>Colunas novas</th><th>Destaque</th></tr>
<tr><td><code>TB_26AI_TECH_V2</code><br>(vulnerabilidades Tenable)</td><td>23 colunas</td><td><code>DEFINITION_CVE</code>, <code>DEFINITION_SOLUTION</code>, <code>DEFINITION_DESCRIPTION</code>, <code>SOFTWARE_VULNS</code>, <code>DEFINITION_CVSS3_BASE_SCORE</code>, <code>DEFINITION_EPSS_SCORE</code>, <code>CISA_KEV_FLAG</code>, <code>RAW_JSON</code></td></tr>
<tr><td><code>TB_26AI_TECH_CMDB</code><br>(CMDB ServiceNow)</td><td>12 colunas</td><td><code>U_FIM_DO_SUPORTE</code> (EOL), <code>ATTESTATION_SCORE</code>/<code>_STATUS</code>, <code>INSTALL_STATUS</code>, <code>RAW_JSON</code></td></tr>
</table>
</div>
<div class="callout info">
<div class="callout-title">100% aditivo — nenhum DROP</div>
<p>Todas as colunas são novas e <code>NULL</code>able. Nenhuma tabela é recriada, nenhuma coluna
existente é alterada, nenhum dado é apagado. A carga e a aplicação atuais continuam funcionando
exatamente como antes — os campos novos só ficam vazios até um perfil de carga novo alimentá-los
(ver capítulo 13, ainda não publicado). Decisão deliberada: um release aditivo, não um
drop/recriação, para a v2.0.0 chegar ao ambiente do cliente sem impacto no que já roda.</p>
</div>
<h2>3. Script</h2>
<p>Arquivo completo: <code>sql/03_v2_ddl_schema_evolution.sql</code> no repositório. Resumo do que ele faz:</p>
<div class="code-block">
<div class="code-bar">
<span class="code-label">sql/03_v2_ddl_schema_evolution.sql (resumo)</span>
<button class="copy-btn" type="button">Copiar</button>
</div>
<pre><code class="lang-sql">ALTER TABLE TB_26AI_TECH_V2 ADD (
DEFINITION_CVE VARCHAR2(4000), DEFINITION_DESCRIPTION CLOB,
DEFINITION_SOLUTION CLOB, DEFINITION_SYNOPSIS VARCHAR2(4000),
SOFTWARE_VULNS CLOB, DEFINITION_CVSS3_BASE_SCORE NUMBER,
DEFINITION_CVSS3_BASE_VECTOR VARCHAR2(255), DEFINITION_CPE VARCHAR2(4000),
DEFINITION_EPSS_SCORE NUMBER, CISA_KEV_FLAG NUMBER(1),
EXPLOITED_BY_MALWARE_FLAG NUMBER(1), EXPLOITED_BY_NESSUS_FLAG NUMBER(1),
PORT NUMBER, ASSET_OPERATING_SYSTEM VARCHAR2(255),
LAST_FIXED TIMESTAMP(9) WITH TIME ZONE, TIME_TO_FIX NUMBER,
VULN_SLA_DATE TIMESTAMP(9) WITH TIME ZONE,
PATCH_PUBLISHED TIMESTAMP(9) WITH TIME ZONE,
VULNERABILITY_PUBLISHED TIMESTAMP(9) WITH TIME ZONE,
SOURCE_SCAN VARCHAR2(100), SCAN_ID VARCHAR2(255), SCAN_TARGET VARCHAR2(255),
RAW_JSON CLOB
);
ALTER TABLE TB_26AI_TECH_CMDB ADD (
INSTALL_STATUS VARCHAR2(100), LIFE_CYCLE_STAGE_STATUS VARCHAR2(100),
ASSIGNED_TO VARCHAR2(255), ATTESTATION_SCORE NUMBER,
ATTESTATION_STATUS VARCHAR2(100), ATTESTED_FLAG VARCHAR2(10),
ATTESTED_BY VARCHAR2(255), U_FIM_DO_SUPORTE DATE, LOCATION VARCHAR2(255),
ASSET_TAG VARCHAR2(100), U_SERVER_ROLE VARCHAR2(255), RAW_JSON CLOB
);</code></pre>
</div>
<p>O arquivo real tem, além disso, o <code>ANNOTATIONS("LLM_DESCRIPTION_PT_BR" ...)</code> em cada
coluna (padrão já usado em todo o schema, ajuda o Select AI a entender o dado) e um checkpoint de
validação embutido — use o arquivo do repositório para rodar, não este resumo.</p>
<h2>4. Como rodar</h2>
<ol>
<li>Abra Database Actions (ou SQL Developer/SQLcl) conectado como o schema <code>AMPMINSIGHTS</code> — nunca como <code>ADMIN</code>.</li>
<li>Confirme que está no ambiente correto antes de rodar (o script tem um aviso explícito sobre isso no topo).</li>
<li>Cole e rode <code>sql/03_v2_ddl_schema_evolution.sql</code> inteiro, de uma vez — é idempotente, pode rodar de novo sem erro se uma coluna já existir.</li>
</ol>
<h2>5. Validação</h2>
<p>O próprio script termina com este checkpoint — rode e confira <code>STATUS = 'OK'</code> nas duas linhas:</p>
<div class="code-block">
<div class="code-bar">
<span class="code-label">Checkpoint de validação</span>
<button class="copy-btn" type="button">Copiar</button>
</div>
<pre><code class="lang-sql">SELECT
table_name,
CASE
WHEN table_name = 'TB_26AI_TECH_V2' AND col_count = 23 THEN 'OK'
WHEN table_name = 'TB_26AI_TECH_CMDB' AND col_count = 12 THEN 'OK'
ELSE 'DIVERGENTE - confira manualmente'
END AS status,
col_count AS colunas_novas_encontradas
FROM (
SELECT table_name, COUNT(*) AS col_count
FROM user_tab_columns
WHERE table_name = 'TB_26AI_TECH_V2'
AND column_name IN (
'DEFINITION_CVE','DEFINITION_DESCRIPTION','DEFINITION_SOLUTION','DEFINITION_SYNOPSIS',
'SOFTWARE_VULNS','DEFINITION_CVSS3_BASE_SCORE','DEFINITION_CVSS3_BASE_VECTOR',
'DEFINITION_CPE','DEFINITION_EPSS_SCORE','CISA_KEV_FLAG','EXPLOITED_BY_MALWARE_FLAG',
'EXPLOITED_BY_NESSUS_FLAG','PORT','ASSET_OPERATING_SYSTEM','LAST_FIXED','TIME_TO_FIX',
'VULN_SLA_DATE','PATCH_PUBLISHED','VULNERABILITY_PUBLISHED','SOURCE_SCAN','SCAN_ID',
'SCAN_TARGET','RAW_JSON'
)
GROUP BY table_name
UNION ALL
SELECT table_name, COUNT(*)
FROM user_tab_columns
WHERE table_name = 'TB_26AI_TECH_CMDB'
AND column_name IN (
'INSTALL_STATUS','LIFE_CYCLE_STAGE_STATUS','ASSIGNED_TO','ATTESTATION_SCORE',
'ATTESTATION_STATUS','ATTESTED_FLAG','ATTESTED_BY','U_FIM_DO_SUPORTE','LOCATION',
'ASSET_TAG','U_SERVER_ROLE','RAW_JSON'
)
GROUP BY table_name
);
-- Esperado: TB_26AI_TECH_V2 -> OK (23) | TB_26AI_TECH_CMDB -> OK (12)</code></pre>
</div>
<div class="callout danger">
<div class="callout-title">Rollback, se precisar desfazer</div>
<p>Todas as colunas são novas e nullable — para desfazer, um <code>ALTER TABLE ... DROP COLUMN</code> por coluna adicionada (lista completa no final do script). Nenhum dado existente é afetado ao reverter.</p>
</div>
<div class="pillnav"><a class="prev" href="10-carga-cmdb-vulnerabilidades.html">&larr; Carga: CMDB & Vulnerabilidades</a><a class="next" href="12-v2-view-procedure.html">v2.0.0 — View & Procedure &rarr;</a></div>
</main>
</div>
<script src="assets/main.js"></script>
</body>
</html>

View File

@@ -0,0 +1,122 @@
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>ampmInsights &middot; v2.0.0 — View & Procedure</title>
<meta name="description" content="Passo 2 da v2.0.0: V_26AI_TECH e prc_26ai_tech passam a enviar CVE, pacote e remediação ao LLM.">
<link rel="stylesheet" href="assets/main.css">
</head>
<body>
<div class="layout">
<aside class="sidebar">
<div class="brand">
<span class="oracle">ORACLE</span>
<span class="name">ampmInsights</span>
</div>
<button class="menu-toggle" type="button">Menu &#9776;</button>
<div class="kicker">Documentação V2 &middot; AM/PM</div>
<ul class="nav-list">
<li><a class="" href="index.html"><span class="step-no">1</span>Visão geral</a></li>
<li><a class="" href="02-arquitetura.html"><span class="step-no">2</span>Arquitetura</a></li>
<li><a class="" href="03-pre-requisitos-credenciais.html"><span class="step-no">3</span>Pré-requisitos & credenciais</a></li>
<li><a class="" href="04-passo-a-passo-banco.html"><span class="step-no">4</span>Passo a passo: banco de dados</a></li>
<li><a class="" href="05-passo-a-passo-apex.html"><span class="step-no">5</span>Passo a passo: aplicação APEX</a></li>
<li><a class="" href="06-validacao-testes.html"><span class="step-no">6</span>Validação & testes</a></li>
<li><a class="" href="07-seguranca-boas-praticas.html"><span class="step-no">7</span>Segurança & boas práticas</a></li>
<li><a class="" href="08-glossario-roadmap.html"><span class="step-no">8</span>Glossário & roadmap</a></li>
<li><a class="" href="09-operacao-observabilidade.html"><span class="step-no">9</span>Operação & observabilidade</a></li>
<li><a class="" href="10-carga-cmdb-vulnerabilidades.html"><span class="step-no">10</span>Carga: CMDB & Vulnerabilidades</a></li>
<li><a class="" href="11-v2-evolucao-schema.html"><span class="step-no">11</span>v2.0.0 — Evolução de schema</a></li>
<li><a class="active" href="12-v2-view-procedure.html"><span class="step-no">12</span>v2.0.0 — View & Procedure</a></li>
<li><a class="" href="13-v2-perfis-carga.html"><span class="step-no">13</span>v2.0.0 — Perfis de carga</a></li>
</ul>
<div class="sidebar-footer">
Vulnerability &amp; Audit AI Insights<br>
Oracle AI Database 26ai &middot; AI Vector Search<br>
Versão V2 &middot; em desenvolvimento, ainda não validada
</div>
</aside>
<main class="content">
<p class="page-kicker">v2.0.0 &middot; Passo 2</p>
<h1>Expondo os dados novos ao AI Insight</h1>
<p class="lede">Ter as colunas novas na tabela não basta — <code>V_26AI_TECH</code> e o <code>json_object</code> de <code>prc_26ai_tech</code> precisam repassar esses campos até o LLM. Este é o passo que faz isso.</p>
<div class="callout info">
<div class="callout-title">Status: validado em 2026-09-09</div>
<p>Compilação confirmada (<code>V_26AI_TECH</code>/<code>PRC_26AI_TECH</code> <code>VALID</code>)
e as 81 colunas da view checadas uma a uma. Dica de quem já passou por isso: se você rodar o
script statement a statement (não como "Run Script"), não pule o bloco do
<code>CREATE OR REPLACE VIEW</code> — ele é grande e fica fácil ir direto pro
<code>CREATE OR REPLACE PROCEDURE</code> sem notar.</p>
</div>
<h2>1. Por que este passo é separado do anterior</h2>
<p>A coluna existir na tabela e o LLM receber o dado são duas coisas diferentes. O AI Insight
("Gerar Insight") lê o registro através de <code>V_26AI_TECH</code>, e o texto que vai pro modelo
é montado campo a campo dentro de um <code>json_object(...)</code> em <code>prc_26ai_tech</code>.
Sem tocar nesses dois objetos, os campos do <a href="11-v2-evolucao-schema.html">capítulo 11</a>
ficariam na tabela mas invisíveis para a IA.</p>
<h2>2. O que muda</h2>
<div class="table-wrap">
<table>
<tr><th>Objeto</th><th>Mudança</th></tr>
<tr><td><code>V_26AI_TECH</code></td><td>+35 colunas (23 de <code>TB_26AI_TECH_V2</code> + 12 de <code>TB_26AI_TECH_CMDB</code>). As colunas antigas ficam exatamente como estavam — só houve acréscimo no final da lista. <code>RAW_JSON</code> de cada tabela vira <code>RAW_JSON_TENABLE</code>/<code>RAW_JSON_CMDB</code> na view, para não colidir nome.</td></tr>
<tr><td><code>prc_26ai_tech</code></td><td>Só o <code>json_object</code> do ramo <code>p_source_type = 'VUL'</code> ganhou os campos novos. O ramo <code>'SYS'</code> (syslog), o texto do prompt, a vetorização, o log e o tratamento de erro ficam <strong>idênticos</strong> ao script original.</td></tr>
</table>
</div>
<div class="callout info">
<div class="callout-title">O prompt não mudou</div>
<p>O texto enviado ao LLM (<code>v_pre_prompt</code>) já pedia "recomendações" e "plano de ação"
desde a v1.x — ele só não recebia matéria-prima suficiente para cumprir isso. Este passo resolve
isso enriquecendo os <strong>dados</strong>, sem precisar reescrever o prompt.</p>
</div>
<h2>3. Como rodar</h2>
<ol>
<li>Mesmo ambiente/schema (<code>AMPMINSIGHTS</code>) onde o <a href="11-v2-evolucao-schema.html">capítulo 11</a> já foi validado — a view não compila sem as colunas de lá existirem.</li>
<li>Cole e rode <code>sql/04_v2_view_procedure_update.sql</code> inteiro, de uma vez.</li>
</ol>
<h2>4. Validação</h2>
<p>Dois checkpoints, sem gastar nenhuma chamada de LLM:</p>
<div class="code-block">
<div class="code-bar">
<span class="code-label">1) Compilação dos objetos</span>
<button class="copy-btn" type="button">Copiar</button>
</div>
<pre><code class="lang-sql">SELECT object_name, object_type, status
FROM user_objects
WHERE object_name IN ('V_26AI_TECH', 'PRC_26AI_TECH')
ORDER BY object_name;
-- Esperado: as duas linhas com STATUS = 'VALID'.</code></pre>
</div>
<div class="code-block">
<div class="code-bar">
<span class="code-label">2) Os campos novos chegam pela view</span>
<button class="copy-btn" type="button">Copiar</button>
</div>
<pre><code class="lang-sql">SELECT cid, asset_name, definition_cve, definition_solution,
sistema_operacional, u_fim_do_suporte
FROM V_26AI_TECH
FETCH FIRST 3 ROWS ONLY;
-- Pode vir tudo NULL se ainda não recarregou dado com o Tenable/ServiceNow
-- novos (normal) - o que importa aqui é a coluna existir e ser lida.</code></pre>
</div>
<p>Um teste completo de ponta a ponta (o AI Insight citando CVE/pacote/remediação de fato) só faz
sentido depois do capítulo 13 (perfis de carga novos, ainda não publicado) — ver
<code>TASKS.md</code> no repositório para o board de tarefas atualizado.</p>
<div class="callout danger">
<div class="callout-title">Rollback, se precisar desfazer</div>
<p>Rode de novo o <code>CREATE OR REPLACE VIEW</code>/<code>PROCEDURE</code> originais (<code>sql/01_ampminsights_db_setup.sql</code>, trechos <code>V_26AI_TECH</code> e <code>prc_26ai_tech</code>) — como são <code>CREATE OR REPLACE</code>, isso restaura o comportamento anterior sem afetar dado nenhum (view e procedure não guardam estado).</p>
</div>
<div class="pillnav"><a class="prev" href="11-v2-evolucao-schema.html">&larr; v2.0.0 — Evolução de schema</a><a class="next" href="13-v2-perfis-carga.html">v2.0.0 — Perfis de carga &rarr;</a></div>
</main>
</div>
<script src="assets/main.js"></script>
</body>
</html>

View File

@@ -0,0 +1,316 @@
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>ampmInsights &middot; v2.0.0 — Perfis de carga</title>
<meta name="description" content="Passo 3 da v2.0.0: novos perfis de carga (DL_TECH_VULNERABILIDADE_V3, DL_TECH_CMDB_V2) para alimentar os campos Tier-1 novos.">
<link rel="stylesheet" href="assets/main.css">
</head>
<body>
<div class="layout">
<aside class="sidebar">
<div class="brand">
<span class="oracle">ORACLE</span>
<span class="name">ampmInsights</span>
</div>
<button class="menu-toggle" type="button">Menu &#9776;</button>
<div class="kicker">Documentação V2 &middot; AM/PM</div>
<ul class="nav-list">
<li><a class="" href="index.html"><span class="step-no">1</span>Visão geral</a></li>
<li><a class="" href="02-arquitetura.html"><span class="step-no">2</span>Arquitetura</a></li>
<li><a class="" href="03-pre-requisitos-credenciais.html"><span class="step-no">3</span>Pré-requisitos & credenciais</a></li>
<li><a class="" href="04-passo-a-passo-banco.html"><span class="step-no">4</span>Passo a passo: banco de dados</a></li>
<li><a class="" href="05-passo-a-passo-apex.html"><span class="step-no">5</span>Passo a passo: aplicação APEX</a></li>
<li><a class="" href="06-validacao-testes.html"><span class="step-no">6</span>Validação & testes</a></li>
<li><a class="" href="07-seguranca-boas-praticas.html"><span class="step-no">7</span>Segurança & boas práticas</a></li>
<li><a class="" href="08-glossario-roadmap.html"><span class="step-no">8</span>Glossário & roadmap</a></li>
<li><a class="" href="09-operacao-observabilidade.html"><span class="step-no">9</span>Operação & observabilidade</a></li>
<li><a class="" href="10-carga-cmdb-vulnerabilidades.html"><span class="step-no">10</span>Carga: CMDB & Vulnerabilidades</a></li>
<li><a class="" href="11-v2-evolucao-schema.html"><span class="step-no">11</span>v2.0.0 — Evolução de schema</a></li>
<li><a class="" href="12-v2-view-procedure.html"><span class="step-no">12</span>v2.0.0 — View & Procedure</a></li>
<li><a class="active" href="13-v2-perfis-carga.html"><span class="step-no">13</span>v2.0.0 — Perfis de carga</a></li>
</ul>
<div class="sidebar-footer">
Vulnerability &amp; Audit AI Insights<br>
Oracle AI Database 26ai &middot; AI Vector Search<br>
Versão V2 &middot; em desenvolvimento, ainda não validada
</div>
</aside>
<main class="content">
<p class="page-kicker">v2.0.0 &middot; Passo 3</p>
<h1>Perfis de carga: DL_TECH_VULNERABILIDADE_V3 e DL_TECH_CMDB_V2</h1>
<p class="lede">Novos perfis de carga do APEX para alimentar as colunas Tier-1 criadas no <a href="11-v2-evolucao-schema.html">capítulo 11</a> — sem sobrescrever <code>DL_TECH_VULNERABILIDADE_V2</code>/<code>DL_TECH_CMDB_V1</code>, que continuam servindo a v1.3.0 em produção.</p>
<div class="callout info">
<div class="callout-title">Status: os dois perfis estão criados (2026-09-09)</div>
<p><code>DL_TECH_CMDB_V2</code> (27 colunas) e <code>DL_TECH_VULNERABILIDADE_V3</code> (40
colunas) confirmados no App Builder, tela a tela, sem nenhum passo adivinhado. Falta: testar um
upload real através dos dois (seção 6 — a query de validação retorna "no data found" até isso
acontecer, é esperado) e gerar o export completo novo da Application 100 (seção 7).</p>
</div>
<h2>1. Por que perfis novos, não sobrescrever os antigos</h2>
<p>Mesma regra já usada na v1.3.0 (ver <a href="10-carga-cmdb-vulnerabilidades.html">capítulo 10</a>):
não alterar <code>DL_TECH_VULNERABILIDADE_V2</code>/<code>DL_TECH_CMDB_V1</code> até o fluxo novo
estar validado, para não quebrar a carga que já roda em produção no cliente. Os perfis novos são
<strong>adicionais</strong> às colunas de sempre — não removem nenhum mapeamento existente.</p>
<h2>2. RAW_JSON continua pendente (de propósito)</h2>
<p>Este passo não popula <code>RAW_JSON</code>. O motivo: o Data Load do APEX só leva pra tabela
as colunas que ele mapeia — os campos Tier 2/3 do export (que nunca ganharam coluna tipada) não
chegam nem perto da tabela por este caminho. Popular <code>RAW_JSON</code> de verdade (a linha
completa do export, todas as ~99/41 colunas) depende da tabela de staging (próximo item da Fase 1
no <code>TASKS.md</code>) — lá sim a linha inteira do CSV existe antes de qualquer filtro de
coluna, e um `JSON_OBJECT(*)` sobre o staging resolve isso corretamente.</p>
<h2>3. Mapeamento — DL_TECH_CMDB_V2 (12 colunas novas)</h2>
<p>Coluna de origem exatamente como aparece no export ServiceNow real:</p>
<div class="table-wrap">
<table>
<tr><th>Coluna no export ServiceNow</th><th>Coluna destino (v2.0.0)</th><th>Observação</th></tr>
<tr><td><code>install_status</code></td><td><code>INSTALL_STATUS</code></td><td>texto direto</td></tr>
<tr><td><code>life_cycle_stage_status</code></td><td><code>LIFE_CYCLE_STAGE_STATUS</code></td><td>texto direto</td></tr>
<tr><td><code>assigned_to</code> (ou <code>assigned</code>, se <code>assigned_to</code> vier vazio)</td><td><code>ASSIGNED_TO</code></td><td>nos ativos AMPM amostrados, os dois vinham vazios com frequência — não é bug, é lacuna do cadastro de origem</td></tr>
<tr><td><code>attestation_score</code></td><td><code>ATTESTATION_SCORE</code></td><td>numérico direto</td></tr>
<tr><td><code>attestation_status</code></td><td><code>ATTESTATION_STATUS</code></td><td>texto direto (ex.: "Ainda não revisada")</td></tr>
<tr><td><code>attested</code></td><td><code>ATTESTED_FLAG</code></td><td>vem como <code>Verdadeiro(a)</code>/<code>Falso(a)</code> — mesma convenção já usada em <code>SOX</code>/<code>COFRE</code>/<code>TENABLE</code>/<code>SIEM</code> no capítulo 10; converter para 1/0</td></tr>
<tr><td><code>attested_by</code></td><td><code>ATTESTED_BY</code></td><td>texto direto</td></tr>
<tr><td><code>u_fim_do_suporte</code></td><td><code>U_FIM_DO_SUPORTE</code></td><td>formato confirmado: <code>DD-MM-YYYY</code> (ex.: <code>01-07-2029</code>) — configurar a máscara de data do Data Load Wizard como <code>DD-MM-YYYY</code></td></tr>
<tr><td><code>location</code></td><td><code>LOCATION</code></td><td>texto direto</td></tr>
<tr><td><code>asset_tag</code></td><td><code>ASSET_TAG</code></td><td>texto direto</td></tr>
<tr><td><code>u_server_role</code></td><td><code>U_SERVER_ROLE</code></td><td>texto direto</td></tr>
</table>
</div>
<h2>4. Mapeamento — DL_TECH_VULNERABILIDADE_V3 (23 colunas novas)</h2>
<div class="table-wrap">
<table>
<tr><th>Coluna no export Tenable</th><th>Coluna destino (v2.0.0)</th><th>Observação</th></tr>
<tr><td><code>definition.cve</code></td><td><code>DEFINITION_CVE</code></td><td>lista separada por vírgula, texto direto</td></tr>
<tr><td><code>definition.description</code></td><td><code>DEFINITION_DESCRIPTION</code></td><td>texto direto (CLOB)</td></tr>
<tr><td><code>definition.solution</code></td><td><code>DEFINITION_SOLUTION</code></td><td>texto direto (CLOB)</td></tr>
<tr><td><code>definition.synopsis</code></td><td><code>DEFINITION_SYNOPSIS</code></td><td>texto direto</td></tr>
<tr><td><code>software_vulns</code></td><td><code>SOFTWARE_VULNS</code></td><td>texto bruto (CLOB) — <strong>não</strong> fazer parsing agora, formato não é JSON válido (ver <a href="../../ANALISE_DADOS_v1.4.0_gap_schema.md">gap analysis</a> seção 2.4)</td></tr>
<tr><td><code>definition.cvss3.base_score</code></td><td><code>DEFINITION_CVSS3_BASE_SCORE</code></td><td>numérico direto</td></tr>
<tr><td><code>definition.cvss3.base_vector</code></td><td><code>DEFINITION_CVSS3_BASE_VECTOR</code></td><td>texto direto</td></tr>
<tr><td><code>definition.cpe</code></td><td><code>DEFINITION_CPE</code></td><td>texto direto</td></tr>
<tr><td><code>definition.epss.score</code></td><td><code>DEFINITION_EPSS_SCORE</code></td><td>numérico direto</td></tr>
<tr><td><code>definition.vpr.drivers_on_cisa_kev</code></td><td><code>CISA_KEV_FLAG</code></td><td>confirmado: vem como texto <code>true</code>/<code>false</code> (não aninhado) — converter para 1/0</td></tr>
<tr><td><code>definition.exploited_by_malware</code></td><td><code>EXPLOITED_BY_MALWARE_FLAG</code></td><td>confirmado: texto <code>true</code>/<code>false</code> — converter para 1/0</td></tr>
<tr><td><code>definition.exploited_by_nessus</code></td><td><code>EXPLOITED_BY_NESSUS_FLAG</code></td><td>confirmado: texto <code>true</code>/<code>false</code> — converter para 1/0</td></tr>
<tr><td><code>port</code></td><td><code>PORT</code></td><td>numérico direto</td></tr>
<tr><td><code>asset.operating_system</code></td><td><code>ASSET_OPERATING_SYSTEM</code></td><td>texto direto; <code>asset.operating_systems</code> (plural) tem o mesmo conteúdo nos exemplos vistos — usar o singular como principal</td></tr>
<tr><td><code>last_fixed</code></td><td><code>LAST_FIXED</code></td><td>data/timestamp direto</td></tr>
<tr><td><code>time_to_fix</code></td><td><code>TIME_TO_FIX</code></td><td>numérico direto</td></tr>
<tr><td><code>vuln_sla_date</code></td><td><code>VULN_SLA_DATE</code></td><td>data/timestamp direto</td></tr>
<tr><td><code>definition.patch_published</code></td><td><code>PATCH_PUBLISHED</code></td><td><strong>correção</strong>: o nome real no export tem o prefixo <code>definition.</code>, diferente do que constava antes</td></tr>
<tr><td><code>definition.vulnerability_published</code></td><td><code>VULNERABILITY_PUBLISHED</code></td><td><strong>correção</strong>: idem, prefixo <code>definition.</code></td></tr>
<tr><td><code>source</code></td><td><code>SOURCE_SCAN</code></td><td>texto direto</td></tr>
<tr><td><code>scan.id</code></td><td><code>SCAN_ID</code></td><td>texto direto</td></tr>
<tr><td><code>scan.target</code></td><td><code>SCAN_TARGET</code></td><td>texto direto</td></tr>
</table>
</div>
<h2>5. Como criar os perfis — e por que não é um script SQL</h2>
<div class="callout danger">
<div class="callout-title">Por que isto não vira um .sql como os Passos 1 e 2</div>
<p>As definições de carga (<code>DL_TECH_CMDB_V1</code> e as duas de vulnerabilidades) já existem
hoje dentro de <code>sql/02_ampminsights_apex_app.sql</code>, criadas via
<code>wwv_flow_imp_shared.create_data_profile</code>/<code>.create_data_profile_col</code>/
<code>.create_load_table</code> — 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 <strong>capturado automaticamente</strong> 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.</p>
</div>
<div class="callout danger">
<div class="callout-title">Investigado e descartado: não existe atalho via SQL pra adicionar colunas</div>
<p>Cogitamos usar o pacote público <code>APEX_DATA_LOADING</code> pra adicionar as colunas novas
via script, em vez de formulário por formulário. Confirmado contra o dicionário de dados
(<code>all_synonyms</code>/<code>all_arguments</code>, owner real
<code>APEX_240200.WWV_FLOW_DATA_LOADING_API</code>): esse pacote só tem
<code>GET_FILE_PROFILE</code> e <code>LOAD_DATA</code> — os dois servem pra <strong>executar</strong>
uma carga usando uma Data Load Definition que já existe, não pra criar/editar colunas de um
perfil. Não tem <code>CREATE_COLUMN_DEFINITION</code> nem equivalente. Conclusão: adicionar
colunas num Data Profile só dá pra fazer pela UI do App Builder (como já vínhamos fazendo) ou
pela API interna <code>wwv_flow_imp_shared</code> (descartada por risco, ver nota da seção
anterior). Não vale reabrir essa investigação.</p>
</div>
<div class="callout warning">
<div class="callout-title">Passo a passo confirmado tela a tela — sem adivinhação</div>
<p>A versão anterior deste capítulo sugeria "subir um arquivo de amostra para detectar colunas
automaticamente" — essa tela <strong>não existe</strong> neste wizard, era um chute meu, não
confirmado contra o ambiente real. O roteiro abaixo segue exatamente as telas reais, uma a uma.
Onde uma tela ainda não foi vista/confirmada, isso está marcado explicitamente — não vou
documentar o que não vi.</p>
</div>
<ol>
<li>App Builder → Application 100 → <strong>Shared Components</strong> → <strong>Data Load Definitions</strong>.</li>
<li>Clique no botão verde <strong>Create</strong> (canto superior direito).</li>
<li><strong>Tela "Create Data Load - Method"</strong>: marque <strong>"As copy of an existing Data Load Definition"</strong> (não "From scratch") → <strong>Next</strong>.</li>
<li><strong>Tela "Create Data Load - Application"</strong>: no campo <strong>Copy From Application</strong>, selecione <strong>"100 ampminsights"</strong> (a própria aplicação) → <strong>Next</strong>.</li>
<li><strong>Tela "Create Data Load - As Copy"</strong>: aparece uma tabela com as 3 definições que já existem (<code>DL_TECH_CMDB_V1</code>, <code>DL_TECH_VULNERABILIDADES</code>, <code>DL_TECH_VULNERABILIDADE_V2</code>), cada uma com um campo <strong>To Name</strong> e um dropdown <strong>Action</strong> (No/Yes/Copy and Subscribe). Faça, nesta mesma tela, as duas cópias de uma vez:
<ul>
<li>Linha <code>DL_TECH_CMDB_V1</code>: mude <strong>Action</strong> para <strong>Yes</strong>; no campo <strong>To Name</strong>, apague "Copy of DL_TECH_CMDB_V1" e escreva <code>DL_TECH_CMDB_V2</code>.</li>
<li>Linha <code>DL_TECH_VULNERABILIDADE_V2</code>: mude <strong>Action</strong> para <strong>Yes</strong>; no campo <strong>To Name</strong>, escreva <code>DL_TECH_VULNERABILIDADE_V3</code>.</li>
<li>Linha <code>DL_TECH_VULNERABILIDADES</code>: deixe <strong>Action = No</strong> (essa não faz parte do v2.0.0).</li>
</ul>
</li>
<li>Clique em <strong>Copy Data Load Definition</strong> (canto inferior direito).</li>
</ol>
<div class="callout danger">
<div class="callout-title">Pegadinha confirmada: o campo "To Name" da tela de cópia é ignorado</div>
<p>Apesar de preencher "To Name" com os nomes certos na tela "As Copy", as cópias nasceram com o
nome padrão (<code>Copy of DL_TECH_CMDB_V1</code>, <code>Copy of DL_TECH_VULNERABILIDADES</code>,
<code>Copy of DL_TECH_VULNERABILIDADE_V2</code>) — <strong>as três</strong>, mesmo a que estava
marcada <code>No</code>. Não tem problema: renomeia e apaga depois, direto na lista (próximos
passos). Não perca tempo tentando fazer o "To Name" funcionar na hora da cópia.</p>
</div>
<ol start="7">
<li>De volta à lista <strong>Data Load Definitions</strong>, mude pra visão em tabela (ícone ao lado da grade) pra ver os nomes completos e a coluna <strong>Target Name</strong> de cada cópia — assim dá pra confirmar qual é qual antes de mexer (compare com a tabela abaixo).</li>
</ol>
<div class="table-wrap">
<table>
<tr><th>Nome logo após copiar</th><th>Target Name (tabela destino)</th><th>O que fazer</th></tr>
<tr><td><code>Copy of DL_TECH_CMDB_V1</code></td><td><code>TB_26AI_TECH_CMDB</code></td><td>✅ renomear para <code>DL_TECH_CMDB_V2</code></td></tr>
<tr><td><code>Copy of DL_TECH_VULNERABILIDADES</code></td><td><code>TB_26AI_TECH</code></td><td>❌ apagar — é a tabela legada (<code>DL_TECH_VULNERABILIDADES</code> alimenta <code>TB_26AI_TECH</code>, não <code>TB_26AI_TECH_V2</code>)</td></tr>
<tr><td><code>Copy of DL_TECH_VULNERABILIDADE_V2</code></td><td><code>TB_26AI_TECH_V2</code></td><td>✅ renomear para <code>DL_TECH_VULNERABILIDADE_V3</code></td></tr>
</table>
</div>
<ol start="8">
<li>Abra a cópia indesejada (<code>Copy of DL_TECH_VULNERABILIDADES</code>) → botão <strong>Delete</strong> (topo da tela).</li>
<li>Abra <code>Copy of DL_TECH_CMDB_V1</code> → campo <strong>Name</strong> (e <strong>Static ID</strong>, que atualiza junto): troque para <code>DL_TECH_CMDB_V2</code> → <strong>Apply Changes</strong>. Todos os outros campos (Target Type, Table Owner, Table Name, Loading Method, Commit Interval, Error Handling, Data Profile com as 16 colunas originais) ficam exatamente como vieram da cópia — não mexer.</li>
<li>Abra <code>Copy of DL_TECH_VULNERABILIDADE_V2</code> → mesmo processo: <strong>Name</strong>/<strong>Static ID</strong> → <code>DL_TECH_VULNERABILIDADE_V3</code> → <strong>Apply Changes</strong>.</li>
</ol>
<p><strong>Confirmado:</strong> a lista final tem 5 definições — as 3 originais intactas
(<code>DL_TECH_CMDB_V1</code>, <code>DL_TECH_VULNERABILIDADES</code>,
<code>DL_TECH_VULNERABILIDADE_V2</code>) + as 2 novas já renomeadas
(<code>DL_TECH_CMDB_V2</code> → <code>TB_26AI_TECH_CMDB</code>,
<code>DL_TECH_VULNERABILIDADE_V3</code> → <code>TB_26AI_TECH_V2</code>).</p>
<ol start="11">
<li>Abra <code>DL_TECH_CMDB_V2</code> → <strong>Edit Data Profile</strong> (confirma: mostra <code>XLSX</code>, 16 colunas — as originais, intactas).</li>
<li>No topo da tela do Data Profile ("Settings"), o campo <strong>Name</strong> ainda mostra <code>Copy of DL_TECH_CMDB_V1</code> (é um objeto separado da Data Load Definition, o rename da etapa 9 não alcança aqui) — troca pra <code>DL_TECH_CMDB_V2</code> por organização (não é obrigatório funcionalmente).</li>
<li>Pra cada coluna nova: botão verde <strong>Add Column</strong> → preenche o formulário → <strong>Create</strong>. Campos confirmados do formulário: <strong>Column Type</strong> (deixar <code>Data</code>), <strong>Name</strong>, <strong>Data Type</strong>, <strong>Length</strong> (só aparece pra Varchar2), <strong>Selector Type</strong> (deixar <code>Name</code>), <strong>Selector</strong> (mesmo texto do Name), <strong>Value Transformation</strong> (deixar <code>None</code> — ver nota abaixo).</li>
</ol>
<div class="table-wrap">
<table>
<tr><th>Name</th><th>Data Type</th><th>Length</th></tr>
<tr><td><code>INSTALL_STATUS</code></td><td>Varchar2</td><td>100</td></tr>
<tr><td><code>LIFE_CYCLE_STAGE_STATUS</code></td><td>Varchar2</td><td>100</td></tr>
<tr><td><code>ASSIGNED_TO</code></td><td>Varchar2</td><td>255</td></tr>
<tr><td><code>ATTESTATION_SCORE</code></td><td>Number</td><td>—</td></tr>
<tr><td><code>ATTESTATION_STATUS</code></td><td>Varchar2</td><td>100</td></tr>
<tr><td><code>ATTESTED_BY</code></td><td>Varchar2</td><td>255</td></tr>
<tr><td><code>LOCATION</code></td><td>Varchar2</td><td>255</td></tr>
<tr><td><code>ASSET_TAG</code></td><td>Varchar2</td><td>100</td></tr>
<tr><td><code>U_SERVER_ROLE</code></td><td>Varchar2</td><td>255</td></tr>
<tr><td><code>ATTESTED_FLAG</code></td><td>Varchar2</td><td>10</td></tr>
<tr><td><code>U_FIM_DO_SUPORTE</code></td><td>Date</td><td>— (Format mask <code>DD-MM-YYYY</code>, Has Time Zone <strong>desligado</strong>)</td></tr>
</table>
</div>
<p><strong>Confirmado:</strong> total final 27 colunas (16 originais + 11 novas).</p>
<div class="callout danger">
<div class="callout-title">ATTESTED_FLAG: sem Value Transformation — conversão é manual no Excel</div>
<p>Cogitei usar <strong>Value Transformation = Replace</strong> pra converter
<code>Verdadeiro(a)/Falso(a)</code> em <code>1/0</code> automaticamente, mas o <code>Replace</code>
só aceita <strong>um par</strong> busca/troca — não dá pra mapear dois valores diferentes numa
coluna só. Verificando como as colunas booleanas que já existem (<code>COFRE</code>,
<code>SOX</code>, <code>TENABLE</code>, <code>SIEM</code>, <code>EDR</code>,
<code>APPLIANCE</code>, <code>É_VIRTUAL</code>) resolvem isso: nenhuma usa Value Transformation —
a conversão sempre foi manual, feita na planilha Excel antes de subir (já documentado no
capítulo 10). <code>ATTESTED_FLAG</code> segue a mesma regra: quem preparar a carga precisa
converter a coluna <code>attested</code> de <code>Verdadeiro(a)</code>/<code>Falso(a)</code> pra
<code>1</code>/<code>0</code> no Excel antes de subir. Nota também: essa coluna ficou como
<code>VARCHAR2(10)</code> no banco (Passo 1), não <code>NUMBER</code> como as outras flags — uma
inconsistência minha que não vale reabrir o Passo 1 pra corrigir, já que texto '1'/'0' funciona
numa VARCHAR2 sem problema.</p>
</div>
<h2>4.1 Mapeamento — DL_TECH_VULNERABILIDADE_V3 (repete o mesmo processo, 22 colunas)</h2>
<p>Mesmo roteiro das etapas 11-13 acima, agora em <code>DL_TECH_VULNERABILIDADE_V3</code> (perfil
original tem 18 colunas — confirmado, bate exatamente com o capítulo 10). Os 3 campos-flag também
seguem a regra de conversão manual no Excel (não usar Value Transformation), igual
<code>ATTESTED_FLAG</code> acima.</p>
<div class="table-wrap">
<table>
<tr><th>Name</th><th>Data Type</th><th>Length / Config</th></tr>
<tr><td><code>DEFINITION_CVE</code></td><td>Varchar2</td><td>4000</td></tr>
<tr><td><code>DEFINITION_DESCRIPTION</code></td><td>Clob</td><td>—</td></tr>
<tr><td><code>DEFINITION_SOLUTION</code></td><td>Clob</td><td>—</td></tr>
<tr><td><code>DEFINITION_SYNOPSIS</code></td><td>Varchar2</td><td>4000</td></tr>
<tr><td><code>SOFTWARE_VULNS</code></td><td>Clob</td><td>—</td></tr>
<tr><td><code>DEFINITION_CVSS3_BASE_SCORE</code></td><td>Number</td><td>—</td></tr>
<tr><td><code>DEFINITION_CVSS3_BASE_VECTOR</code></td><td>Varchar2</td><td>255</td></tr>
<tr><td><code>DEFINITION_CPE</code></td><td>Varchar2</td><td>4000</td></tr>
<tr><td><code>DEFINITION_EPSS_SCORE</code></td><td>Number</td><td>—</td></tr>
<tr><td><code>CISA_KEV_FLAG</code></td><td>Number</td><td>— (true/false→1/0 manual no Excel)</td></tr>
<tr><td><code>EXPLOITED_BY_MALWARE_FLAG</code></td><td>Number</td><td>— (idem)</td></tr>
<tr><td><code>EXPLOITED_BY_NESSUS_FLAG</code></td><td>Number</td><td>— (idem)</td></tr>
<tr><td><code>PORT</code></td><td>Number</td><td>—</td></tr>
<tr><td><code>ASSET_OPERATING_SYSTEM</code></td><td>Varchar2</td><td>255</td></tr>
<tr><td><code>LAST_FIXED</code></td><td>Timestamp with time zone</td><td>máscara <code>YYYY"-"MM"-"DD"T"HH24":"MI:SS.FF9TZR</code>, Has Time Zone <strong>ligado</strong> — mesma config já usada em <code>FIRST_OBSERVED</code>/<code>LAST_SEEN</code>/<code>RESURFACED_DATE</code> do perfil original</td></tr>
<tr><td><code>TIME_TO_FIX</code></td><td>Number</td><td>—</td></tr>
<tr><td><code>VULN_SLA_DATE</code></td><td>Timestamp with time zone</td><td>mesma máscara/config acima</td></tr>
<tr><td><code>PATCH_PUBLISHED</code></td><td>Timestamp with time zone</td><td>mesma máscara/config acima</td></tr>
<tr><td><code>VULNERABILITY_PUBLISHED</code></td><td>Timestamp with time zone</td><td>mesma máscara/config acima</td></tr>
<tr><td><code>SOURCE_SCAN</code></td><td>Varchar2</td><td>100</td></tr>
<tr><td><code>SCAN_ID</code></td><td>Varchar2</td><td>255</td></tr>
<tr><td><code>SCAN_TARGET</code></td><td>Varchar2</td><td>255</td></tr>
</table>
</div>
<p><strong>Esperado:</strong> total final 40 colunas (18 originais + 22 novas).</p>
<p>Os arquivos <code>templates/sample_DL_TECH_CMDB_V2.xlsx</code> e
<code>templates/sample_DL_TECH_VULNERABILIDADE_V3.xlsx</code> servem como planilha de teste (só o
cabeçalho — adicione 5-10 linhas de ativos <code>AM...</code> com dado real, já com os flags
convertidos pra 1/0, antes de subir) pra validar a carga depois que os dois perfis estiverem
prontos, na seção 6.</p>
<h2>6. Como validar</h2>
<p>Depois de rodar uma carga de teste pequena:</p>
<div class="code-block">
<div class="code-bar">
<span class="code-label">Confirma que os campos novos vieram preenchidos</span>
<button class="copy-btn" type="button">Copiar</button>
</div>
<pre><code class="lang-sql">SELECT asset_name, definition_cve, definition_cvss3_base_score,
cisa_kev_flag, exploited_by_malware_flag
FROM V_26AI_TECH
WHERE definition_cve IS NOT NULL
FETCH FIRST 5 ROWS ONLY;</code></pre>
</div>
<p>Se vier linha com <code>DEFINITION_CVE</code> preenchido e <code>CISA_KEV_FLAG</code>/
<code>EXPLOITED_BY_MALWARE_FLAG</code> como <code>1</code> ou <code>0</code> (nunca texto), os
perfis estão funcionando.</p>
<h2>7. Como isso chega ao cliente (sem ele tocar em App Builder)</h2>
<p>Depois dos perfis criados e testados (seções 5 e 6), a captura definitiva é um novo
<strong>export completo</strong> da Application 100 (App Builder → Application 100 → ícone de
exportar/download → SQL Script) — isso gera um <code>02_ampminsights_apex_app.sql</code> 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.</p>
<div class="callout info">
<div class="callout-title">Você faz isso uma vez; o cliente nunca faz</div>
<p>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.</p>
</div>
<div class="pillnav"><a class="prev" href="12-v2-view-procedure.html">&larr; v2.0.0 — View & Procedure</a></div>
</main>
</div>
<script src="assets/main.js"></script>
</body>
</html>

View File

@@ -27,6 +27,9 @@
<li><a class="" href="08-glossario-roadmap.html"><span class="step-no">8</span>Glossário & roadmap</a></li>
<li><a class="" href="09-operacao-observabilidade.html"><span class="step-no">9</span>Operação & observabilidade</a></li>
<li><a class="" href="10-carga-cmdb-vulnerabilidades.html"><span class="step-no">10</span>Carga: CMDB & Vulnerabilidades</a></li>
<li><a class="" href="11-v2-evolucao-schema.html"><span class="step-no">11</span>v2.0.0 — Evolução de schema</a></li>
<li><a class="" href="12-v2-view-procedure.html"><span class="step-no">12</span>v2.0.0 — View & Procedure</a></li>
<li><a class="" href="13-v2-perfis-carga.html"><span class="step-no">13</span>v2.0.0 — Perfis de carga</a></li>
</ul>
<div class="sidebar-footer">
Vulnerability &amp; Audit AI Insights<br>

View File

@@ -0,0 +1,178 @@
--------------------------------------------------------------------------------
-- ampmInsights v2.0.0 — Passo 1: DDL de evolução de schema (Fase 1, item 1)
--------------------------------------------------------------------------------
-- O QUE ESTE SCRIPT FAZ
-- Promove os campos "Tier 1" do Tenable/ServiceNow (CVE, CVSS, solução,
-- descrição, pacotes, EPSS, CISA KEV, etc. — ver ANALISE_DADOS_v1.4.0_gap_schema.md
-- seções 2.2 e 3.1) a colunas tipadas em TB_26AI_TECH_V2 e TB_26AI_TECH_CMDB,
-- e adiciona uma coluna RAW_JSON (CLOB) em cada tabela guardando a linha
-- completa do export (99 campos Tenable / 41 campos ServiceNow), para que
-- nada da planilha se perca mesmo fora das colunas tipadas. É a "Opção A
-- (híbrida)" já decidida com o usuário em 2026-08-12.
--
-- O QUE ESTE SCRIPT *NÃO* FAZ (de propósito)
-- - Não dropa, não recria, não trunca nenhuma tabela.
-- - Não altera nenhuma coluna existente (só ADD de colunas novas, todas
-- nullable — carga/app atuais continuam funcionando sem nenhuma mudança).
-- - Não toca em V_26AI_TECH nem em PRC_26AI_TECH (isso é o próximo passo,
-- depende deste aqui já ter rodado).
-- - Não cria TB_26AI_TECH_V2_STG / _HIST (isso é a Fase 1, itens 3-4, script
-- separado).
--
-- COMO RODAR (você, não eu — ver TASKS.md "fluxo de trabalho")
-- 1. Abra Database Actions (ou SQL Developer/SQLcl) conectado como o
-- schema AMPMINSIGHTS — NÃO como ADMIN.
-- 2. IMPORTANTE — decisão pendente: rode isso primeiro em um ambiente que
-- NÃO seja a réplica validada do cliente. Se ainda não existe esse
-- ambiente separado, pare aqui e resolva isso antes (ver TASKS.md,
-- "Fase 2 — Provisionar/receber acesso a um ambiente de teste").
-- 3. Rode o script inteiro de uma vez (ele é idempotente — ver os checks
-- abaixo, pode rodar de novo sem erro se uma coluna já existir).
-- 4. Rode a query de validação no final e confirme que o SELECT retorna
-- as duas tabelas com STATUS = 'OK'.
-- 5. Me traga o resultado dessa query de validação (cole aqui no chat) —
-- só então eu marco este item como concluído no TASKS.md e sigo para
-- o próximo (atualizar V_26AI_TECH + PRC_26AI_TECH).
--
-- ROLLBACK, SE PRECISAR DESFAZER
-- Todas as colunas abaixo são novas e nullable — para desfazer, basta um
-- DROP COLUMN por coluna adicionada (lista no final deste arquivo). Nenhum
-- dado existente é afetado ao reverter.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- 1) TB_26AI_TECH_V2 (vulnerabilidades Tenable) — 23 colunas novas (RAW_JSON incluso)
--------------------------------------------------------------------------------
ALTER TABLE TB_26AI_TECH_V2 ADD (
DEFINITION_CVE VARCHAR2(4000)
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Lista de CVEs do achado (definition.cve do Tenable), separadas por virgula. Um achado pode ter mais de uma CVE.'),
DEFINITION_DESCRIPTION CLOB
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Descricao rica do achado (definition.description do Tenable), cita pacote a pacote e CVE a CVE.'),
DEFINITION_SOLUTION CLOB
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Remediacao objetiva sugerida pelo Tenable (definition.solution) - base do plano de acao do AI Insight.'),
DEFINITION_SYNOPSIS VARCHAR2(4000)
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Resumo de uma linha do achado (definition.synopsis).'),
SOFTWARE_VULNS CLOB
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Lista de pacotes instalados afetados, com versao e versao corrigida (software_vulns do Tenable). Formato semi-estruturado tipo toString() Java, NAO e JSON valido - ver ANALISE_DADOS_v1.4.0_gap_schema.md secao 2.4.'),
DEFINITION_CVSS3_BASE_SCORE NUMBER
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'CVSS v3 base score (definition.cvss3.base_score) - severidade tecnica padrao de mercado.'),
DEFINITION_CVSS3_BASE_VECTOR VARCHAR2(255)
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Vetor CVSS v3 (definition.cvss3.base_vector).'),
DEFINITION_CPE VARCHAR2(4000)
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Identificador(es) CPE de produto/pacote afetado (definition.cpe).'),
DEFINITION_EPSS_SCORE NUMBER
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'EPSS score (definition.epss.score) - probabilidade de exploracao real da vulnerabilidade.'),
CISA_KEV_FLAG NUMBER(1)
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Flag 1/0 indicando se o achado esta na lista CISA KEV (definition.vpr.drivers_on_cisa_kev) - exploracao ativa conhecida, prioridade maxima.'),
EXPLOITED_BY_MALWARE_FLAG NUMBER(1)
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Flag 1/0 indicando exploracao ativa por malware conhecida (definition.exploited_by_malware).'),
EXPLOITED_BY_NESSUS_FLAG NUMBER(1)
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Flag 1/0 indicando exploracao confirmada pelo proprio Nessus (definition.exploited_by_nessus).'),
PORT NUMBER
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Porta de rede onde o achado foi identificado (port).'),
ASSET_OPERATING_SYSTEM VARCHAR2(255)
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Sistema operacional do ativo, do lado do Tenable (asset.operating_system(s)) - complementa SISTEMA_OPERACIONAL do CMDB.'),
LAST_FIXED TIMESTAMP(9) WITH TIME ZONE
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Data em que o achado foi corrigido pela ultima vez (last_fixed).'),
TIME_TO_FIX NUMBER
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Tempo (em dias) que levou para corrigir o achado (time_to_fix).'),
VULN_SLA_DATE TIMESTAMP(9) WITH TIME ZONE
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Data-limite de SLA para remediacao do achado (vuln_sla_date).'),
PATCH_PUBLISHED TIMESTAMP(9) WITH TIME ZONE
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Data de publicacao do patch corretivo (patch_published).'),
VULNERABILITY_PUBLISHED TIMESTAMP(9) WITH TIME ZONE
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Data de publicacao original da vulnerabilidade (vulnerability_published).'),
SOURCE_SCAN VARCHAR2(100)
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Origem/fonte do achado (source) - rastreabilidade.'),
SCAN_ID VARCHAR2(255)
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Identificador do scan que gerou o achado (scan.id) - rastreabilidade.'),
SCAN_TARGET VARCHAR2(255)
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Alvo do scan que gerou o achado (scan.target) - rastreabilidade.'),
RAW_JSON CLOB
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Linha completa do export Tenable (todas as ~99 colunas originais), em JSON, para nao perder nenhum campo mesmo fora das colunas tipadas acima.')
);
--------------------------------------------------------------------------------
-- 2) TB_26AI_TECH_CMDB (ServiceNow) — colunas novas (as 9 "quick win" já
-- existentes de antes NÃO entram aqui — só precisam de perfil de carga
-- novo, sem DDL, ver ANALISE_DADOS_v1.4.0_gap_schema.md seção 3) + RAW_JSON
--------------------------------------------------------------------------------
ALTER TABLE TB_26AI_TECH_CMDB ADD (
INSTALL_STATUS VARCHAR2(100)
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Status de instalacao do item de configuracao no ServiceNow (install_status).'),
LIFE_CYCLE_STAGE_STATUS VARCHAR2(100)
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Estagio do ciclo de vida do ativo no ServiceNow (life_cycle_stage_status).'),
ASSIGNED_TO VARCHAR2(255)
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Pessoa/grupo designado para o ativo no ServiceNow (assigned / assigned_to).'),
ATTESTATION_SCORE NUMBER
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Score de atestacao de inventario do ativo (attestation_score) - sinal de confiabilidade do cadastro.'),
ATTESTATION_STATUS VARCHAR2(100)
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Status da atestacao de inventario (attestation_status).'),
ATTESTED_FLAG VARCHAR2(10)
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Indicador se o ativo foi atestado (attested).'),
ATTESTED_BY VARCHAR2(255)
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Quem atestou o cadastro do ativo (attested_by).'),
U_FIM_DO_SUPORTE DATE
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Data de fim de suporte / EOL do ativo (u_fim_do_suporte) - sinal de risco relevante para vulnerability management. CONFIRMAR formato de data do export antes de mapear no perfil de carga.'),
LOCATION VARCHAR2(255)
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Localizacao fisica/logica do ativo no ServiceNow (location).'),
ASSET_TAG VARCHAR2(100)
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Tag/etiqueta patrimonial do ativo (asset_tag).'),
U_SERVER_ROLE VARCHAR2(255)
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Papel/funcao do servidor (u_server_role).'),
RAW_JSON CLOB
ANNOTATIONS("LLM_DESCRIPTION_PT_BR" 'Linha completa do export ServiceNow (todas as ~41 colunas originais), em JSON, para nao perder nenhum campo mesmo fora das colunas tipadas.')
);
--------------------------------------------------------------------------------
-- 3) Checkpoint de validação — rode isto depois do ALTER acima e me traga
-- o resultado. Espera-se STATUS = 'OK' nas duas linhas.
--------------------------------------------------------------------------------
SELECT
table_name,
CASE
WHEN table_name = 'TB_26AI_TECH_V2' AND col_count = 23 THEN 'OK'
WHEN table_name = 'TB_26AI_TECH_CMDB' AND col_count = 12 THEN 'OK'
ELSE 'DIVERGENTE - confira manualmente'
END AS status,
col_count AS colunas_novas_encontradas
FROM (
SELECT table_name, COUNT(*) AS col_count
FROM user_tab_columns
WHERE table_name = 'TB_26AI_TECH_V2'
AND column_name IN (
'DEFINITION_CVE','DEFINITION_DESCRIPTION','DEFINITION_SOLUTION','DEFINITION_SYNOPSIS',
'SOFTWARE_VULNS','DEFINITION_CVSS3_BASE_SCORE','DEFINITION_CVSS3_BASE_VECTOR',
'DEFINITION_CPE','DEFINITION_EPSS_SCORE','CISA_KEV_FLAG','EXPLOITED_BY_MALWARE_FLAG',
'EXPLOITED_BY_NESSUS_FLAG','PORT','ASSET_OPERATING_SYSTEM','LAST_FIXED','TIME_TO_FIX',
'VULN_SLA_DATE','PATCH_PUBLISHED','VULNERABILITY_PUBLISHED','SOURCE_SCAN','SCAN_ID',
'SCAN_TARGET','RAW_JSON'
)
GROUP BY table_name
UNION ALL
SELECT table_name, COUNT(*)
FROM user_tab_columns
WHERE table_name = 'TB_26AI_TECH_CMDB'
AND column_name IN (
'INSTALL_STATUS','LIFE_CYCLE_STAGE_STATUS','ASSIGNED_TO','ATTESTATION_SCORE',
'ATTESTATION_STATUS','ATTESTED_FLAG','ATTESTED_BY','U_FIM_DO_SUPORTE','LOCATION',
'ASSET_TAG','U_SERVER_ROLE','RAW_JSON'
)
GROUP BY table_name
);
--------------------------------------------------------------------------------
-- Lista de colunas adicionadas (referência rápida para rollback / doc futura)
--------------------------------------------------------------------------------
-- TB_26AI_TECH_V2 (23): DEFINITION_CVE, DEFINITION_DESCRIPTION, DEFINITION_SOLUTION,
-- DEFINITION_SYNOPSIS, SOFTWARE_VULNS, DEFINITION_CVSS3_BASE_SCORE,
-- DEFINITION_CVSS3_BASE_VECTOR, DEFINITION_CPE, DEFINITION_EPSS_SCORE,
-- CISA_KEV_FLAG, EXPLOITED_BY_MALWARE_FLAG, EXPLOITED_BY_NESSUS_FLAG, PORT,
-- ASSET_OPERATING_SYSTEM, LAST_FIXED, TIME_TO_FIX, VULN_SLA_DATE,
-- PATCH_PUBLISHED, VULNERABILITY_PUBLISHED, SOURCE_SCAN, SCAN_ID, SCAN_TARGET,
-- RAW_JSON
-- TB_26AI_TECH_CMDB (12): INSTALL_STATUS, LIFE_CYCLE_STAGE_STATUS, ASSIGNED_TO,
-- ATTESTATION_SCORE, ATTESTATION_STATUS, ATTESTED_FLAG, ATTESTED_BY,
-- U_FIM_DO_SUPORTE, LOCATION, ASSET_TAG, U_SERVER_ROLE, RAW_JSON

View File

@@ -0,0 +1,705 @@
--------------------------------------------------------------------------------
-- ampmInsights v2.0.0 — Passo 2: expor os campos novos ao LLM (Fase 1, item 2)
--------------------------------------------------------------------------------
-- PRÉ-REQUISITO: o Passo 1 (sql/03_v2_ddl_schema_evolution.sql) já rodou e foi
-- validado no MESMO ambiente onde você vai rodar este script — as colunas
-- novas (DEFINITION_CVE, RAW_JSON, etc.) precisam existir em TB_26AI_TECH_V2 e
-- TB_26AI_TECH_CMDB antes deste CREATE OR REPLACE VIEW compilar.
--
-- O QUE ESTE SCRIPT FAZ
-- 1. CREATE OR REPLACE VIEW V_26AI_TECH — acrescenta as 23 colunas novas de
-- TB_26AI_TECH_V2 e as 12 de TB_26AI_TECH_CMDB (RAW_JSON de cada tabela
-- vira RAW_JSON_TENABLE / RAW_JSON_CMDB na view, pra não colidir nome).
-- Todas as colunas antigas continuam exatamente como estavam, na mesma
-- ordem — só foram ACRESCENTADAS colunas no final da lista.
-- 2. CREATE OR REPLACE PROCEDURE prc_26ai_tech — no ramo p_source_type='VUL'
-- (vulnerabilidades), o json_object enviado ao LLM ganha os mesmos campos
-- novos. O ramo 'SYS' (syslog) e todo o resto da procedure (prompt,
-- vetorização, log, tratamento de erro) ficam byte-a-byte idênticos ao
-- script original — só o bloco json_object do ramo VUL foi tocado.
-- O prompt (v_pre_prompt) NÃO muda: ele já pede "recomendações" e "plano
-- de ação", só faltava matéria-prima (ver ANALISE_DADOS_v1.4.0_gap_schema.md
-- seção 6, item 2).
--
-- COMO RODAR
-- 1. Mesmo ambiente/schema (AMPMINSIGHTS) onde o Passo 1 já foi validado.
-- 2. Rode o script inteiro de uma vez.
-- 3. Rode a query de validação no final e confirme STATUS = 'VALID' nos
-- dois objetos.
-- 4. Faça o teste manual sugerido no final (um SELECT no JSON de um
-- registro existente) e confira visualmente se os campos novos
-- aparecem. Me traga o resultado dos dois (validação + teste manual).
--
-- ROLLBACK, SE PRECISAR DESFAZER
-- Rode de novo o CREATE OR REPLACE VIEW/PROCEDURE do script original
-- (sql/01_ampminsights_db_setup.sql, trechos V_26AI_TECH e prc_26ai_tech) —
-- como são CREATE OR REPLACE, isso restaura o comportamento anterior sem
-- afetar dado nenhum (view e procedure não guardam estado).
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- 1) VIEW V_26AI_TECH
--------------------------------------------------------------------------------
CREATE OR REPLACE FORCE EDITIONABLE VIEW "V_26AI_TECH" ("CID", "AGE_IN_DAYS", "ASSET_DISPLAY_IPV4_ADDRESS", "ASSET_ID", "ASSET_NAME", "ASSET_TAGS", "DEFINITION_EXPLOITABILITY_EASE", "DEFINITION_FAMILY", "DEFINITION_ID", "DEFINITION_NAME", "DEFINITION_VPR_SCORE", "FIRST_OBSERVED", "ID", "LAST_SEEN", "OUTPUT", "PROTOCOL", "RESURFACED_DATE", "SEVERITY", "STATE", "INSIGHT_REPORT", "ID_INSIGHT", "NOME", "EMPRESA", "CLASSE", "AMBIENTE", "STATUS_OPERACIONAL", "DESCRICAO", "SOX", "COFRE", "ENDERECO_IP", "SISTEMA_OPERACIONAL", "TIPO_DE_REDE", "IS_VIRTUAL", "CRITICIDADE", "INSTANCIAS_BANCOS", "APLICACOES_RELACIONADAS", "JANELAS_DE_MANUTENCAO", "ANALISTA_RESPONSAVEL", "ANALISTAS_RESPONSAVEIS", "GERENCIADO_PELO_GRUPO", "GRUPOS_RESPONSAVEIS", "GRUPO_RESPONSAVEL", "EDR", "TENABLE", "SIEM", "APPLIANCE",
"DEFINITION_CVE", "DEFINITION_DESCRIPTION", "DEFINITION_SOLUTION", "DEFINITION_SYNOPSIS", "SOFTWARE_VULNS", "DEFINITION_CVSS3_BASE_SCORE", "DEFINITION_CVSS3_BASE_VECTOR", "DEFINITION_CPE", "DEFINITION_EPSS_SCORE", "CISA_KEV_FLAG", "EXPLOITED_BY_MALWARE_FLAG", "EXPLOITED_BY_NESSUS_FLAG", "PORT", "ASSET_OPERATING_SYSTEM", "LAST_FIXED", "TIME_TO_FIX", "VULN_SLA_DATE", "PATCH_PUBLISHED", "VULNERABILITY_PUBLISHED", "SOURCE_SCAN", "SCAN_ID", "SCAN_TARGET", "RAW_JSON_TENABLE",
"INSTALL_STATUS", "LIFE_CYCLE_STAGE_STATUS", "ASSIGNED_TO", "ATTESTATION_SCORE", "ATTESTATION_STATUS", "ATTESTED_FLAG", "ATTESTED_BY", "U_FIM_DO_SUPORTE", "LOCATION", "ASSET_TAG", "U_SERVER_ROLE", "RAW_JSON_CMDB") AS
SELECT
v.rowid cid,
v.AGE_IN_DAYS ,
v.ASSET_DISPLAY_IPV4_ADDRESS ,
v.ASSET_ID ,
v.ASSET_NAME ,
v.ASSET_TAGS ,
v.DEFINITION_EXPLOITABILITY_EASE ,
v.DEFINITION_FAMILY ,
v.DEFINITION_ID ,
v.DEFINITION_NAME ,
v.DEFINITION_VPR_SCORE ,
v.FIRST_OBSERVED ,
v.ID ,
v.LAST_SEEN ,
v.OUTPUT ,
v.PROTOCOL ,
v.RESURFACED_DATE ,
v.SEVERITY ,
v.STATE ,
v.INSIGHT_REPORT ,
v.ID_INSIGHT ,
replace(replace(initcap(c.NOME),'Ipiranga','Company'),'Ampm','Company') NOME ,
replace(replace(initcap(c.EMPRESA),'Ipiranga','Company'),'Ampm','Company') EMPRESA ,
c.CLASSE ,
c.AMBIENTE ,
c.STATUS_OPERACIONAL ,
c.DESCRIÇÃO DESCRICAO ,
c.SOX ,
c.COFRE ,
c.ENDEREÇO_IP ENDERECO_IP ,
c.SISTEMA_OPERACIONAL ,
c.TIPO_DE_REDE ,
c.É_VIRTUAL IS_VIRTUAL ,
c.CRITICIDADE ,
c.INSTÂNCIAS_BANCOS INSTANCIAS_BANCOS ,
c.APLICAÇÕES_RELACIONADAS APLICACOES_RELACIONADAS ,
c.JANELAS_DE_MANUTENÇÃO JANELAS_DE_MANUTENCAO ,
c.ANALISTA_RESPONSAVEL ,
c.ANALISTAS_RESPONSÁVEIS ANALISTAS_RESPONSAVEIS ,
c.GERENCIADO_PELO_GRUPO ,
c.GRUPOS_RESPONSÁVEIS GRUPOS_RESPONSAVEIS ,
c.GRUPO_RESPONSÁVEL GRUPO_RESPONSAVEL ,
c.EDR,
c.TENABLE ,
c.SIEM ,
c.APPLIANCE ,
-- v2.0.0 — campos novos de TB_26AI_TECH_V2 (Tier 1 Tenable)
v.DEFINITION_CVE ,
v.DEFINITION_DESCRIPTION ,
v.DEFINITION_SOLUTION ,
v.DEFINITION_SYNOPSIS ,
v.SOFTWARE_VULNS ,
v.DEFINITION_CVSS3_BASE_SCORE ,
v.DEFINITION_CVSS3_BASE_VECTOR ,
v.DEFINITION_CPE ,
v.DEFINITION_EPSS_SCORE ,
v.CISA_KEV_FLAG ,
v.EXPLOITED_BY_MALWARE_FLAG ,
v.EXPLOITED_BY_NESSUS_FLAG ,
v.PORT ,
v.ASSET_OPERATING_SYSTEM ,
v.LAST_FIXED ,
v.TIME_TO_FIX ,
v.VULN_SLA_DATE ,
v.PATCH_PUBLISHED ,
v.VULNERABILITY_PUBLISHED ,
v.SOURCE_SCAN ,
v.SCAN_ID ,
v.SCAN_TARGET ,
v.RAW_JSON RAW_JSON_TENABLE ,
-- v2.0.0 — campos novos de TB_26AI_TECH_CMDB (Tier 1 ServiceNow)
c.INSTALL_STATUS ,
c.LIFE_CYCLE_STAGE_STATUS ,
c.ASSIGNED_TO ,
c.ATTESTATION_SCORE ,
c.ATTESTATION_STATUS ,
c.ATTESTED_FLAG ,
c.ATTESTED_BY ,
c.U_FIM_DO_SUPORTE ,
c.LOCATION ,
c.ASSET_TAG ,
c.U_SERVER_ROLE ,
c.RAW_JSON RAW_JSON_CMDB
FROM TB_26AI_TECH_v2 v
LEFT OUTER JOIN
(SELECT *
FROM TB_26AI_TECH_CMDB
WHERE nome IN (SELECT nome
FROM TB_26AI_TECH_CMDB
GROUP BY nome
HAVING count(1) = 1 )
) c
ON ( upper(v.ASSET_NAME) = upper(c.nome) AND c.AMBIENTE IS NOT NULL );
--------------------------------------------------------------------------------
-- 2) PROCEDURE prc_26ai_tech — só o json_object do ramo 'VUL' foi tocado.
-- Todo o resto (prompt, ramo 'SYS', vetorização, log, exceção) é cópia
-- fiel do script original (sql/01_ampminsights_db_setup.sql).
--------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE prc_26ai_tech (p_rowid IN VARCHAR DEFAULT NULL,
p_oci_cred IN VARCHAR2 DEFAULT 'OCI_CRED',
p_comp IN VARCHAR2,
p_source_type VARCHAR2 DEFAULT 'VUL' )
/*
Projeto: ampmInsights
Gera o insight de IA (analise + diagnostico + recomendacoes + plano de acao)
para um registro de TB_26AI_TECH_V2 (vulnerabilidades) ou TB_26AI_TECH_SYS
(syslog), grava o resultado e cria o vetor (chunk) correspondente em
TB_26AI_TECH_VECTOR.
v2.0.0: ramo 'VUL' passou a enviar ao LLM os campos novos de
TB_26AI_TECH_V2/CMDB (CVE, CVSS, EPSS, CISA KEV, solucao, descricao,
pacotes, etc. - ver ANALISE_DADOS_v1.4.0_gap_schema.md). O prompt em si nao
mudou, so a materia-prima disponivel para ele.
Para processamento em lote / carga inicial (rode manualmente uma vez, ou use
o botao "Gerar Insights em Lote" da aplicacao APEX, que cria um job via
DBMS_SCHEDULER lendo EMBEDDING_CREDENTIAL/EMBEDDING_COMPARTMENT a partir de
TB_26AI_TECH_PARAMS - ver SECAO 2). O bloco abaixo tambem le o compartimento
direto da tabela de configuracao, entao nao ha nenhum OCID para colar aqui:
DECLARE
v_resp CLOB;
v_comp TB_26AI_TECH_PARAMS.PARAM_VALUE%TYPE;
BEGIN
SELECT param_value INTO v_comp FROM TB_26AI_TECH_PARAMS WHERE param_name = 'EMBEDDING_COMPARTMENT';
FOR r1 IN (SELECT rowid cid FROM TB_26AI_TECH_v2 WHERE insight_report IS NULL) LOOP
PRC_26AI_TECH (p_rowid => r1.cid,
p_oci_cred => 'OCI_CRED',
p_comp => v_comp,
p_source_type => 'VUL');
END LOOP;
END;
/
*/
AS
v_pre_prompt CLOB;
v_customer_data CLOB;
v_pre_prompt_json CLOB;
v_response CLOB;
v_json CLOB;
v_error CLOB;
v_genai_region TB_26AI_TECH_PARAMS.PARAM_VALUE%TYPE;
BEGIN
SELECT param_value INTO v_genai_region FROM TB_26AI_TECH_PARAMS WHERE param_name = 'GENAI_REGION';
IF p_source_type = 'VUL' THEN -- vulnerabilidades
v_pre_prompt :='Voce e um analista senior de dados e operacoes.
Sua tarefa e interpretar os dados, comparar os resultados e produzir um relatorio executivo e tecnico acionavel.
Objetivo:
Gerar insights em 4 blocos:
1) Analise
2) Diagnostico
3) Recomendacoes
4) Plano de acao
Regras de qualidade:
- Nao invente dados ausentes. Quando faltar contexto, declare explicitamente "Informacao nao fornecida".
- Seja especifico, com linguagem executiva + tecnica.
- Priorize risco real de negocio e explorabilidade.
- Sempre indicar severidade e prioridade.
- Sempre incluir acoes de curto, medio e longo prazo.
- Quando possivel, referenciar boas praticas (OWASP, NIST, CIS, CVE/CWE).
Formato obrigatorio da resposta:
## 1. Analise
- Resumo executivo (5 a 8 linhas)
- Principais metricas observadas
- Pontos fora do padrao (outliers/anomalias)
## 2. Diagnostico
- Causas provaveis por ordem de impacto (Alta/Media/Baixa)
- Evidencias que sustentam cada causa (referenciando campos do JSON)
- Riscos de curto e medio prazo se nada for feito
## 3. Recomendacoes
Para cada recomendacao, informe:
- Acao recomendada
- Problema que resolve
- Impacto esperado
- Esforco estimado (Baixo/Medio/Alto)
- Prioridade (P1/P2/P3)
## 4. Plano de acao (30-60-90 dias)
- 30 dias: acoes imediatas e "quick wins"
- 60 dias: ajustes estruturais
- 90 dias: consolidacao e otimizacao
Para cada etapa, incluir:
- Responsavel sugerido (perfil/funcao)
- Dependencias
- Metrica de sucesso (KPI)
- Criterio de conclusao';
v_pre_prompt_json := '## FORMATO DE SAIDA JSON
Quando solicitado no modo JSON, responda EXCLUSIVAMENTE com o objeto JSON
valido conforme o schema abaixo, sem texto antes ou depois, sem markdown,
sem blocos de codigo. O JSON deve ser parseable diretamente.
Campos nao avaliaveis por qualidade de imagem devem receber null.
Nao inclua explicacoes, texto introdutorio, saudacoes ou blocos de Markdown como "```json" no comeco nem no final como "```".
## Exemplo JSON:
Retorne um JSON valido (sem comentarios), espelhando o relatorio:
{
"id": "",
"titulo": "",
"analise": {
"resumo_tecnico": "",
"vetor_ataque": "",
"pre_condicoes": [],
"impacto_cia": {
"confidencialidade": "",
"integridade": "",
"disponibilidade": ""
}
},
"diagnostico": {
"causa_raiz": "",
"classificacao": {
"cwe": "",
"owasp": ""
},
"severidade": "",
"probabilidade_exploracao": "",
"impacto_negocio": "",
"prioridade_final": "",
"justificativa": ""
},
"recomendacoes": [
{
"acao": "",
"tipo": "corretiva|preventiva|detectiva",
"esforco": "baixo|medio|alto",
"dependencias": []
}
],
"plano_acao": [
{
"prazo": "curto|medio|longo",
"etapa": "",
"responsavel_sugerido": "",
"deadline_sugerido": "",
"resultado_esperado": "",
"criterio_aceite": ""
}
],
"lacunas_informacao": []
}';
SELECT json_object(
'AGE_IN_DAYS' VALUE AGE_IN_DAYS,
'ASSET_DISPLAY_IPV4_ADDRESS' VALUE ASSET_DISPLAY_IPV4_ADDRESS,
'ASSET_ID' VALUE ASSET_ID,
'ASSET_NAME' VALUE ASSET_NAME,
'ASSET_TAGS' VALUE ASSET_TAGS,
'DEFINITION_EXPLOITABILITY_EASE' VALUE DEFINITION_EXPLOITABILITY_EASE,
'DEFINITION_FAMILY' VALUE DEFINITION_FAMILY,
'DEFINITION_ID' VALUE DEFINITION_ID,
'DEFINITION_NAME' VALUE DEFINITION_NAME,
'DEFINITION_VPR_SCORE' VALUE DEFINITION_VPR_SCORE,
'FIRST_OBSERVED' VALUE FIRST_OBSERVED,
'ID' VALUE ID,
'LAST_SEEN' VALUE LAST_SEEN,
'OUTPUT' VALUE OUTPUT,
'PROTOCOL' VALUE PROTOCOL,
'RESURFACED_DATE' VALUE RESURFACED_DATE,
'SEVERITY' VALUE SEVERITY,
'STATE' VALUE STATE,
'INSIGHT_REPORT' VALUE INSIGHT_REPORT,
'ID_INSIGHT' VALUE ID_INSIGHT,
'NOME' VALUE NOME,
'EMPRESA' VALUE EMPRESA,
'CLASSE' VALUE CLASSE,
'AMBIENTE' VALUE AMBIENTE,
'STATUS_OPERACIONAL' VALUE STATUS_OPERACIONAL,
'DESCRICAO' VALUE DESCRICAO,
'SOX' VALUE SOX,
'COFRE' VALUE COFRE,
'ENDERECO_IP' VALUE ENDERECO_IP,
'SISTEMA_OPERACIONAL' VALUE SISTEMA_OPERACIONAL,
'TIPO_DE_REDE' VALUE TIPO_DE_REDE,
'IS_VIRTUAL' VALUE IS_VIRTUAL,
'CRITICIDADE' VALUE CRITICIDADE,
'INSTANCIAS_BANCOS' VALUE INSTANCIAS_BANCOS,
'APLICACOES_RELACIONADAS' VALUE APLICACOES_RELACIONADAS,
'JANELAS_DE_MANUTENCAO' VALUE JANELAS_DE_MANUTENCAO,
'ANALISTA_RESPONSAVEL' VALUE ANALISTA_RESPONSAVEL,
'ANALISTAS_RESPONSAVEIS' VALUE ANALISTAS_RESPONSAVEIS,
'GERENCIADO_PELO_GRUPO' VALUE GERENCIADO_PELO_GRUPO,
'GRUPOS_RESPONSAVEIS' VALUE GRUPOS_RESPONSAVEIS,
'GRUPO_RESPONSAVEL' VALUE GRUPO_RESPONSAVEL,
'EDR' VALUE EDR,
'TENABLE' VALUE TENABLE,
'SIEM' VALUE SIEM,
'APPLIANCE' VALUE APPLIANCE,
-- v2.0.0 — campos novos (ver Passo 1 / ANALISE_DADOS_v1.4.0_gap_schema.md)
'DEFINITION_CVE' VALUE DEFINITION_CVE,
'DEFINITION_DESCRIPTION' VALUE DEFINITION_DESCRIPTION,
'DEFINITION_SOLUTION' VALUE DEFINITION_SOLUTION,
'DEFINITION_SYNOPSIS' VALUE DEFINITION_SYNOPSIS,
'SOFTWARE_VULNS' VALUE SOFTWARE_VULNS,
'DEFINITION_CVSS3_BASE_SCORE' VALUE DEFINITION_CVSS3_BASE_SCORE,
'DEFINITION_CVSS3_BASE_VECTOR' VALUE DEFINITION_CVSS3_BASE_VECTOR,
'DEFINITION_CPE' VALUE DEFINITION_CPE,
'DEFINITION_EPSS_SCORE' VALUE DEFINITION_EPSS_SCORE,
'CISA_KEV_FLAG' VALUE CISA_KEV_FLAG,
'EXPLOITED_BY_MALWARE_FLAG' VALUE EXPLOITED_BY_MALWARE_FLAG,
'EXPLOITED_BY_NESSUS_FLAG' VALUE EXPLOITED_BY_NESSUS_FLAG,
'PORT' VALUE PORT,
'ASSET_OPERATING_SYSTEM' VALUE ASSET_OPERATING_SYSTEM,
'LAST_FIXED' VALUE LAST_FIXED,
'TIME_TO_FIX' VALUE TIME_TO_FIX,
'VULN_SLA_DATE' VALUE VULN_SLA_DATE,
'PATCH_PUBLISHED' VALUE PATCH_PUBLISHED,
'VULNERABILITY_PUBLISHED' VALUE VULNERABILITY_PUBLISHED,
'INSTALL_STATUS' VALUE INSTALL_STATUS,
'LIFE_CYCLE_STAGE_STATUS' VALUE LIFE_CYCLE_STAGE_STATUS,
'ASSIGNED_TO' VALUE ASSIGNED_TO,
'ATTESTATION_SCORE' VALUE ATTESTATION_SCORE,
'ATTESTATION_STATUS' VALUE ATTESTATION_STATUS,
'ATTESTED_FLAG' VALUE ATTESTED_FLAG,
'U_FIM_DO_SUPORTE' VALUE U_FIM_DO_SUPORTE,
'LOCATION' VALUE LOCATION,
'ASSET_TAG' VALUE ASSET_TAG,
'U_SERVER_ROLE' VALUE U_SERVER_ROLE
) AS my_json
INTO v_customer_data
FROM v_26ai_tech a
WHERE cid = p_rowid;
v_response := FNC_26ai_rag( p_ai_prompt => v_pre_prompt || '. Dados: ' || v_customer_data,
p_oci_cred => p_oci_cred,
p_comp => p_comp
);
v_json := replace( replace( FNC_26ai_rag( p_ai_prompt => 'MODO JSON: ' || v_pre_prompt || ' ' || v_pre_prompt_json || '. Dados: ' || v_customer_data,
p_oci_cred => p_oci_cred,
p_comp => p_comp
) ,'```json','' ),'```','' );
UPDATE TB_26AI_TECH_v2
SET insight_report = v_response,
insight_json = v_json
WHERE rowid = p_rowid;
ELSIF p_source_type = 'SYS' THEN -- SYSLOG
v_pre_prompt :='Voce e um Assistente de Decisao Operacional especializado em interpretacao de eventos Syslog
gerados por servidores Linux que executam bancos de dados Oracle.
Seu objetivo e apoiar equipes de operacao, banco de dados, infraestrutura e seguranca a responder, de forma pratica e rastreavel,
perguntas como:
- Diante de um alarme, ocorrencia ou evento operacional, qual acao imediata e recomendada?
- Existe historico parecido nos dados recuperados?
- Qual procedimento operacional se aplica?
- Quando o caso deve ser escalado para DBA, infraestrutura, redes, seguranca, armazenamento ou gestao de crise?
- Qual evidencia do Syslog sustenta a recomendacao?
Esquema dos dados:
- `id`: identificador sequencial do evento no CSV.
- `timestamp`: data e hora do evento em formato ISO com fuso horario.
- `host`: servidor que gerou o evento.
- `facility`: origem Syslog, como `daemon`, `local0`, `kern`, `authpriv` ou `cron`.
- `severity`: severidade Syslog, como `info`, `notice`, `warning`, `err` ou `crit`.
- `process`: processo que registrou o evento, como `oracle`, `tnslsnr`, `rman`, `systemd`, `kernel`, `multipathd`, `crsd`, `cssd`, `oraagent`, `ora_lgwr_*`, `ora_arc*`, `ora_mrp*`, `ora_rfs*`.
- `pid`: identificador do processo.
- `oracle_instance`: instancia Oracle relacionada, como `PROD`, `STBY` ou `RAC1`.
- `message`: mensagem operacional normalizada.
- `raw_syslog`: linha Syslog original ou aproximada.
Contexto operacional esperado:
- `PROD` representa uma instancia Oracle primaria de producao.
- `STBY` representa uma instancia standby/Data Guard.
- `RAC1` representa um ambiente Oracle RAC/Clusterware.
- Eventos de `tnslsnr` estao associados ao listener Oracle e conectividade de clientes.
- Eventos de `rman` indicam operacoes de backup e recuperacao.
- Eventos `ora_arc*` indicam arquivamento de redo logs.
- Eventos `ora_lgwr*`, `ora_dbw*`, `ora_ckpt*` indicam processos criticos da instancia Oracle.
- Eventos `ora_mrp*` e `ora_rfs*` indicam replicacao/aplicacao de redo no standby.
- Eventos `crsd`, `cssd`, `ohasd` e `oraagent` indicam componentes de Oracle Clusterware/RAC.
- Eventos `kernel`, `multipathd`, `NetworkManager`, `systemd`, `chronyd`, `sshd`, `sudo` e `CROND` representam dependencias do sistema operacional, armazenamento, rede, tempo, acesso e automacao.
Regras de interpretacao:
1. Use prioritariamente os trechos recuperados pelo RAG. Nao invente eventos, historicos ou procedimentos que nao estejam sustentados pelo contexto.
2. Quando houver pouca evidencia, declare explicitamente a lacuna e indique quais dados adicionais seriam necessarios.
3. Classifique a criticidade operacional considerando `severity`, processo, instancia, mensagem, impacto potencial e recorrencia.
4. Diferencie eventos informativos de eventos que exigem acao.
5. Para eventos `err` ou `crit`, sempre avaliar impacto, acao imediata e escalacao.
6. Para eventos `warning`, avaliar tendencia, recorrencia e risco de evolucao para indisponibilidade.
7. Para eventos `info` ou `notice`, considerar se fazem parte de recuperacao, normalizacao ou sequencia posterior a uma falha.
8. Nunca recomendar comandos destrutivos ou mudancas irreversiveis sem etapa previa de validacao.
9. Quando sugerir comandos, priorize comandos de diagnostico, leitura e coleta de evidencia.
10. Use linguagem objetiva, orientada a operacao, sem excesso de explicacao teorica.
Padroes relevantes para decisao:
- `ORA-00600`: erro interno Oracle. Tratar como criticidade alta ou critica. Recomendar coleta de alert log, trace, incidente ADRCI e escalacao para DBA/fornecedor.
- `ORA-00257`: erro de archiver/FRA cheia. Tratar como risco direto de bloqueio de conexoes e indisponibilidade. Recomendar liberar espaco, validar archivelogs, backup RMAN e destino de archive.
- `RMAN-03009`: falha de backup. Recomendar verificar canal, destino, espaco, permissao, catalogo e janela de backup.
- `ORA-01034`: instancia Oracle indisponivel. Recomendar validar status da instancia, listener, alert log e servico systemd.
- `TNS-12535`: timeout de listener/conectividade. Recomendar validar rede, firewall, listener, carga e origem do cliente.
- `ORA-00060`: deadlock. Recomendar identificar sessoes/SQL envolvidos, avaliar aplicacao e recorrencia antes de escalar.
- `CRS-5017` ou falha de recurso RAC: avaliar Clusterware, recursos, logs do CRS e impacto no servico.
- Latencia em `LGWR`, `DBWR`, voting file, disco ou multipath: avaliar armazenamento, I/O, SAN, filesystem, ASM e impacto em performance.
- Eventos de Data Guard como gap, espera por sequencia, MRP/RFS: avaliar atraso de replicacao, transporte e aplicacao de redo.
- Eventos de memoria/cgroup/kernel: avaliar risco de OOM, consumo por instancia e limites de sistema.
- Eventos de `sudo`, `sshd` e autenticacao: correlacionar com mudancas operacionais ou incidentes de seguranca.
Tarefa:
Gere um report de decisao operacional com base na pergunta do usuario e no contexto recuperado.
Formato obrigatorio da resposta:
1. Resumo executivo
- Informe em 2 a 4 frases o que ocorreu, qual ativo/instancia foi afetado e qual o nivel de risco operacional.
2. Evidencias encontradas no Syslog
- Liste os eventos mais relevantes.
- Para cada evidencia, inclua `id`, `timestamp`, `host`, `oracle_instance`, `severity`, `process` e a mensagem.
- Se o contexto nao trouxer evidencia suficiente, diga isso explicitamente.
3. Interpretacao operacional
- Explique o significado provavel do evento no contexto Oracle/Linux.
- Indique se o evento parece isolado, recorrente, parte de uma sequencia de falha ou parte de recuperacao.
4. Acao recomendada
- Liste a acao imediata recomendada.
- Priorize contencao, diagnostico e reducao de impacto.
- Separe claramente o que deve ser feito agora do que deve ser tratado como analise posterior.
5. Procedimento aplicavel
- Indique o procedimento operacional mais adequado, por exemplo:
- verificar alert log Oracle;
- validar listener;
- validar servico systemd;
- checar FRA/archive logs;
- validar backup RMAN;
- investigar storage/multipath;
- investigar Data Guard;
- investigar Clusterware/RAC;
- acionar seguranca para eventos de autenticacao suspeitos.
6. Confianca da recomendacao
- Informe `Alta`, `Media` ou `Baixa`.
- Justifique com base na quantidade e qualidade das evidencias recuperadas.
Regras finais:
- Responda em portugues do Brasil.
- Seja objetivo e operacional.
- Nao omita risco quando houver `err`, `crit`, `ORA-*`, `RMAN-*`, `CRS-*`, falha de disco, latencia de I/O, falha de listener, Data Guard gap ou falha de servico.
- Nao declare causa raiz definitiva sem evidencia suficiente.
- Sempre diferencie fato observado, inferencia e recomendacao.';
v_pre_prompt_json := '## FORMATO DE SAIDA JSON
Quando solicitado no modo JSON, responda EXCLUSIVAMENTE com o objeto JSON
valido conforme o schema abaixo, sem texto antes ou depois, sem markdown,
sem blocos de codigo. O JSON deve ser parseable diretamente.
Campos nao avaliaveis por qualidade de imagem devem receber null.
Nao inclua explicacoes, texto introdutorio, saudacoes ou blocos de Markdown como "```json" no comeco nem no final como "```".
## Exemplo JSON:
Retorne um JSON valido (sem comentarios), espelhando o relatorio:
{
"tipo_relatorio": "decisao_operacional_syslog_oracle_linux",
"versao_schema": "1.0",
"fonte_dados": {
"arquivo_csv": "syslog_oracle_linux_examples.csv",
"mecanismo": "RAG",
"modelo_destino": "Llama 4",
"campos_csv": [
"id",
"timestamp",
"host",
"facility",
"severity",
"process",
"pid",
"oracle_instance",
"message",
"raw_syslog"
]
},
"classificacao_evento": {
"nivel_risco": "Baixo|Medio|Alto|Critico",
"severidade_syslog": "info|notice|warning|err|crit",
"categoria": "Banco de dados|Sistema operacional|Rede|Storage|Seguranca|Backup|Data Guard|RAC|Autenticacao",
"impacto_potencial": "Descrever impacto operacional provavel",
"estado": "Informativo|Em investigacao|Acao requerida|Escalado|Resolvido"
},
"resumo_executivo": {
"descricao": "Resumo em 2 a 4 frases do evento ou alarme analisado",
"ativo_afetado": {
"host": "Nome do servidor afetado",
"oracle_instance": "Instancia Oracle afetada",
"processo": "Processo principal relacionado ao evento"
},
"risco_operacional": "Descricao objetiva do risco",
"recomendacao_curta": "Acao recomendada em uma frase"
},
"evidencias_syslog": [
{
"id": 0,
"timestamp": "YYYY-MM-DDTHH:MM:SS-03:00",
"host": "host_origem",
"facility": "facility_syslog",
"severity": "severity_syslog",
"process": "processo_origem",
"pid": 0,
"oracle_instance": "instancia_oracle",
"message": "mensagem_normalizada",
"raw_syslog": "linha_syslog_original",
"relevancia": "Alta|Media|Baixa"
}
],
"interpretacao_operacional": {
"fato_observado": "O que foi observado diretamente no Syslog",
"inferencia": "Interpretacao operacional baseada nas evidencias",
"possivel_causa": "Hipotese provavel, sem declarar causa raiz definitiva sem evidencia",
"sequencia_eventos": "Evento isolado, sequencia de falha, recuperacao ou recorrencia",
"recorrencia": "Isolado|Recorrente|Sequencia de falha|Recuperacao|Indeterminado"
},
"acoes_recomendadas": {
"imediatas": [
{
"prioridade": 1,
"acao": "Acao imediata recomendada",
"objetivo": "Resultado esperado da acao",
"responsavel_sugerido": "Operacao N1|Operacao N2|DBA Oracle|Linux/Infraestrutura|Storage|Redes|Seguranca|Sustentacao de Aplicacao|Gestao de Crise"
}
]
}';
SELECT json_object(
'ID_1' VALUE a."ID_1",
'ID' VALUE a."ID",
'TIMESTAMP' VALUE a."TIMESTAMP",
'HOST' VALUE a."HOST",
'FACILITY' VALUE a."FACILITY",
'SEVERITY' VALUE a."SEVERITY",
'PROCESS' VALUE a."PROCESS",
'PID' VALUE a."PID",
'ORACLE_INSTANCE' VALUE a."ORACLE_INSTANCE",
'MESSAGE' VALUE a."MESSAGE",
'RAW_SYSLOG' VALUE a."RAW_SYSLOG"
) AS my_json
INTO v_customer_data
FROM "TB_26AI_TECH_SYS" a
WHERE rowid = p_rowid;
v_response := FNC_26ai_rag( p_ai_prompt => v_pre_prompt || '. Dados: ' || v_customer_data,
p_oci_cred => p_oci_cred,
p_comp => p_comp
);
UPDATE TB_26AI_TECH_SYS
SET insight_report = v_response,
insight_json = v_json
WHERE rowid = p_rowid;
END IF;
IF length(v_response) > 0 THEN
-- vetorizacao do relatorio gerado
INSERT INTO TB_26AI_TECH_VECTOR
SELECT et.embed_id,
v_response,
et.embed_vector,
null,
p_rowid,
p_source_type
FROM dual
CROSS JOIN TABLE(
DBMS_VECTOR_CHAIN.UTL_TO_EMBEDDINGS(
( v_response ) ,
json('{ "provider": "ocigenai",
"credential_name": "' || p_oci_cred || '",
"url": "https://inference.generativeai.' || v_genai_region || '.oci.oraclecloud.com/20231130/actions/embedText",
"model": "cohere.embed-v4.0"
}')
)
) t
CROSS JOIN JSON_TABLE(
t.column_value, '$[*]'
COLUMNS (
embed_id NUMBER PATH '$.embed_id',
text_chunk VARCHAR2(4000) PATH '$.embed_data',
embed_vector CLOB PATH '$.embed_vector'
)
) AS et;
PRC_26AI_TECH_LOG(
p_calling_object => 'PRC_26AI_TECH',
p_operation => 'EMBEDDING',
p_status => 'OK',
p_source_type => p_source_type,
p_source_id => p_rowid,
p_provider => 'ocigenai',
p_model_name => 'cohere.embed-v4.0',
p_prompt_chars => LENGTH(v_response)
);
END IF;
PRC_26AI_TECH_LOG(
p_calling_object => 'PRC_26AI_TECH',
p_operation => 'INSIGHT_PIPELINE',
p_status => 'OK',
p_source_type => p_source_type,
p_source_id => p_rowid
);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
v_error := sqlerrm;
PRC_26AI_TECH_LOG(
p_calling_object => 'PRC_26AI_TECH',
p_operation => 'INSIGHT_PIPELINE',
p_status => 'ERROR',
p_source_type => p_source_type,
p_source_id => p_rowid,
p_error_code => SQLCODE,
p_error_message => v_error
);
-- Antes, o erro tecnico (sqlerrm) era gravado direto em insight_report e
-- ficava visivel pro usuario de negocio no modal. Agora o erro completo
-- vai so pro log (TB_26AI_TECH_LOG); o usuario ve uma mensagem amigavel.
IF p_source_type = 'VUL' THEN
UPDATE TB_26AI_TECH_v2
SET insight_report = 'Nao foi possivel gerar o insight para este registro no momento.',
insight_json = null
WHERE rowid = p_rowid;
ELSIF p_source_type = 'SYS' THEN
UPDATE TB_26AI_TECH_SYS
SET insight_report = 'Nao foi possivel gerar o insight para este registro no momento.',
insight_json = null
WHERE rowid = p_rowid;
END IF;
COMMIT;
END;
/
--------------------------------------------------------------------------------
-- 3) Checkpoint de validação #1 — compilação dos objetos
--------------------------------------------------------------------------------
SELECT object_name, object_type, status
FROM user_objects
WHERE object_name IN ('V_26AI_TECH', 'PRC_26AI_TECH')
ORDER BY object_name;
-- Esperado: as duas linhas com STATUS = 'VALID'.
--------------------------------------------------------------------------------
-- 4) Checkpoint de validação #2 — teste manual, sem gastar chamada de LLM
-- Confirma que os campos novos chegam até a view, num registro qualquer
-- que já tenha as colunas novas preenchidas (pode dar tudo NULL se ainda
-- não recarregou dado nenhum com o Tenable/ServiceNow novos — normal,
-- só confirma que a COLUNA existe e é lida, não que tem dado).
--------------------------------------------------------------------------------
SELECT cid, asset_name, definition_cve, definition_solution, sistema_operacional, u_fim_do_suporte
FROM V_26AI_TECH
FETCH FIRST 3 ROWS ONLY;

Binary file not shown.

Binary file not shown.