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.
Este capítulo documenta um passo já implementado no script (sql/03_v2_ddl_schema_evolution.sql), mas ainda não confirmado em nenhum ambiente. Não use este passo como procedimento definitivo até a seção 5 (Validação) ter sido de fato executada e conferida.
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.
| Tabela | Colunas novas | Destaque |
|---|---|---|
TB_26AI_TECH_V2(vulnerabilidades Tenable) | 23 colunas | DEFINITION_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 colunas | U_FIM_DO_SUPORTE (EOL), ATTESTATION_SCORE/_STATUS, INSTALL_STATUS, RAW_JSON |
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:
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
- Abra Database Actions (ou SQL Developer/SQLcl) conectado como o schema
AMPMINSIGHTS— nunca comoADMIN. - Confirme que está no ambiente correto antes de rodar (o script tem um aviso explícito sobre isso no topo).
- Cole e rode
sql/03_v2_ddl_schema_evolution.sqlinteiro, 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:
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)
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.