登录产生服务器错误的命令

日期: 2008-09-11 作者:Karen Morton翻译:April 来源:TechTarget中国 英文

问:我怎样才能够登录造成服务器错误的命令和SQL语句?我有一个触发器,在服务器错误出现后登录了log_error表里的ERROR、TIMESTAMP、USERNAME、OSUSER、MACHINE、PROCESS、PROGRAM。除此之外,我还想登录造成错误的命令和SQL语句。我怎样才能将这一信息合并到触发器里?我尝试了以下的SQL语句获得了SQL文本: select A.username, A.osuser, A.machine, A.process, A.program,B.sql_text    into&n……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

问:我怎样才能够登录造成服务器错误的命令和SQL语句?我有一个触发器,在服务器错误出现后登录了log_error表里的ERROR、TIMESTAMP、USERNAME、OSUSER、MACHINE、PROCESS、PROGRAM。除此之外,我还想登录造成错误的命令和SQL语句。我怎样才能将这一信息合并到触发器里?我尝试了以下的SQL语句获得了SQL文本:


select A.username, A.osuser, A.machine, A.process, A.program,B.sql_text 
  into var_user, var_osuser, var_machine, var_process, 
       var_program, var_sqltext
  from sys.v_$session A,sys.v_$sqlarea B
where A.audsid = userenv(’sessionid’) 
  and B.hash_value = A.sql_hash_value
  and B.address = A.sql_address;
insert into
log_errors_tab(ERROR,TIMESTAMP,USERNAME,OSUSER,MACHINE,
               PROCESS,PROGRAM,SQL_TEXT)
values(dbms_standard.server_error(1),sysdate,var_user,var_osuser,var_machine,var_process,
 var_program,var_sqltext);

  但是这种方法将上面的SQL语句放入表里,但不是错误语句。有没有方法登录引起错误的SQL语句?同样,有没有可能在SQL查询里执行查询的时候知道绑定变量的值?

  答:你代码不能工作的原因就是当你检查v$sesion和v$sqlarea时,你就获取了目前正在执行的语句……而不是SERVERERROR触发器执行的语句。唯一的方法就是获取发生时的语句的内容。1)在目前保参数里执行该语句之前就捕获,这样你就能在SERVERERROR触发器开启时使用它。2)将所有的信息聚集在insert/update/delete触发器里并且“重建”该语句的内容。我不知道捕获具体的、很容易引起错误的SQL语句的方法。

  但是……为了获得该SQL语句的基本内容,您能简单地使用一个或者是多个系统定义事件属性,这些属性只适用于触发器代码。以下是示例:


ora_sysevent = The event that was happening when the error occurred (insert, update, etc) 
ora_dict_obj_name = The name of the object that was being effected (EMP, DEPT, etc) 
ora_dict_obj_type = The type of the object that was being effected (TABLE, VIEW, etc)
 

  你可以查看Oracle文档第13章里《应用程序开发指南——基础》。

  你可以在insert/update/delete触发器里使用系统事件属性来判定什么事情已经完成了,是谁做的以及做这件事的目的。你可以使用新的、旧的触发器变量获取column值。一旦尼获得了SERVERERROR触发器。你就不能访问所有的ora_ values(查看上面的资料里的第13章)。

  或许你需要思考为什么你想登录SQL语句并且尝试其他的方法……如:也许你可以用Oracle的审计功能或者DBMS_APPLICATION_INFO,对模块设置并在v$session里设置作用列次。

翻译

April
April

相关推荐