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 システムの作成 » 重複プライマリキーエラー » プライマリキープール

 

キープールのプライマリキーの使用

リモートユーザが新しい顧客を追加すると、プライマリキーがリモートユーザの使用可能なプライマリキーのプールから取り出されます。

前提条件

事前にプライマリキープールテーブルが作成されている必要があります。

 ♦ タスク

営業担当者が Customers テーブルに新しく顧客を追加する場合、挿入するプライマリキー値は、ストアドプロシージャを使用して取得します。次の例では、プライマリキー値を提供するストアドプロシージャと、挿入を実行するストアドプロシージャを使用します。

  1. リモートデータベース上で実行するプロシージャを作成して、プライマリキープールテーブルからプライマリキーを取得します。

    たとえば、NewKey プロシージャは、キープールにある整数値を提供し、プールからその値を削除します。



    CREATE PROCEDURE NewKey(
          IN @table_name VARCHAR(40),
          OUT @value INTEGER )
    BEGIN
       DECLARE NumValues INTEGER;
       
       SELECT COUNT(*), MIN(value)
       INTO NumValues, @value
             FROM KeyPool
             WHERE table_name = @table_name
             AND location = CURRENT PUBLISHER;
       IF NumValues > 1 THEN
          DELETE FROM KeyPool
          WHERE table_name = @table_name
          AND value = @value;
       ELSE
       // Never take the last value, because
       // ReplenishPool will not work.
       // The key pool should be kept large enough
       // that this never happens.
          SET @value = NULL;
       END IF;
    END;

    NewKey プロシージャは、営業担当者の識別子がリモートデータベースの CURRENT PUBLISHER であることを利用します。

  2. リモートデータベース上で実行するプロシージャを作成して、サブスクライブされたテーブルに新しいローを挿入します。

    たとえば、NewCustomers プロシージャは、プライマリキーを構成する NewKey が取得した値を使用して、テーブルに新しい顧客を挿入します。



    CREATE PROCEDURE NewCustomers(
          IN customer_name CHAR( 40 ) )
    BEGIN
       DECLARE new_cust_key INTEGER ;
       CALL NewKey( 'Customers', new_cust_key );
       INSERT
       INTO Customers (
          cust_key,
          name,
          location
          )
       VALUES (
          'Customers ' ||
          CONVERT (CHAR(3), new_cust_key),
          customer_name,
          CURRENT PUBLISHER
          );
    END

    NewKey から取得される new_cust_key 値をテストしてこの値が NULL でないことを確認し、値が NULL の場合には挿入しないように、プロシージャを強化できます。

結果

プライマリキーが設定されます。