v2.0.0 · Passo 1

Evolução de schema: CVE, CVSS, solução e mais

Promove os campos "Tier 1" do Tenable e do ServiceNow — hoje fora do banco — a colunas novas em TB_26AI_TECH_V2 e TB_26AI_TECH_CMDB, para que o AI Insight consiga citar CVE, pacote afetado e remediação por ativo.

Status: validado em 2026-09-09

Rodado no ambiente AMPMINSIGHTS — checkpoint confirmou STATUS = 'OK' nas duas tabelas (23 e 12 colunas novas, exatamente o esperado). Este passo está confirmado; segue para o capítulo 12.

1. Por que isto era necessário

PRC_26AI_TECH (geração do AI Insight) monta o JSON enviado ao LLM inteiramente a partir da view V_26AI_TECH, que só expõe as colunas que existem em TB_26AI_TECH_V2/TB_26AI_TECH_CMDB. 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.

2. O que foi adicionado

Estratégia híbrida: colunas tipadas para os campos que realmente importam para o "plano de ação" do AI Insight, mais uma coluna RAW_JSON por linha guardando o export completo — assim nada da planilha se perde, mesmo o que não virou coluna tipada.

TabelaColunas novasDestaque
TB_26AI_TECH_V2
(vulnerabilidades Tenable)
23 colunasDEFINITION_CVE, DEFINITION_SOLUTION, DEFINITION_DESCRIPTION, SOFTWARE_VULNS, DEFINITION_CVSS3_BASE_SCORE, DEFINITION_EPSS_SCORE, CISA_KEV_FLAG, RAW_JSON
TB_26AI_TECH_CMDB
(CMDB ServiceNow)
12 colunasU_FIM_DO_SUPORTE (EOL), ATTESTATION_SCORE/_STATUS, INSTALL_STATUS, RAW_JSON
100% aditivo — nenhum DROP

Todas as colunas são novas e NULLable. 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.

3. Script

Arquivo completo: sql/03_v2_ddl_schema_evolution.sql no repositório. Resumo do que ele faz:

sql/03_v2_ddl_schema_evolution.sql (resumo)
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
);

O arquivo real tem, além disso, o ANNOTATIONS("LLM_DESCRIPTION_PT_BR" ...) 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.

4. Como rodar

  1. Abra Database Actions (ou SQL Developer/SQLcl) conectado como o schema AMPMINSIGHTS — nunca como ADMIN.
  2. Confirme que está no ambiente correto antes de rodar (o script tem um aviso explícito sobre isso no topo).
  3. Cole e rode sql/03_v2_ddl_schema_evolution.sql inteiro, de uma vez — é idempotente, pode rodar de novo sem erro se uma coluna já existir.

5. Validação

O próprio script termina com este checkpoint — rode e confira STATUS = 'OK' nas duas linhas:

Checkpoint de validação
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)
Rollback, se precisar desfazer

Todas as colunas são novas e nullable — para desfazer, um ALTER TABLE ... DROP COLUMN por coluna adicionada (lista completa no final do script). Nenhum dado existente é afetado ao reverter.