6

データベース内のすべてのエラーをテーブルに記録しようとしています。したがって、ユーザー sys として、次のコードを書きました。

CREATE TABLE servererror_log (
    error_datetime  TIMESTAMP,
    error_user      VARCHAR2(30),
    db_name         VARCHAR2(9),
    error_stack     VARCHAR2(2000),
    captured_sql    VARCHAR2(1000));
/
CREATE OR REPLACE TRIGGER log_server_errors
AFTER SERVERERROR
ON DATABASE
DECLARE
 captured_sql VARCHAR2(1000);
BEGIN
  SELECT q.sql_text
  INTO captured_sql
  FROM gv$sql q, gv$sql_cursor c, gv$session s
  WHERE s.audsid = audsid
  AND s.prev_sql_addr = q.address
  AND q.address = c.parent_handle;

  INSERT INTO servererror_log
  (error_datetime, error_user, db_name,
   error_stack, captured_sql)
  VALUES
  (systimestamp, sys.login_user, sys.database_name,
  dbms_utility.format_error_stack, captured_sql);
END log_server_errors;

しかし、存在しないテーブルから選択しようとするようなエラーを強制すると、テーブルにエラーが記録されません。

トリガーがまったく起動していることを確認する方法はありますか? また、そこに挿入するテストテーブルを作成しようとしましたが、トリガーを自律型トランザクションとして定義し、トリガー内でコミットしても機能しません。

ありがとう、ホアキン

4

4 に答える 4

3

v$sql を照会しないでください。ora_sql_txt を使用してステートメントを取得します。

CREATE OR REPLACE TRIGGER log_server_errors
AFTER SERVERERROR
ON DATABASE
DECLARE
sql_text ora_name_list_t;
stmt clob;
n number;
BEGIN
  n := ora_sql_txt(sql_text);
  if n > 1000 then n:= 1000; end if ;
  FOR i IN 1..n LOOP
     stmt := stmt || sql_text(i);
   END LOOP;

   INSERT INTO servererror_log
   (error_datetime, error_user, db_name,
    error_stack, captured_sql)
   VALUES
   (systimestamp, sys.login_user, sys.database_name,
   dbms_utility.format_error_stack, stmt);
   commit;
 END log_server_errors;
 /

それで:

SQL> select * from c;

これにより、次が生成されます。

select * from c
              *
ERROR at line 1:
ORA-00942: table or view does not exist

それを照会できるようになりました:

select * from servererror_log;

生産するには:

ERROR_DATETIME
---------------------------------------------------------------------------
ERROR_USER                     DB_NAME
------------------------------ ---------
ERROR_STACK
--------------------------------------------------------------------------------
CAPTURED_SQL
--------------------------------------------------------------------------------
11-FEB-09 02.55.35.591259 PM
SYS                            TS.WORLD
ORA-00942: table or view does not exist
select * from c
于 2009-02-11T12:59:02.517 に答える
1

トリガーが起動しているかどうかを確認するには、次のように 1 つまたは複数の行を追加します。

DBMS_OUTPUT.PUT_LINE( 'Got this far' );

SQLPlus では、SET SERVEROUTPUT ON を実行してから、エラーを生成するコマンドを実行します。次のような出力が得られるはずです。

dev> select * from aldfjh;
select * from aldfjh
              *
ERROR at line 1:
ORA-00942: table or view does not exist


ORA-00942: table or view does not exist

Got this far
于 2009-02-17T20:51:28.060 に答える
0

以下を使用して、トリガーのステータスおよび/または他のトリガーの存在を確認します。

select trigger_name, status
from all_triggers
where triggering_event like 'ERROR%' 

これにより、次のようになります。

TRIGGER_NAME        STATUS
------------        -------
LOG_SERVER_ERRORS   ENABLED

トリガーが有効になっていないか、別のトリガーが失敗した場合、おそらく機能しません。

于 2009-02-16T21:35:51.033 に答える