ユーザー管理キャッシュ・グループの例
ユーザー管理キャッシュ・グループにキャッシュされる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キャッシュ表属性を使用しているため、この表は直接更新できません。