当前位置: 首页 > news >正文

Oracle 实现对全局错误语句的审计监控 ORA- alert

--将所有数据库ora-错误写入表

create table error_tab (username varchar2(4000), d_current_nr_error varchar2(4000), ora_server_error_msg varchar2(4000), full_text varchar2(4000),errdate date);

create or replace trigger error_trigger

after servererror on database

declare

n number;

full_text varchar2(4000);

sql_text ora_name_list_t;

d_current_nr_error number := ora_server_error(1);

ora_server_error_msg varchar2(100);

date1 date;

begin

n := ora_sql_txt(sql_text);

ora_server_error_msg := SQLERRM(-d_current_nr_error);

FOR i IN 1 .. n LOOP

full_text := full_text || sql_text(i);

END LOOP;

insert into error_tab

values

(user, d_current_nr_error, ora_server_error_msg, full_text,sysdate);

end;

-----将指定的错误写入alert log

CREATE OR REPLACE TRIGGER logon_denied_to_alert

AFTER servererror ON DATABASE

DECLARE

message VARCHAR2(168);

ip VARCHAR2(15);

v_os_user VARCHAR2(80);

v_module VARCHAR2(50);

v_action VARCHAR2(50);

v_pid VARCHAR2(10);

v_sid NUMBER;

v_program VARCHAR2(48);

BEGIN

IF (ora_is_servererror(1722)) THEN

-- get ip FOR remote connections :

IF upper(sys_context('userenv', 'network_protocol')) = 'TCP' THEN

ip := sys_context('userenv', 'ip_address');

END IF;

SELECT sid INTO v_sid FROM sys.v_$mystat WHERE rownum < 2;

SELECT p.spid, v.program

INTO v_pid, v_program

FROM v$process p, v$session v

WHERE p.addr = v.paddr

AND v.sid = v_sid;

v_os_user := sys_context('userenv', 'os_user');

dbms_application_info.read_module(v_module, v_action);

message := to_char(SYSDATE, 'YYYYMMDD HH24MISS') ||

' logon denied from ' || nvl(ip, 'localhost') || ' ' ||

v_pid || ' ' || v_os_user || ' with ' || v_program || ' – ' ||

v_module || ' ' || v_action;

sys.dbms_system.ksdwrt(2, message);

END IF;

END;

一个sql查询语句报ORA-01722

要避免这些问题,要做到在写sql语句时就好认真处理好不同类型的问题。

比如如果要比较的话,同时都用to_number强制转换(to_number(字段a) = to_number(字段b)),

或者同时转换为字符串类型(字段a||'' = 字段b||'',都连接一个空字符串使之变成字符串类型)。

on d.loc = to_char(c.cid)

今天一个开发人员说一个很普通的sql语句提示ORA-01722:invalid number,该sql语句为

select to_number(paraid,'xxxxxxxxxx') paraid,sortid,dataid from scpparsereg;一个很简单的sql语句,开发人员说使用pl/sql显示全部记录时到第1000条时报这个错误,那证明前999条记录显示是正常的,整个sql语句就一个简单得不能再简单的sql语句,其中能出问题的就是使用了一个转换函数to_number,于是使用desc scpparsereg中显示表结构,发现paraid是个char(8)的数据类型,怀疑可能是字符不够自动补空格,然后在此情况下进行转换时报错,接着通过select distinct length(trim(paraid)) from scpparsereg

该sql语句得到了答案:

1* select distinct lengthb(trim(parseid)) from scpparsereg

idle> /

LENGTHB(TRIM(PARSEID))

----------------------

8

7

从以上结果就可以断定是由于空格转换成数字时发生该错误。

http://www.lryc.cn/news/35712.html

相关文章:

  • React解决样式冲突问题的方法
  • Go项目(用户操作微服务)
  • Spring Boot统一功能处理
  • ETCD多次出现CONTEXT DEADLINE EXCEEDED
  • git 提交 多人开发避免冲突
  • 求职复盘:干了四年外包出来,面试5次全挂
  • AXI总线核心解读---基于官方文档
  • 【Linux修炼】15.进程间通信
  • 每天一道大厂SQL题【Day15】微众银行真题实战(五)
  • 如何优化查询大数据量的表
  • 卷麻了,00后Jmeter用的比我还熟练,简直没脸见人......
  • 力扣-树节点
  • MySQL8启动错误“Neither found #innodb_redo subdirectory, nor ib_logfile* files”
  • JVM系列——详细说明Volatile,原子性/可见性,先行发生原则
  • ArcGIS:栅格计算器的运算符和函数详解
  • spring的beanfactory与applicationContext的区别以及继承关系
  • 分享一个 hive on spark 模式下使用 HikariCP 数据库连接池造成的资源泄露问题
  • MySQL 行锁
  • 成为AI架构师的三大能力
  • 博客系统 实现 (前端 + 后端 )代码
  • C语言:如何在cmd命令窗口上玩贪吃蛇游戏
  • Flutter-自定义图标
  • 教学场景应用视频试看预览功能
  • 关于进程与进程调度
  • Redis常用命令及数据类型参数
  • (七十四)大白话深入探索多表关联的SQL语句到底是如何执行的?(2)
  • 销售使用CRM系统集成Excel的五个技巧
  • 过来人告诉你:Java学到什么程度可以找工作?
  • 【Linux】目录结构
  • 37.Java进阶之实现动态编译