ユーザー管理キャッシュ・グループの例
ユーザー管理キャッシュ・グループにキャッシュされる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);
この例では、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_customer、sales.ordertab、sales.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);
同じ品目を5つ以上注文したWest地域の顧客のみがキャッシュされます。
western_customersキャッシュ・グループ内の各キャッシュ表には主キーがあります。各子表は、外部キー制約を使用して親表を参照します。sales.active_customerルート表およびsales.orderdetails子表には、それぞれキャッシュされる行を制限するWHERE句が含まれます。sales.active_customerルート表とsales.ordertab子表の両方でPROPAGATEキャッシュ表属性を使用しているため、これらのキャッシュ表にコミットされた変更は、キャッシュされたOracle Database表に自動的に伝播されます。sales.cust_interests子表ではREADONLYキャッシュ表属性を使用しているため、この表は直接更新できません。

