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