ユーザー管理キャッシュ・グループの例

ユーザー管理キャッシュ・グループにキャッシュされるOracle Database表の定義の例を示します。

Oracle Databaseの場合:

これらのOracle Database表は、スキーマ・ユーザーsalesが所有しています。

CREATE TABLE active_customer
 (custid NUMBER(6) NOT NULL PRIMARY KEY,
  name   VARCHAR2(50),
  addr   VARCHAR2(100),
  zip    VARCHAR2(12),
  region VARCHAR2(12) DEFAULT 'Unknown');

CREATE TABLE ordertab
 (orderid NUMBER(10) NOT NULL PRIMARY KEY,
  custid  NUMBER(6) NOT NULL);

CREATE TABLE cust_interests
 (custid   NUMBER(6) NOT NULL,
  interest VARCHAR2(10) NOT NULL,
  PRIMARY KEY (custid, interest));

CREATE TABLE orderdetails
 (orderid  NUMBER(10) NOT NULL,
  itemid   NUMBER(8) NOT NULL,
  quantity NUMBER(4) NOT NULL,
  PRIMARY KEY (orderid, itemid));

Oracleキャッシュ管理ユーザーには、すべてのキャッシュされた表に対してSELECT権限が付与されている必要があります。この例では、表はsales.active_customer表です。

Oracle Databaseで、管理者として次の権限を付与します:

SQL> GRANT SELECT ON sales.active_customer TO cacheadmin;

TimesTenデータベースの場合:

TimesTenキャッシュ管理ユーザーとして接続します。ユーザー管理キャッシュ・グループを作成するには、CREATE USERMANAGED CACHE GROUP文を使用します。

次の文では、図4-8に示すように、sales.active_customer表をキャッシュするユーザー管理キャッシュ・グループupdate_anywhere_customersが作成されます:

CREATE USERMANAGED CACHE GROUP update_anywhere_customers
AUTOREFRESH MODE INCREMENTAL INTERVAL 30 SECONDS
FROM sales.active_customer
 (custid NUMBER(6) NOT NULL,
  name   VARCHAR2(50),
  addr   VARCHAR2(100),
  zip    VARCHAR2(12),
  PRIMARY KEY(custid),
  PROPAGATE);

図4-8 単一表のユーザー管理キャッシュ・グループ

図4-8の説明が続きます。
「図4-8 単一表のユーザー管理キャッシュ・グループ」の説明

この例では、sales.active_customer表のregion以外の列はすべてTimesTenにキャッシュされます。これはPROPAGATEキャッシュ表属性で定義されるため、TimesTenのキャッシュ表sales.active_customerにコミットされた更新は、キャッシュされたOracle Database表sales.active_customerに送信されます。ユーザー管理キャッシュ表もAUTOREFRESHキャッシュ属性で定義されるため、Oracle Database表sales.active_customerにコミットされた変更はすべて、キャッシュ表update_anywhere_customersに送信されます。

この例では、AUTOREFRESHキャッシュ・グループ属性は、キャッシュされたOracle Database表sales.active_customerにコミットされた変更が、TimesTenのsales.active_customer cache表に30秒ごとに自動的にリフレッシュされるように指定します。

「initCacheAdminSchema.sqlスクリプト」の説明に従って、AUTOREFRESH MODE INCREMENTALキャッシュ・グループ属性を使用するユーザー管理キャッシュ・グループの定義済動作を実行するために使用されるOracle Databaseオブジェクトを手動で作成した場合は、キャッシュ・グループの作成時に、自動リフレッシュ状態をOFFに設定する必要があります。

次に、ttIsqlユーティリティのcachesqlgetコマンドを実行して、ユーザー管理キャッシュ・グループにキャッシュされるOracle Database表ごとに、Oracle Database内にログ表およびトリガーを作成するSQL*Plusスクリプトを生成する必要があります。

「自動リフレッシュを使用したキャッシュ・グループ用のOracle Databaseオブジェクトの手動作成」を参照してください。

次の文では、図4-9に示すように、sales.active_customersales.ordertabsales.cust_interestsおよびsales.orderdetailsの各表をキャッシュする複数表のユーザー管理キャッシュ・グループwestern_customersが作成されます:

CREATE USERMANAGED CACHE GROUP western_customers
FROM sales.active_customer
 (custid NUMBER(6) NOT NULL,
  name   VARCHAR2(50),
  addr   VARCHAR2(100),
  zip    VARCHAR2(12),
  region VARCHAR2(12),
  PRIMARY KEY(custid),
  PROPAGATE)
  WHERE (sales.active_customer.region = 'West'),
sales.ordertab
 (orderid NUMBER(10) NOT NULL,
  custid  NUMBER(6) NOT NULL,
  PRIMARY KEY(orderid),
  FOREIGN KEY(custid) REFERENCES sales.active_customer(custid),
  PROPAGATE),
sales.cust_interests
 (custid   NUMBER(6) NOT NULL,
  interest VARCHAR2(10) NOT NULL,
  PRIMARY KEY(custid, interest),
  FOREIGN KEY(custid) REFERENCES sales.active_customer(custid),
  READONLY),
sales.orderdetails
 (orderid  NUMBER(10) NOT NULL,
  itemid   NUMBER(8) NOT NULL,
  quantity NUMBER(4) NOT NULL,
  PRIMARY KEY(orderid, itemid),
  FOREIGN KEY(orderid) REFERENCES sales.ordertab(orderid))
  WHERE (sales.orderdetails.quantity >= 5);

図4-9 複数表のユーザー管理キャッシュ・グループ

図4-9の説明が続きます。
「図4-9 複数表のユーザー管理キャッシュ・グループ」の説明

同じ品目を5つ以上注文したWest地域の顧客のみがキャッシュされます。

western_customersキャッシュ・グループ内の各キャッシュ表には主キーがあります。各子表は、外部キー制約を使用して親表を参照します。sales.active_customerルート表およびsales.orderdetails子表には、それぞれキャッシュされる行を制限するWHERE句が含まれます。sales.active_customerルート表とsales.ordertab子表の両方でPROPAGATEキャッシュ表属性を使用しているため、これらのキャッシュ表にコミットされた変更は、キャッシュされたOracle Database表に自動的に伝播されます。sales.cust_interests子表ではREADONLYキャッシュ表属性を使用しているため、この表は直接更新できません。