Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 » SQL Remote » SQL Remote システムの管理 » レプリケーションエラーのレポートと処理 » エラー処理プロシージャのレプリケーション

 

電子メールによるリモートデータベースのエラーに関する通知の受信

リモートデータベースでエラーが発生したときに電子メールによる通知を送信します。電子メールまたはページングシステムを使用して、通知を受信できます。

前提条件

この作業を実行するための前提条件はありません。

 ♦ タスク
  1. Sybase Central で、SQL Anywhere 16 プラグインを使用し、ユーザ Cons として統合データベースに接続します。

  2. エラーが発生したことを電子メールで DBA ユーザに通知するストアドプロシージャを作成します。

    たとえば、次の文を実行して sp_LogReplicationError プロシージャを作成します。



    CREATE PROCEDURE cons.sp_LogReplicationError
     ( IN error_text LONG VARCHAR )
    BEGIN
     DECLARE current_remote_user CHAR( 255 );
     SET current_remote_user = CURRENT REMOTE USER;
     // Log the error
     INSERT INTO cons.replication_audit
      ( remoteuser, errormsg )
     VALUES
      ( current_remote_user, error_text );
     COMMIT WORK;
     //Now notify the DBA by email that an error has occurred
     // on the consolidated database. The email should contain the error
     // strings that the SQL Remote Message Agent is passing to the procedure. 
     IF CURRENT PUBLISHER = 'cons' THEN
      CALL sp_notify_DBA( error_text );
     END IF
    END;
  3. 電子メールの送信を管理するストアドプロシージャを作成します。

    たとえば、次の文を実行して sp_notifiy_DBA プロシージャを作成します。



    CREATE PROCEDURE sp_notify_DBA( in msg long varchar)
    BEGIN
     DECLARE rc INTEGER;
     rc=call xp_startmail( mail_user='davidf' );
     //If successful logon to mail
     IF rc=0 THEN
     rc=call xp_sendmail(
       recipient='Doe, John; Smith, Elton',
       subject='SQL Remote Error',
       "message"=msg);
     //If mail sent successfully, stop
      IF rc=0 THEN
       call xp_stopmail()
      END IF
     END IF
    END;
  4. エラーの発生を電子メールで DBA に通知するプロシージャを呼び出す replication_error データベースオプションを設定します。

    たとえば、次の文を実行して、エラーの発生時に sp_LogReplicationError プロシージャを呼び出します。

    SET OPTION PUBLIC.replication_error =
     'cons.sp_LogReplicationError';
  5. 監査テーブルを作成します。

    たとえば、次の文を実行して replication_audit テーブルを作成します。

    CREATE TABLE replication_audit (
     id   INTEGER DEFAULT AUTOINCREMENT,
     pub  CHAR(30) DEFAULT CURRENT PUBLISHER,
     remoteuser CHAR(30),
     errormsg LONG VARCHAR,
     timestamp  DATETIME DEFAULT CURRENT TIMESTAMP,
     PRIMARY KEY (id,pub)
    );

    次の表は、replication_audit テーブルのカラムを示します。

    カラム 説明
    pub データベースの現在のパブリッシャ (パブリッシャが挿入されたデータベースを識別する)。
    remoteuser メッセージを適用しているリモートユーザ (リモートユーザのデータベースを識別する)。
    errormsg replication_error プロシージャに渡されたエラーメッセージ。
  6. プロシージャをテストします。

    たとえば、リモートデータベースのローと同じプライマリキーを使用するローを統合データベースに挿入します。このローが統合データベースからリモートデータベースにレプリケートされると、プライマリキーの競合エラーが発生し、次の処理が実行されます。

    • リモートデータベースの SQL Remote Message Agent (dbremote) が、その出力ログに次のメッセージを出力する。

      "cons" (0-0000000000-0) メッセージを受信しました。 
      SQL 文が失敗しました:(-193) テーブル 'reptable' のプライマリキーがユニークではありません。 
      INSERT INTO cons.reptable(id,text,last_contact) 
      VALUES (2,'dave','1997/apr/21 16:02:38.325') 
      COMMIT WORK
    • 統合データベースに次の INSERT 文が送信される。



      INSERT INTO cons.replication_audit
       ( id,
         pub,
         remoteuser,
         errormsg,
         "timestamp")
      VALUES
       ( 1,
        'cons',
        'sales',
        'primary key for table ''reptable'' is not unique (-193)',
        '1997/apr/21 16:03:13.836');
      COMMIT WORK;
    • 次のメッセージを含む電子メールが John Doe と Elton Smith に送信される。

      primary key for table 'reptable' is not unique (-193) 
      INSERT INTO cons.reptable( id,text,last_contact )
                  VALUES (2,'dave','1997/apr/21 16:02:52.605')

結果

リモートデータベースでエラーが発生すると、電子メール通知が送信されます。

 参照