-------------------------------------------------------------------------------- -- 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