From e25fd93bf8a2d1753bd577ef28004b05feccb3e5 Mon Sep 17 00:00:00 2001 From: Antonio Sergio Rodrigues Figueiredo Date: Wed, 9 Sep 2026 14:55:17 -0300 Subject: [PATCH] =?UTF-8?q?Passo=202=20v2.0.0:=20V=5F26AI=5FTECH=20+=20prc?= =?UTF-8?q?=5F26ai=5Ftech=20exp=C3=B5em=20campos=20novos=20ao=20LLM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- TASKS.md | 6 +- sql/04_v2_view_procedure_update.sql | 705 ++++++++++++++++++++++++++++ 2 files changed, 710 insertions(+), 1 deletion(-) create mode 100644 sql/04_v2_view_procedure_update.sql diff --git a/TASKS.md b/TASKS.md index 9cabea1..82dcb08 100644 --- a/TASKS.md +++ b/TASKS.md @@ -33,7 +33,11 @@ teste — a menos que você peça explicitamente o contrário. 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 +- [ ] **Pronto, aguardando você rodar e validar** — `sql/04_v2_view_procedure_update.sql`: + `V_26AI_TECH` ganha as 35 colunas novas (aliases `RAW_JSON_TENABLE`/`RAW_JSON_CMDB` pra não + colidir); `prc_26ai_tech` passa a incluir esses campos no `json_object` enviado ao LLM (só o + ramo `VUL` foi tocado — ramo `SYS`, prompt, vetorização, log e exceção ficam idênticos ao + original). **Depende do Passo 1 já ter rodado no mesmo ambiente.** - [ ] 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, não mexe nas existentes) diff --git a/sql/04_v2_view_procedure_update.sql b/sql/04_v2_view_procedure_update.sql new file mode 100644 index 0000000..f732762 --- /dev/null +++ b/sql/04_v2_view_procedure_update.sql @@ -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;