sql >> データベース >  >> RDS >> Oracle

Oracleでアフターサーバートリガーを開発するにはどうすればよいですか?

    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
    


    1. 12cIDENTITY列

    2. docker-composeでローカルMySQLサーバーに接続できません

    3. XAMPP-MySQLが予期せずシャットダウンしました

    4. なぜこれがリソースID#2を返すのですか?