From d37140b36b23c3b790294eb3e9b728a6a0147c98 Mon Sep 17 00:00:00 2001 From: Antonio Sergio Rodrigues Figueiredo Date: Wed, 9 Sep 2026 14:42:01 -0300 Subject: [PATCH] =?UTF-8?q?Passo=201=20v2.0.0:=20DDL=20aditivo=20(ALTER=20?= =?UTF-8?q?TABLE=20+=20RAW=5FJSON),=20pronto=20p/=20valida=C3=A7=C3=A3o=20?= =?UTF-8?q?do=20usu=C3=A1rio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- TASKS.md | 15 ++- sql/03_v2_ddl_schema_evolution.sql | 178 +++++++++++++++++++++++++++++ 2 files changed, 190 insertions(+), 3 deletions(-) create mode 100644 sql/03_v2_ddl_schema_evolution.sql diff --git a/TASKS.md b/TASKS.md index f9e7bb3..9cabea1 100644 --- a/TASKS.md +++ b/TASKS.md @@ -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,9 +28,11 @@ 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` +- [ ] **Pronto, aguardando você rodar e validar** — `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), com checkpoint de + validação embutido no próprio script. **Pendência antes de rodar:** decidir em qual ambiente + (o atual está marcado como intocável — ver seção "Ponto de partida" acima). - [ ] 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`) - [ ] Pipeline de staging: bucket → `TB_26AI_TECH_V2_STG` via `DBMS_CLOUD.COPY_DATA` (tabela nova, diff --git a/sql/03_v2_ddl_schema_evolution.sql b/sql/03_v2_ddl_schema_evolution.sql new file mode 100644 index 0000000..c76bd33 --- /dev/null +++ b/sql/03_v2_ddl_schema_evolution.sql @@ -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