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>
This commit is contained in:
705
sql/04_v2_view_procedure_update.sql
Normal file
705
sql/04_v2_view_procedure_update.sql
Normal 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;
|
||||
Reference in New Issue
Block a user