6 SQL文
この章では、TimesTenで使用可能なSQL文について説明します。
通常、SQL文とはデータ操作言語(DML)文またはデータ定義言語(DDL)文のいずれかです。
DML文はデータベース・オブジェクトを変更します。DML文の例として、INSERT
、UPDATE
およびDELETE
があげられます。SELECT
文は、1つ以上の表またはビューからデータを取得します。
DDL文はデータベース・スキーマを変更します。DDL文の例として、CREATE TABLE
およびDROP TABLE
があげられます。
この章には、すべての文のアルファベット順のリストに加えて、次の項が含まれています。
TimesTenでサポートされているSQL文の概要
表6-1に、TimesTenでのSQL文の概要を示します。2列目は、文がTimesTen Scaleoutでサポートされているかどうかを示します。ALTER SEQUENCE
を除くすべての文は、TimesTen Classicでサポートされています。
表6-1 TimesTenでサポートされているSQL文
SQL文 | TimesTen Scaleoutでのサポート |
---|---|
いいえ |
|
はい |
|
いいえ |
|
いいえ |
|
はい |
|
いいえ |
|
いいえ |
|
はい TimesTen Classicではサポートされていません。 |
|
はい |
|
はい サポートされていない句: エージングおよび列ベースの圧縮 サポートされていないデータ型: LOB列は表ではサポートされません。LOB変数はPL/SQLプログラムでサポートされます。 |
|
はい |
|
はい |
|
はい |
|
いいえ |
|
はい(増分自動リフレッシュを使用する静的読取り専用) |
|
はい |
|
はい |
|
はい(制限付き) |
|
はい |
|
はい |
|
はい |
|
はい |
|
いいえ |
|
TimesTen Scaleoutの特定の |
|
はい |
|
あり( サポートされていない句: エージングおよび列ベースの圧縮 サポートされていないデータ型: LOBおよび 分散句はグローバル一時表でサポートされていません。 |
|
はい |
|
はい |
|
はい |
|
いいえ |
|
はい(増分自動リフレッシュを使用する静的読取り専用キャッシュ・グループ) |
|
はい |
|
はい |
|
はい |
|
はい |
|
はい |
|
はい |
|
いいえ |
|
はい |
|
はい |
|
はい |
|
はい |
|
はい |
|
いいえ |
|
はい |
|
はい |
|
はい |
|
はい(増分自動リフレッシュを使用する静的読取り専用キャッシュ・グループ) |
|
いいえ |
|
はい(増分自動リフレッシュを使用する静的読取り専用キャッシュ・グループ) |
|
はい |
|
はい |
|
はい |
|
あり。ただし、 |
|
はい(増分自動リフレッシュを使用する静的読取り専用キャッシュ・グループ) |
|
はい |
SQL文内のコメント
文内のキーワード、パラメータまたは句読点の間に、コメントを表示できます。次の2通りの方法で、文内にコメントを含めることができます。
-
スラッシュとアスタリスク(
/*
)を使用してコメントを開始します。この後にコメントのテキストを続けます。テキストは複数行にまたがってもかまいません。アスタリスクとスラッシュ(*/
)を使用してコメントを終了します。開始文字と終了文字は、空白や改行によってテキストから切り離す必要はありません。 -
ハイフン2個(
--
)を使用してコメントを開始します。この後にコメントのテキストを続けます。テキストは1行しか使用できません。コメントの最後に改行を使用します。
オプティマイザ・ヒント
オプティマイザ・ヒントは、TimesTenの問合せオプティマイザに渡される命令です。問合せに対して最適な実行計画を選択するとき、オプティマイザではこれらのヒントが考慮されます。ほとんどのヒントは、TimesTen ScaleoutでもTimesTen Classicでもサポートされています。TimesTen Scaleoutでのみサポートされているヒントもあります。詳細は、「TimesTen Scaleoutでのみサポートされているオプティマイザ・ヒント」を参照してください。
TimesTenでは、次の3つのレベルのオプティマイザ・ヒントをサポートしています。
-
文レベルのオプティマイザ・ヒント: 指定した場合、オプティマイザは、特定の文に関するヒントを考慮します。詳細は、「文レベルのオプティマイザ・ヒント」を参照してください。
-
トランザクション・レベルのオプティマイザ・ヒント: (適切な組込みプロシージャのコールによって)指定した場合、オプティマイザは、トランザクション全体に関するヒントを考慮します。『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のオプティマイザ・ヒントを使用した実行計画の変更に関する項を参照してください。
-
接続レベルのオプティマイザ・ヒント: 指定した場合、オプティマイザは、接続全体に関するヒントを考慮します。詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のオプティマイザ・ヒントを使用した実行計画の変更に関する項および『Oracle TimesTen In-Memory Databaseリファレンス』のOptimizerHintに関する項を参照してください。
オプティマイザ・ヒントの優先順位は、文レベルのヒント、トランザクション・レベルのヒント、および接続レベルのヒントとなります。表6-2に、文、トランザクションおよび接続レベルのオプティマイザ・ヒントの概要を示します。
表6-2 文、トランザクションおよび接続レベルのオプティマイザ・ヒントの概要
文レベルのオプティマイザ・ヒント | トランザクション・レベルのオプティマイザ・ヒント | 接続レベルのオプティマイザ・ヒント |
---|---|---|
ヒントは、コメント構文内およびSQL文の |
ヒントは、 |
ヒントは、 |
ヒントはSQL文を範囲とします。 |
ヒントはトランザクションを範囲とします。 |
ヒントは接続を範囲とします。 |
|
|
|
オプティマイザは、文に対してのみヒントを考慮します。 |
オプティマイザは、トランザクションのすべての文に対してヒントを考慮します。 |
オプティマイザは、接続のすべての文に対してヒントを考慮します。 |
ヒントは、 |
ヒントは |
ヒントは |
トランザクション・レベルのオプティマイザ・ヒントまたは接続レベルのオプティマイザ・ヒントが指定されたトランザクションで文レベルのオプティマイザ・ヒントを指定すると、そのヒントは、SQL文のトランザクション・レベルのヒントまたは接続レベルのオプティマイザ・ヒントをオーバーライドします。TimesTenによってSQL文が実行された後、次のようになります。
|
ヒントは、トランザクションの期間中、有効になります。SQL文で文レベルのオプティマイザ・ヒントを指定すると、文レベルのオプティマイザ・ヒントはその文に対して有効となり、オプティマイザはその文にトランザクション・レベルのヒントを使用しません。文の実行後、元のトランザクション・レベルのオプティマイザ・ヒントは、トランザクション中、有効のままです。 このレベルで指定されたヒントは、接続レベルで指定された同じヒントよりも優先されます。 |
ヒントは、接続の期間中、有効になります。優先順位は、文レベル、トランザクション・レベル、および接続レベルとなります。 |
特定の文に対してオプティマイザを有効にするには、文レベルのオプティマイザ・ヒントを使用します。オプティマイザに影響を与える文ごとにヒントを指定する必要があります。文に対して複数の変更が生じる場合があります。 |
トランザクションのすべての文に対してオプティマイザを適用するには、トランザクション・レベルのオプティマイザ・ヒントを使用します。ヒントを文ごとに指定する必要はありません。ヒントは、トランザクション内のすべての文に適用されます。ヒントは、文レベルでヒントを指定することで無効にできます。 |
接続のすべての文に対してオプティマイザを適用するには、接続レベルのオプティマイザ・ヒントを使用します。ヒントは、トランザクションまたは文レベルでヒントを指定することで無効にできます。 |
文レベルのオプティマイザ・ヒント
文レベルのオプティマイザ・ヒントは、TimesTen問合せオプティマイザに命令を渡すSQL文のコメントです。問合せに対して最適な実行計画を選択するとき、オプティマイザではこれらのヒントが考慮されます。オプティマイザはSQL文を分析し、SQL実行エンジンで問合せを実行してデータを戻すために使用される問合せ計画を生成します。
文レベルのオプティマイザ・ヒントの詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のオプティマイザ・ヒントを使用した実行計画の変更に関する項を参照してください。
SQL構文
SQL文には、文レベルのオプティマイザ・ヒントが1つ以上あるコメントを1つ付けることができます。TT_DynamicLoadMultiplePKs
TT_DynamicLoadRootTbl
TT_DynamicPassThrough
いくつかのヒントは、特定のSQL文ではサポートされていません。
-
TT_CommitDMLOnSuccess
は、DELETE
、INSERT
およびUPDATE
文でサポートされます。INSERT...SELECT
文でも有効で、SELECT
キーワードの後に記述する必要があります。このヒントは、TimesTen Scaleoutのみでサポートされています。 -
TT_GridQueryExec
ヒントとTT_PartialResult
ヒントは、SELECT
、INSERT...SELECT
およびCREATE TABLE... AS SELECT
SQL文のみでサポートされており、これらのヒントはSELECT
キーワードの後に記述する必要があります。これらのヒントは、TimesTen Scaleoutのみでサポートされています。 -
それ以外のヒントは
DELETE
、INSERT
、MERGE
、SELECT
、UPDATE
、INSERT...SELECT
およびCREATE
TABLE...AS SELECT
SQL文でサポートされており、これらのヒントは、DELETE
、INSERT
、MERGE
、SELECT
またはUPDATE
キーワードの後に記述する必要があります。
表6-3に、SQL文でのヒントの正しい配置を示します。
文レベルのオプティマイザ・ヒントはコメント構文に埋め込みます。TimesTenでは、1行のコメントおよび複数行のコメント内のヒントがサポートされます。ヒントのあるコメントが複数行の場合は、コメント構文/*+...*/
を使用します。ヒントのあるコメントが1行の場合は、コメント構文--+
を使用します。
構文
SQL VERB {/*+ [CommentText] hint [{hint|CommentText} [...]] */ | --+ [CommentText] hint [{hint|CommentText} [...]] } hint::= ScaleoutHint | CacheHint | JoinOrderHint | IndexHint| FlagHint ScaleoutHint::= TT_CommitDMLOnSuccess({0|1})|TT_GridQueryExec({LOCAL|GLOBAL})| TT_PartialResult(0|1) CacheHint::= TT_DynamicLoadMultiplePKs ({0|1})|TT_DynamicLoadRootTbl ({0|1})| TT_DynamicPassthrough(N) JoinOrderHint::= TT_JoinOrder (CorrelationName CorrelationName [...]) IndexHint::= TT_Index (CorrelationName,IndexName,{0|1} [;...]) FlagHint::= FlagName (0|1) FlagName::= TT_BranchAndBound|TT_CountAsInt|TT_DynamicLoadEnable| TT_DynamicLoadErrorMode| TT_FirstRow|TT_ForceCompile| TT_GenPlan|TT_HashGb|TT_HashScan|TT_IndexedOr|TT_MergeJoin| TT_NestedLoop|TT_NoRemRowIdOpt|TT_Range|TT_Rowid|TT_RowLock| TT_ShowJoinOrder|TT_TblLock|TT_TblScan|TT_TmpHash|TT_TmpRange| TT_TmpTable|TT_UseBoyerMooreStringSearch|
パラメータ
パラメータ | 説明 |
---|---|
|
|
|
1つ以上のヒントがコメント構文に埋め込まれています。コメント構文は1行または複数行になります。プラス記号( アスタリスク( |
|
1つ以上のヒントがコメント構文に埋め込まれています。コメント構文は1行のみになります。プラス記号( ダッシュ( |
|
文レベルのオプティマイザ・ヒント。SQL文では、1つのコメント文字列として、1行以上の文レベルのオプティマイザ・ヒントがサポートされます。1つのSQL文に対して1つ以上のヒントが含まれるコメントを1つ指定できます。コメントは コメント内に複数のヒントを指定する場合は、ヒント間にスペースを入れないようにします。 文レベルのオプティマイザ・ヒントは、1つのSQL文を範囲とし、問合せごとにセマンティクスを持ちます。
|
|
コメント文字列内のテキスト。文レベルのオプティマイザ・ヒントとコメント・テキストの両方を1つのコメント内で使用できます。ヒントとコメント・テキスト間にスペースを入れるようにしてください。 |
|
SELECT /*+TT_GridQueryExec(LOCAL)*/ COUNT(*), elementId# FROM t GROUP BY elementId#; SELECT /*+TT_GridQueryExec(GLOBAL)*/ COUNT(*), elementId# FROM t GROUP BY elementId#; SELECT /*+TT_PartialResult(0)*/ COUNT (*), elementId# FROM t GROUP BY elementId#; SELECT /*+TT_PartialResult(1)*/ COUNT (*), elementId# FROM t GROUP BY elementId#; |
CacheHint |
CacheHint は、TimesTen Cacheでサポートされているオプティマイザ・ヒントを表します。これに該当するヒントは、TT_DynamicLoadMultiplePKs 、TT_DynamicLoadRootTbl およびTT_DynamicPassthrough です。これらのヒントについては、この表で後述します(アルファベット順)。
|
|
たとえば、 Command> SELECT /*+ TT_JoinOrder (EMPS DEPTS)*/...
組込みプロシージャ
|
|
オプティマイザで索引を考慮しないようにするには、0を指定します。オプティマイザで索引を考慮するようにするには、1を指定します。 たとえば、 Command> SELECT /*+ TT_INDEX (E,EMP_NAME_IX,1) */ ...
組込みプロシージャ
|
|
文レベルのオプティマイザ・ヒント・フラグは文のみで有効で、トランザクション・レベルのオプティマイザ・ヒント・フラグはトランザクション中に有効です。 |
|
組込みプロシージャ |
|
このヒントは、 このヒントは、下位互換性を確保するためのものです。 この例では、ヒントに Command> describe SELECT /*+TT_CountAsInt(1)*/ COUNT (*) FROM dual; Prepared Statement: Columns: EXP TT_INTEGER NOT NULL この例では、ヒントに Command> describe SELECT /*+TT_CountAsInt(0)*/ COUNT (*) FROM dual; Prepared Statement: Columns: EXP TT_BIGINT NOT NULL この例では、オプティマイザ・ヒントを設定していません。デフォルトの戻り型は、 describe SELECT COUNT (*) FROM dual; Prepared Statement: Columns: EXP TT_BIGINT NOT NULL |
|
組込みプロシージャ |
|
組込みプロシージャ |
TT_DynamicLoadMultiplePKs{ 0|1} |
TimesTen ClassicでサポートされているTimesTen Cacheオプティマイザ・ヒント。このヒントでは、単一表キャッシュ・グループに複数のキャッシュ・インスタンスを動的にロードする機能を有効化(1 に設定)または無効化(0 に設定)します。動的ロードの操作は、WHERE 句が含まれている修飾されたSELECT 文でトリガーする必要があります。この文では、WHERE 句でキャッシュ・グループのルート表の複数の主キー値を参照しています。デフォルトは1 です。TT_DynamicLoadMultiplePKs とTT_DynamicLoadRootTbl の両方のヒントが指定されている場合は、TT_DynamicLoadMultiplePKs が優先されます。詳細は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』の複数のキャッシュ・インスタンスの複数の主キーを使用した動的なロード操作に関する項を参照してください。
|
TT_DynamicLoadRootTbl |
TimesTen ClassicでサポートされているTimesTen Cacheオプティマイザ・ヒント。このヒントでは、単一表キャッシュ・グループに複数のキャッシュ・インスタンスを動的にロードする機能を有効化(1 に設定)または無効化(0 に設定)します。動的ロードの操作は、WHERE 句が含まれている修飾されたSELECT 文でトリガーする必要があります。この文では、WHERE 句がキャッシュ・グループのルート表の複数の主キー値を参照しません。デフォルトは0 です。TT_DynamicLoadMultiplePKs とTT_DynamicLoadRootTbl の両方のヒントが指定されている場合は、TT_DynamicLoadMultiplePKs が優先されます。詳細は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』の複数のキャッシュ・インスタンスの複数の主キーを使用しない動的なロード操作に関する項を参照してください。
|
TT_DynamicPassThrough(N) |
TimesTen ClassicでサポートされているTimesTen Cacheオプティマイザ・ヒント。指定すると、このヒントによってTimesTenのキャッシュ・インスタンスに動的にロードできる行数が制限されます。具体的には、修飾されたSELECT 文によってトリガーされる動的ロード操作によって、指定されたN 行の制限を超える行数が生成される場合、キャッシュ・インスタンスはロードされず、問合せはOracleデータベースに渡されます。動的ロードは、修飾されたSELECT 文によってトリガーする必要があります。また、キャッシュ・グループにはWHERE 句を指定しないでください。ヒントはSELECT 以外の文では無視されます。このヒントは、動的にロードする最大行数に設定します。このヒントの値を0 以下に設定した場合や、ヒントを指定しない場合は、動的ロードの行制限がなくなります。この場合、キャッシュ・インスタンスにロードできる行数に制限はありません。詳細は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』のOracleデータベースへの動的ロードの自動パススルーに関する項を参照してください。
|
|
組込みプロシージャ |
|
組込みプロシージャ |
|
組込みプロシージャ |
|
組込みプロシージャ |
|
組込みプロシージャ |
|
組込みプロシージャ |
|
組込みプロシージャ |
|
組込みプロシージャ |
|
組込みプロシージャ |
|
組込みプロシージャ |
|
組込みプロシージャ |
|
組込みプロシージャ |
|
組込みプロシージャ |
|
組込みプロシージャ |
|
組込みプロシージャ |
|
組込みプロシージャ |
|
組込みプロシージャ |
|
組込みプロシージャ |
|
組込みプロシージャ |
ノート:
前の表に示したフラグの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttOptSetFlagに関する項を参照してください
説明
-
コメント構文に文レベルのオプティマイザ・ヒントを埋め込みます。
/*
または—
でコメントを開始します。コメント構文を開始した後、プラス記号(+
)を追加します。プラス記号(+
)により、TimesTenではコメントがヒントのリストとして解釈されます。プラス記号(+)はコメント・デリミタの直後に記述する必要があります。(たとえば、/*
または--
の後)。コメント・デリミタとプラス記号(+)の間にはスペースを入れません。次の例では、アスタリスク(*)とプラス記号(+)の間にスペースがあるため、ヒントは無視されます。
Command> SELECT /* + TT_TblScan (1) This hint is ignored because there is a space between the star (*) and the plus (+) sign. */ ...
-
hint
は、TimesTenでサポートされる文レベルのオプティマイザ・ヒントの1つです。プラス記号(+)とヒントの間にスペースを入れることができます。コメントに複数のヒントがある場合は、1つ以上のスペースでヒントを区切ります。たとえば、1行で2つのヒントを指定するには、次のように実行します。Command> SELECT --+ TT_MergeJoin (0) TT_NestedLoop (1) ...
-
コメント内のヒントにコメント・テキストを組み入れることができます。たとえば、
Command> SELECT /*+ TT_HashScan (1) This demonstrates a hint followed by a comment string. */ ...
-
TimesTenでは、次の場合にコメントが無視され、エラーは戻されません。
-
ヒントが
DELETE
、INSERT
、MERGE
、SELECT
またはUPDATE
キーワード(またはTT_GridQueryExec
またはTT_PartialResult
の場合はSELECT
キーワード)の後に記述されていない場合。TT_CommitDMLOnSuccess
は、DELETE
、INSERT
、UPDATE
キーワードの後に記述する必要があります。INSERT...SELECT
では、SELECT
キーワードの後に記述する必要があります。 -
ヒントにスペルミスや構文エラーがある場合。同じコメント内に複数のヒントがあり、構文的に正しいヒントと構文的に正しくないヒントがある場合、TimesTenでは、不正なヒントは無視され、正しいヒントが採用されます。
-
TT_JoinOrder
ヒントかTT_Index
ヒントのいずれかを使用し、閉じカッコがないと、残りのヒント文字列は無視されます。
-
-
互いに競合するヒントがある場合、コメントの右端のヒントが使用されます。たとえば、コメント文字列が
/*+TT_TblScan (0)...TT_TblScan (1) */
の場合は、右端のTT_TblScan(1)
が使用されます。 -
文レベルのオプティマイザ・ヒントは、競合するトランザクション・レベルのオプティマイザ・ヒントをオーバーライドします。文レベルのオプティマイザ・ヒントと競合するトランザクション・レベルのオプティマイザ・ヒントを指定すると、文レベルのオプティマイザ・ヒントは、競合するトランザクション・レベルのオプティマイザ・ヒントをオーバーライドします。たとえば、
ttOptSetFlag
を呼び出し、範囲
フラグを有効にし、SQL問合せを発行して文レベルのオプティマイザ・フラグTT_Range
を無効にすると、この問合せの範囲フラグが無効になります。問合せを実行した後、問合せ実行前にトランザクションに配置された元の範囲フラグ設定は、トランザクション実行中は有効のままです。詳細は、「SELECT問合せでの文レベルのオプティマイザ・ヒントの使用」を参照してください。TT_GridQueryExec
、TT_PartialResult
、TT_CommitDMLOnSuccess
およびTT_CountAsInt
のヒントは、トランザクション・レベルではサポートされていません。 -
副問合せでは文レベルのオプティマイザ・ヒントを使用しないでください。
-
TimesTen問合せオプティマイザは、パススルー文の文レベルのオプティマイザ・ヒントを認識しません。TimesTenでは、パススルー文のSQLテキストはOracle Databaseに渡され、Oracle DatabaseのSQL規則に従って処理されます。パススルー文は、TimesTen Scaleoutではサポートされていません。
文レベルのオプティマイザ・ヒントをサポートするSQL文
SQL文で文レベル・オプティマイザ・ヒントを指定できます。すべてのヒントがすべての文でサポートされているわけではありません。ヒントはコメント構文内に指定し、コメント構文はSQL
VERB
の直後に記述します。(たとえば、SELECT
/*+
hint
*
/...
)。表6-3に、文レベルのヒントの正しい配置を示します。ヒントがその文でサポートされていないかどうかも示します。
表6-3 SQL文への文レベルのヒントの配置
SQL文 | ヒントの配置 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
副問合せではヒントを指定しないでください。
|
|
|
|
|
ヒントの理解
ヒントを使用することで、問合せの実行計画の選択決定においてTimesTen問合せオプティマイザに作用することができます。
TT_GridQueryExec
、TT_PartialResult
およびTT_CommitDMLOnSuccess
は、接続レベルと文レベルでのみサポートされています。この項は、これらのヒントに対して有効ではありません。
トランザクション・レベルのオプティマイザ・ヒントを表示するには、組込みプロシージャttOptSetFlag
を実行します。組込みプロシージャのttOptGetFlag
の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttOptGetFlagに関する項を参照してください。
例
TT_CommitDMLOnSuccess
の例は、「TT_CommitDMLOnSuccessオプティマイザ・ヒント」を参照してください。
TT_GridQueryExec
およびTT_PartialResult
の例:
-
『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』のTT_GridQueryExecに関する項を参照してください。
-
『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』のTT_PartialResultに関する項を参照してください。
次の例は、文レベルのオプティマイザ・ヒントとトランザクション・レベルのオプティマイザ・ヒントの使用方法を説明しています。TimesTenオプティマイザは、コストベースのオプティマイザであり、文の最適な実行計画を判断して生成します。この計画は、リリース間で異なります。実行計画は、参照する表にある索引の他に、列および表の利用可能な統計に基づきます。統計の再計算や索引の変更時は、TimesTenオプティマイザは、再計算された統計および索引変更に基づいて実行計画を変更する場合があります。実行計画は多様なため、これらの例はあくまで実例です。次の例があります。
SELECT問合せでの文レベルのオプティマイザ・ヒントの使用
問合せの実行計画を表示します。次に、文レベルのオプティマイザ・ヒントを使用して、オプティマイザに別の実行計画を選択するように指示します。次の問合せを考慮します。
Command> SELECT r.region_name, c.country_name FROM regions r, countries c WHERE r.region_id = c.region_id ORDER BY c.region_id;
ttIsql
EXPLAIN
コマンドを使用してオプティマイザが生成した計画を表示します。ノート:
-
オプティマイザは、それぞれのスキャンに表レベル・ロッキングを使用して2つの範囲スキャンを実行します。
-
オプティマイザは、
MergeJoin
処理を使用して2つの表を結合します。
Command> EXPLAIN SELECT r.region_name, c.country_name FROM regions r, countries c WHERE r.region_id = c.region_id ORDER BY c.region_id; Query Optimizer Plan: STEP: 1 LEVEL: 2 OPERATION: TblLkRangeScan TBLNAME: COUNTRIES IXNAME: COUNTR_REG_FK INDEXED CONDITION: <NULL> NOT INDEXED: <NULL> STEP: 2 LEVEL: 2 OPERATION: TblLkRangeScan TBLNAME: REGIONS IXNAME: REGIONS INDEXED CONDITION: R.REGION_ID >= C.REGION_ID NOT INDEXED: <NULL> STEP: 3 LEVEL: 1 OPERATION: MergeJoin TBLNAME: <NULL> IXNAME: <NULL> INDEXED CONDITION: C.REGION_ID = R.REGION_ID NOT INDEXED: <NULL>
ここで文レベルのオプティマイザ・ヒントを使用して、低レベル・ロッキングを使用したスキャンの実行、およびNestedLoop
処理を使用した表の結合をオプティマイザに指示します。自動コミットをオンに設定すると、文レベルのオプティマイザ・ヒントがSQL文を範囲としているために自動コミット設定が無効になることが分かります。
Command> autocommit on; Command> EXPLAIN SELECT /*+ TT_RowLock (1), TT_TblLock (0), TT_MergeJoin (0), TT_NestedLoop (1) */ r.region_name, c.country_name FROM regions r, countries c WHERE r.region_id = c.region_id ORDER BY c.region_id; Query Optimizer Plan: STEP: 1 LEVEL: 3 OPERATION: RowLkRangeScan TBLNAME: REGIONS IXNAME: REGIONS INDEXED CONDITION: <NULL> NOT INDEXED: <NULL> STEP: 2 LEVEL: 3 OPERATION: RowLkRangeScan TBLNAME: COUNTRIES IXNAME: COUNTR_REG_FK INDEXED CONDITION: C.REGION_ID = R.REGION_ID NOT INDEXED: <NULL> STEP: 3 LEVEL: 2 OPERATION: NestedLoop TBLNAME: <NULL> IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: <NULL> STEP: 4 LEVEL: 1 OPERATION: OrderBy TBLNAME: <NULL> IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: <NULL>
文レベルのオプティマイザ・ヒントなしで問合せを再度準備します。文レベルのオプティマイザ・ヒントがSQL文を範囲とするため、元の実行計画に戻ります。
Command> EXPLAIN SELECT r.region_name, c.country_name FROM regions r, countries c WHERE r.region_id = c.region_id ORDER BY c.region_id; Query Optimizer Plan: STEP: 1 LEVEL: 2 OPERATION: TblLkRangeScan TBLNAME: COUNTRIES IXNAME: COUNTR_REG_FK INDEXED CONDITION: <NULL> NOT INDEXED: <NULL> STEP: 2 LEVEL: 2 OPERATION: TblLkRangeScan TBLNAME: REGIONS IXNAME: REGIONS INDEXED CONDITION: R.REGION_ID >= C.REGION_ID NOT INDEXED: <NULL> STEP: 3 LEVEL: 1 OPERATION: MergeJoin TBLNAME: <NULL> IXNAME: <NULL> INDEXED CONDITION: C.REGION_ID = R.REGION_ID NOT INDEXED: <NULL>
ヒントの有効化および無効化
この例は、類似の関数を実行するヒントを有効または無効にするかを明確にオプティマイザに指示することの重要性を示しています。たとえば、ハッシュ・ヒントおよび範囲ヒントにより、表のハッシュ・アクセス・パスまたは範囲アクセス・パスのいずれかを使用するようにオプティマイザに指示する場合です。特定のアクセス・パスをオプティマイザが確実に選択できるよう、1つのヒントを有効にしてその他すべての関連ヒントを無効にします。
表を作成し、表の1列目にハッシュ索引、2列目に範囲索引を作成します。
Command> CREATE TABLE test (col1 NUMBER, col2 NUMBER); Command> CREATE HASH INDEX h_index ON test (col1); Command> CREATE INDEX hr_index ON test (col2);
自動コミットをオフにし、組み込みプロシージャttOptGetFlag
を実行して、トランザクションの現在のトランザクション・レベルのオプティマイザ・ヒントを表示します。1に設定すると、フラグは無効です。
Command> autocommit off; Command> CALL ttOptGetFlag ('Hash'); < Hash, 1 > 1 row found. Command> CALL ttOptGetFlag ('Scan'); < Scan, 1 > 1 row found.
ttIsq
EXPLAIN
コマンドを使用して、WHERE
句と動的パラメータを使用したSELECT
問合せの計画を確認します。オプティマイザはハッシュ・スキャンを使用します。
Command> EXPLAIN SELECT * FROM test WHERE col1 = ? and col2 = ?; Query Optimizer Plan: STEP: 1 LEVEL: 1 OPERATION: RowLkHashScan TBLNAME: TEST IXNAME: H_INDEX INDEXED CONDITION: TEST.COL1 = _QMARK_1 NOT INDEXED: TEST.COL2 = _QMARK_2
文レベルのオプティマイザ・ヒントTT_Range
を使用して、オプティマイザに範囲スキャンの使用を指示します。オプティマイザにハッシュ・スキャンの無効化を指示していないため、オプティマイザはTT_Range
ヒントを無視し、ハッシュ・スキャンを使用します。文を変更し、オプティマイザにハッシュ・スキャンを使用せずに範囲スキャンを使用するように指示します。そのためには、文レベルのオプティマイザ・ヒントTT_Range
を有効にし、文レベルのオプティマイザ・ヒントTT_HashScan
を無効にします。オプティマイザはTT_Range
ヒントを無視しなくなります。
Command> EXPLAIN SELECT --+ TT_Range (1) Single line comment to set TT_Range * FROM TEST WHERE col1 = ? and col2 = ?; Query Optimizer Plan: STEP: 1 LEVEL: 1 OPERATION: RowLkHashScan TBLNAME: TEST IXNAME: H_INDEX INDEXED CONDITION: TEST.COL1 = _QMARK_1 NOT INDEXED: TEST.COL2 = _QMARK_2 Command> EXPLAIN SELECT /*+ TT_Range (1) TT_HashScan (0) Multiple line comment to enable TT_Range and disable TT_HashScan */ * FROM TEST WHERE col1 = ? and col2 = ?; Query Optimizer Plan: STEP: 1 LEVEL: 1 OPERATION: RowLkRangeScan TBLNAME: TEST IXNAME: HR_INDEX INDEXED CONDITION: TEST.COL2 = _QMARK_2 NOT INDEXED: TEST.COL1 = _QMARK_1
文レベルのオプティマイザ・ヒントを使用せず、コミットやロールバックを発行せずに、問合せを再度準備します。オプティマイザは、問合せの実行前に有効なトランザクション・レベルのオプティマイザ・ヒントを使用します。文レベルのオプティマイザ・ヒントがSQL文を範囲とするため、オプティマイザはトランザクション・レベルのオプティマイザ・ヒントを使用します。
Command> EXPLAIN SELECT * FROM TEST WHERE col1 = ? and col2 = ?; Query Optimizer Plan: STEP: 1 LEVEL: 1 OPERATION: RowLkHashScan TBLNAME: TEST IXNAME: H_INDEX INDEXED CONDITION: TEST.COL1 = _QMARK_1 NOT INDEXED: TEST.COL2 = _QMARK_2
TT_JoinOrderを使用した結合順序の指定
文レベルのオプティマイザ・ヒントTT_JoinOrder
を使用して、オプティマイザに特定の結合順序の使用を指示します。まずトランザクション・レベルのオプティマイザ・ヒントを使用して、トランザクションでの特定の結合順序の使用をオプティマイザに指示します。次に文レベルのオプティマイザ・ヒントを使用して、文のみで結合順序の変更をオプティマイザに指示します。
Command> CALL ttOptSetOrder ('e d j'); Command> EXPLAIN SELECT * FROM employees e, departments d, job_history j WHERE e.department_id = d.department_id AND e.hire_date = j.start_date; Query Optimizer Plan: STEP: 1 LEVEL: 3 OPERATION: TblLkRangeScan TBLNAME: EMPLOYEES IXNAME: EMP_DEPT_FK INDEXED CONDITION: <NULL> NOT INDEXED: <NULL> STEP: 2 LEVEL: 3 OPERATION: TblLkRangeScan TBLNAME: DEPARTMENTS IXNAME: DEPARTMENTS INDEXED CONDITION: D.DEPARTMENT_ID >= E.DEPARTMENT_ID NOT INDEXED: <NULL> STEP: 3 LEVEL: 2 OPERATION: MergeJoin TBLNAME: <NULL> IXNAME: <NULL> INDEXED CONDITION: E.DEPARTMENT_ID = D.DEPARTMENT_ID NOT INDEXED: <NULL> STEP: 4 LEVEL: 2 OPERATION: TblLkRangeScan TBLNAME: JOB_HISTORY IXNAME: JOB_HISTORY INDEXED CONDITION: <NULL> NOT INDEXED: E.HIRE_DATE = J.START_DATE STEP: 5 LEVEL: 1 OPERATION: NestedLoop TBLNAME: <NULL> IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: <NULL>
トランザクション・レベルの結合順序オプティマイザ・ヒントを、そのSQL文に対してのみオーバーライドするようオプティマイザに指示するには、文レベルのオプティマイザ・ヒントTT_JoinOrder
を使用します。
Command> EXPLAIN SELECT --+ TT_JoinOrder (e j d) * FROM employees e, departments d, job_history j WHERE e.department_id = d.department_id AND e.hire_date = j.start_date; Query Optimizer Plan: STEP: 1 LEVEL: 3 OPERATION: TblLkRangeScan TBLNAME: EMPLOYEES IXNAME: EMP_DEPT_FK INDEXED CONDITION: <NULL> NOT INDEXED: <NULL> STEP: 2 LEVEL: 3 OPERATION: TblLkRangeScan TBLNAME: JOB_HISTORY IXNAME: JOB_HISTORY INDEXED CONDITION: <NULL> NOT INDEXED: E.HIRE_DATE = J.START_DATE STEP: 3 LEVEL: 2 OPERATION: NestedLoop TBLNAME: <NULL> IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: <NULL> STEP: 4 LEVEL: 2 OPERATION: TblLkRangeScan TBLNAME: DEPARTMENTS IXNAME: DEPARTMENTS INDEXED CONDITION: D.DEPARTMENT_ID >= E.DEPARTMENT_ID NOT INDEXED: <NULL> STEP: 5 LEVEL: 1 OPERATION: MergeJoin TBLNAME: <NULL> IXNAME: <NULL> INDEXED CONDITION: E.DEPARTMENT_ID = D.DEPARTMENT_ID NOT INDEXED: <NULL>
問合せを再度準備し、トランザクションで有効だった結合順序が有効のままであるかを確認します。
Command> EXPLAIN SELECT * FROM employees e, departments d, job_history j WHERE e.department_id = d.department_id AND e.hire_date = j.start_date; Query Optimizer Plan: STEP: 1 LEVEL: 3 OPERATION: TblLkRangeScan TBLNAME: EMPLOYEES IXNAME: EMP_DEPT_FK INDEXED CONDITION: <NULL> NOT INDEXED: <NULL> STEP: 2 LEVEL: 3 OPERATION: TblLkRangeScan TBLNAME: DEPARTMENTS IXNAME: DEPARTMENTS INDEXED CONDITION: D.DEPARTMENT_ID >= E.DEPARTMENT_ID NOT INDEXED: <NULL> STEP: 3 LEVEL: 2 OPERATION: MergeJoin TBLNAME: <NULL> IXNAME: <NULL> INDEXED CONDITION: E.DEPARTMENT_ID = D.DEPARTMENT_ID NOT INDEXED: <NULL> STEP: 4 LEVEL: 2 OPERATION: TblLkRangeScan TBLNAME: JOB_HISTORY IXNAME: JOB_HISTORY INDEXED CONDITION: <NULL> NOT INDEXED: E.HIRE_DATE = J.START_DATE STEP: 5 LEVEL: 1 OPERATION: NestedLoop TBLNAME: <NULL> IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: <NULL>
文レベルのオプティマイザ・ヒントTT_INDEXの使用
emp_name_ix
索引を使用するemployees
表で問合せを実行します。次に、文レベルのオプティマイザ・ヒントTT_INDEX
を使用して、この索引を使用しないことをオプティマイザに指示します。まずttIsql
コマンドindexes
を実行し、employees
表の索引を表示します。
Command> indexes employees; Indexes on table TESTUSER.EMPLOYEES: EMPLOYEES: unique range index on columns: EMPLOYEE_ID (referenced by foreign key index JHIST_EMP_FK on table TESTUSER.JOB_HISTORY) TTUNIQUE_0: unique range index on columns: EMAIL EMP_DEPT_FK: non-unique range index on columns: DEPARTMENT_ID (foreign key index references table TESTUSER.DEPARTMENTS(DEPARTMENT_ID)) EMP_JOB_FK: non-unique range index on columns: JOB_ID (foreign key index references table TESTUSER.JOBS(JOB_ID)) EMP_NAME_IX: non-unique range index on columns: LAST_NAME FIRST_NAME 5 indexes found. 5 indexes found on 1 table.
ttIsql
コマンドEXPLAIN
を使用して、last_name
列でWHERE
句を使用するemployees
表でのSELECT
問合せの実行計画を表示します。
Command> EXPLAIN SELECT e.first_name FROM employees e WHERE e.last_name BETWEEN 'A' AND 'B'; Query Optimizer Plan: STEP: 1 LEVEL: 1 OPERATION: RowLkRangeScan TBLNAME: EMPLOYEES IXNAME: EMP_NAME_IX INDEXED CONDITION: E.LAST_NAME >= 'A' AND E.LAST_NAME <= 'B' NOT INDEXED: <NULL>
文レベルのオプティマイザ・ヒントTT_INDEX
を使用して、索引emp_name_ix
を使用しないことをオプティマイザに指示します。
Command> EXPLAIN SELECT --+ TT_INDEX (E,EMP_NAME_IX,0) e.first_name FROM employees e WHERE e.last_name BETWEEN 'A' AND 'B'; Query Optimizer Plan: STEP: 1 LEVEL: 1 OPERATION: TblLkRangeScan TBLNAME: EMPLOYEES IXNAME: EMPLOYEES INDEXED CONDITION: <NULL> NOT INDEXED: E.LAST_NAME <= 'B' AND E.LAST_NAME >= 'A'
TimesTen Scaleoutでのみサポートされているオプティマイザ・ヒント
これらのオプティマイザ・ヒントは、TimesTen Scaleoutのみでサポートされています。これらは文レベルおよび接続レベルで有効です。
接続レベルのヒントの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のOptimizerHintに関する項、文レベルのオプティマイザ・ヒントの詳細は、このマニュアルの「文レベルのオプティマイザ・ヒント」を参照してください。
TT_GridQueryExecオプティマイザ・ヒント
TT_GridQueryExec
オプティマイザ・ヒントを使用すると、問合せによって、ローカル要素から、またはすべての要素から(K-safetyが2に設定されている場合はレプリカ・セット内の要素を含む)のデータが返されるようにすることを指定できます。
このヒントを指定しない場合、問合せは1つの論理データ領域で実行されます。ローカルでもグローバルでもありません。これは、問合せを計算するためにデータの1つの完全なコピーのみが使用されることを意味します。複数の結果を取得することが正しい結果を取得するよりも重要な場合(1つ以上のレプリカ・セットを使用できない場合など)、このヒントを使用します。このヒントの有効なオプションは、LOCAL
およびGLOBAL
です。
詳細は、次を参照してください。
-
このヒントの使用方法は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』のTT_GridQueryExecに関する項を参照してください。
-
接続レベルでこのヒントを使用する方法は、『Oracle TimesTen In-Memory Databaseリファレンス』のOptimizerHintに関する項を参照してください。
-
このヒントを文レベルで使用する方法は、「文レベルのオプティマイザ・ヒント」を参照してください。
この例は、dual
表に対するTT_GridQueryExec(GLOBAL)
ヒントを使用して、すべての要素、レプリカ・セットおよびデータ領域のIDを判別する方法を示しています。
Command> SELECT /*+TT_GridQueryExec(GLOBAL)*/ elementId#, replicasetId#, dataspaceId# FROM dual ORDER BY elementId#,replicasetId#,dataspaceId#; ELEMENTID#, REPLICASETID#, DATASPACEID# < 1, 1, 1 > < 2, 1, 2 > < 3, 2, 1 > < 4, 2, 2 > < 5, 3, 1 > < 6, 3, 2 > 6 rows found.
他の例は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』のTT_GridQueryExecに関する項を参照してください。
TT_PartialResultオプティマイザ・ヒント
TT_PartialResult
オプティマイザ・ヒントを使用すると、一部のデータを使用できない場合、問合せによって結果の一部が返されるようにするかどうかを指定できます。
レプリカ・セット内のすべての要素を使用できない場合に、問合せによって結果の一部が返されるようにするには、TT_PartialResult(1)
を使用します。
レプリカ・セット内のすべての要素を使用できず、必要なデータを使用できない場合に、問合せによってエラーが返されるようにするには、TT_PartialResult(0)
を使用します。各レプリカ・セットの少なくとも1つの要素が使用可能であるか、問合せに必要なデータが使用可能な場合、オプティマイザは問合せ結果を正常に返し、エラーは発生しません。
デフォルトは、TT_PartialResult(0)
です。
詳細は、次を参照してください。
-
このヒントの使用方法と例は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』のTT_PartialResultに関する項を参照してください。
-
接続レベルでこのヒントを使用する方法は、『Oracle TimesTen In-Memory Databaseリファレンス』のOptimizerHintに関する項を参照してください。
-
このヒントを文レベルで使用する方法は、「文レベルのオプティマイザ・ヒント」を参照してください。
TT_CommitDMLOnSuccesオプティマイザ・ヒント
TT_CommitDMLOnSuccess
ヒントは、コミット操作をDML実行の一部として使用可能または使用不可にするために使用されます。
-
文レベルでは、
TT_CommitDMLOnSuccess
は、DML操作の実行時にDML文(DELETE
、INSERT
、INSERT... SELECT
およびUPDATE
)でトランザクションのコミット動作を有効または無効にするために使用します。INSERT...SELECT
文では、TT_CommitDMLOnSuccess
はSELECT
キーワードの後に指定します。TT_CommitDMLOnSuccess
はDML操作のみで有効です。問合せやDDL操作では無効となり、DML以外の文で指定した場合は無視され、エラーは戻されません。構文およびセマンティクスの詳細は、「文レベルのオプティマイザ・ヒント」を参照してください。 -
接続レベルでも、
TT_CommitDMLOnSuccess
は、DML操作の実行時にトランザクションのコミットの動作を有効または無効にするために使用します。ただし、TT_CommitDMLOnSuccess
はOptimizerHint
接続属性に対するパラメータとして指定します。TT_CommitDMLOnSuccess
を接続レベルで使用する方法は、『Oracle TimesTen In-Memory Databaseリファレンス』のOptimizerHintに関する項を参照してください。
どちらのレベルも、有効なオプションは0
と1
です。TT_CommitDMLOnSuccess
を指定しない場合、標準のコミット動作に変更はありません。優先順位は、文レベル、接続レベルの順です。
文レベルのTT_CommitDMLOnSuccess
コミット動作は次のとおりです。
-
ヒントが指定されたDML文が正常に実行された場合、
TT_CommitDMLOnSuccess(1)
は現在のトランザクションをコミットします。コミット時にオープン・カーソルがある場合、すべてのカーソルがクローズされ、トランザクションがコミットされます。このヒントを含む文が失敗した場合、トランザクションはコミットされません。 -
ヒントが指定されたDML文が正常に実行された場合、
TT_CommitDMLOnSuccess(0)
は現在のトランザクションのコミットを無効にします。
表6-4に、TT_CommitDMLOnSuccess
を設定しない場合と、文レベルおよび接続レベルでTT_CommitDMLOnSuccess
を0
および1
に設定した場合のコミット動作を示します。この表は、autocommit
を0
に設定した場合のコミット動作を示しています。
表6-5に、TT_CommitDMLOnSuccess
を設定しない場合と、文レベルおよび接続レベルでTT_CommitDMLOnSuccess
を0
および1
に設定した場合のコミット動作を示します。この表は、autocommit
を1
に設定した場合のコミット動作を示しています。
表6-4 TT_CommitDMLOnSuccessのコミット動作: 自動コミット0
空白 | 接続レベルで未設定 | 接続レベルで0に設定 | 接続レベルで1に設定 |
---|---|---|---|
文レベルで未設定 |
|
|
|
文レベルで0に設定 |
|
|
|
文レベルで1に設定 |
|
|
|
表6-5 TT_CommitDMLOnSuccessのコミット動作: 自動コミット1
空白 | 接続レベルで未設定 | 接続レベルで0に設定 | 接続レベルで1に設定 |
---|---|---|---|
文レベルで未設定 |
|
|
|
文レベルで0に設定 |
|
|
|
文レベルで1に設定 |
|
|
|
詳細は、次を参照してください。
-
詳細は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』のTT_CommitDMLOnSuccessヒントの使用に関する項を参照してください。
-
接続レベルで
TT_CommitDMLOnSuccess
を使用する方法の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のOptimizerHintに関する項を参照してください。 -
文レベルの
TT_CommitDMLOnSuccess
の構文の詳細は、「文レベルのオプティマイザ・ヒント」を参照してください。
次の例は、TT_CommitDMLOnSuccess
オプティマイザ・ヒントの使用例を示しています。
TT_CommitDMLOnSuccessを1に設定
この例では、最初にmytable
表を作成します。次に、autocommit
を0
に設定し、mytable
表に行を挿入します。2番目の接続(conn2
)がデータベースに接続し、mytable
表に対してSELECT
問合せを発行します。問合せによって0行が戻されます。ttIsql
use
コマンドを使用すると、アプリケーションは最初の接続(database1
)に戻され、2番目のINSERT
操作が発行されて、文レベルでTT_CommitDMLOnSuccess
が1
に設定されます。2番目のttIsql
use
コマンドは、アプリケーションをconn2
接続に戻します。SELECT
問合せは、2つの行がmytable
表に挿入されたことを示します。この例は、TT_CommitDMLOnSuccess(1)
を発行すると、2番目のINSERT
操作(ヒントを設定)が正常に実行された後、トランザクションがコミットされることを示しています。
Command> CREATE TABLE mytable (col1 TT_INTEGER, col2 VARCHAR2(4000)); Command> autocommit 0; Command> INSERT INTO mytable VALUES (10, 'ABC'); 1 row inserted.
2番目の接続(conn2
)を確立します
Command> connect as conn2; Using the connection string of connection database1 to connect... ... (Default setting AutoCommit=1)
SELECT
問合せを発行し、autocommit
が0
に設定されているため、0
行となることが予測されます。
conn2: Command> SELECT * FROM mytable; 0 rows found.
最初の接続(database1
)に戻り、TT_CommitDMLOnSuccess
を1
に設定してINSERT
操作を発行します。
conn2: Command> use database1; database1: Command> INSERT /*+TT_CommitDMLOnSuccess(1)*/ INTO mytable VALUES (10, 'ABC'); 1 row inserted.
2番目の接続(conn2
)に戻り、SELECT
が問合せを発行します。(2つのINSERT
文により) 2
行を予測します。(TT_CommitDMLOnSuccess
文レベルのヒントが1
に設定され、2つのINSERT
操作が正常に実行されたため、トランザクションがコミットされます。)
database1: Command> use conn2 conn2: Command> SELECT * FROM mytable; < 10, ABC > < 10, ABC > 2 rows found.
接続レベルでのTT_CommitDMLOnSuccessの使用
この例では、最初にmytable
表を作成します。次に、PL/SQLを使用して表に1000行を挿入します。データベースへの2番目の接続(conn2
)があり、この接続はTT_CommitDMLOnSuccess
を接続レベルで1
に設定して接続します。文レベルと接続レベルの両方のTT_CommitDMLOnSuccess
の動作を示す様々な操作が実行されます。
Command> CREATE TABLE mytable (col1 TT_INTEGER NOT NULL PRIMARY KEY, col2 VARCHAR2 (4000)); Command> BEGIN FOR i in 1..1000 LOOP INSERT INTO mytable VALUES (i,i); END LOOP; END; / PL/SQL procedure successfully completed.
2番目の接続(conn2
)を確立し、TT_CommitDMLOnSuccess
を接続レベルで1
に設定して接続します。
Command> CONNECT adding "OptimizerHint=TT_CommitDMLOnSuccess(1)" as conn2; Connection successful: ...
autocommit
を0
に設定し、DELETE
操作を発行します。
conn2: Command> autocommit 0; conn2: Command> DELETE FROM mytable WHERE col1=1000; 1 row deleted.
元の接続(database1
)に戻り、SELECT
問合せを発行し、DELETE
操作がコミットされたかどうかを確認します。TT_CommitDMLOnSuccess
が接続レベルで1
に設定されているため、操作はコミットされました。
conn2: Command> use database1; database1: Command> SELECT * FROM mytable WHERE col1=1000; 0 rows found.
2番目の接続(conn2
)に戻り、INSERT
操作を発行します。次に、元の接続(database1
)に戻ります。INSERT
操作を含むトランザクションはコミットされました。
database1: Command> use conn2; conn2: Command> INSERT INTO mytable VALUES (1000,1000); 1 row inserted. conn2: Command> use database1 database1: Command> SELECT * FROM mytable WHERE col1=1000; < 1000, 1000 > 1 row found.
2番目の接続(conn2
)に戻り、DELETE
操作を発行した後、INSERT
操作を発行し、次にTT_CommitDMLOnSuccess
を文レベルで0
に設定した2番目のINSERT
操作を発行します(2番目のINSERT
操作)。
database1: Command> use conn2; conn2: Command> DELETE FROM mytable WHERE col1=1000; 1 row deleted. conn2: Command> INSERT INTO mytable VALUES (1001,1001); 1 row inserted. conn2: Command> INSERT /*+TT_CommitDMLOnSuccess(0)*/ INTO mytable VALUES (1002,1002); 1 row inserted.
SELECT
問合せを発行し、問合せの結果を確認します。1つのDELETE
操作と2つのINSERT
操作が正常に実行されました。
conn2: Command> SELECT * FROM mytable where col1 >= 1000; < 1001, 1001 > < 1002, 1002 > 2 rows found.
元の接続(database1
)に戻り、同じSELECT
問合せを発行します。1つのDELETE
文と最初のINSERT
操作がコミットされたことを確認します。これは、TT_CommitDMLOnSuccess
が接続レベルで1
に設定されているためです。この2番目のINSERT
文のTT_CommitDMLOnSuccess
が0
に設定されているため、2番目のINSERT
文はコミットされませんでした。
conn2: Command> use database1; database1: Command> SELECT * FROM mytable where col1 >= 1000; < 1001, 1001 > 1 row found.
2番目の接続(conn2
)に戻り、3番目のINSERT
操作を発行します。SELECT
問合せを発行し、結果を確認します。
database1: Command> use conn2; conn2: Command> INSERT INTO mytable VALUES (1003,1003); 1 row inserted. conn2: Command> SELECT * FROM mytable where col1 >= 1000 ORDER BY col1; < 1001, 1001 > < 1002, 1002 > < 1003, 1003 > 3 rows found.
元の接続(database1
)に戻り、同じSELECT
問合せを発行します。結果がconn2
接続と同じであることに注意してください。TT_CommitDMLOnSuccess
が接続レベルで1に設定され、2番目と3番目のINSERT
操作が正常に実行されたため、トランザクションはコミットされます。
conn2: Command> use database1 database1: Command> SELECT * FROM mytable where col1 >= 1000 ORDER BY col1; < 1001, 1001 > < 1002, 1002 > < 1003, 1003 > 3 rows found.
ALTER ACTIVE STANDBY PAIR
この文は、TimesTen Scaleoutではサポートされていません。
TimesTen Classicの場合:
アクティブ・スタンバイ・ペアは、次の方法で変更できます。
-
サブスクライバ・データベースを追加または削除します。
-
ストア属性を変更します
サブスクライバには、
PORT
およびTIMEOUT
属性のみを設定できます。 -
表、順序またはキャッシュ・グループをレプリケーション・スキームに含めます。
-
表、順序またはキャッシュ・グループをレプリケーション・スキームから除外します。
『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のアクティブ・スタンバイ・ペアのその他の変更に関する項を参照してください。
必要な権限
ADMIN
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutではサポートされていません。
SQL構文
ALTER ACTIVE STANDBY PAIR {SubscriberOperation
|StoreOperation
|InclusionOperation
|NetworkOperation
} [...]
SubscriberOperation
の構文は、次のとおりです。
{ADD | DROP } SUBSCRIBER FullStoreName
StoreOperation
の構文は、次のとおりです。
ALTER STOREFullStoreName
SETStoreAttribute
InclusionOperation
の構文は、次のとおりです。
[{ INCLUDE | EXCLUDE }{TABLE [[Owner.]TableName [,...]]| CACHE GROUP [[Owner.]CacheGroupName [,...]]| SEQUENCE [[Owner.]SequenceName [,...]]} [,...]]
NetworkOperation
の構文は、次のとおりです。
ADD ROUTE MASTER FullStoreName SUBSCRIBER FullStoreName { { MASTERIP MasterHost | SUBSCRIBERIP SubscriberHost } PRIORITY Priority } [...] DROP ROUTE MASTER FullStoreName SUBSCRIBER FullStoreName { MASTERIP MasterHost | SUBSCRIBERIP SubscriberHost } [...]
パラメータ
パラメータ | 説明 |
---|---|
|
サブスクライバ・データベースを指定します。 |
|
指定したサブスクライバ・データベースに更新が送信されないように指定します。この処理は、レプリケーション・スキームの持つサブスクライバが1つのみの場合に失敗します。 |
|
データベースの属性への変更を指定します。サブスクライバには、
|
|
次のいずれかとして指定されたデータベースです。
たとえば、データベースのパスが この名前は、DSNの記述の
|
|
指定された表、順序またはキャッシュ・グループをレプリケーションに含めるか、またはレプリケーションから除外します。
|
|
レプリケーション・スキームに 複数回指定できます。
|
|
レプリケーション・スキームから 複数回指定できます。
|
|
句は複数回指定できます。 |
|
1から99の整数で表される変数。IPアドレスの優先順位を示します。整数値が小さいほど、優先度は高くなります。同じ優先度を持つアドレスが複数指定されている場合は、エラーが返されます。ピア接続の確立に使用する複数のIPアドレスの順序を制御します。
|
説明
-
アクティブ・スタンバイ・ペアを変更する前に、レプリケーション・エージェントを停止する必要があります。例外は、
DDL_REPLICATION_LEVEL
属性とDDL_REPLICATION_ACTION
属性の値に基づいて自動的にレプリケートされて組み込まれるオブジェクトおよび文の場合です。詳細は、「ALTER SESSION」を参照してください。 -
アクティブ・データベースのアクティブ・スタンバイ・ペア・レプリケーション・スキームのみを変更できます。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のアクティブ・スタンバイ・ペアのその他の変更に関する項を参照してください。
-
TimesTenでOracle Clusterwareを使用する場合は、
ALTER ACTIVE STANDBY PAIR
は使用できません。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のコマンドおよびSQL文の制限に関する項を参照してください。かわりに、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のスキーマの変更に関する項で説明されているタスクを実行します。
-
ADD SUBSCRIBER
FullStoreName
は、サブスクライバをレプリケーション・スキームに追加する場合に使用します。 -
DROP SUBSCRIBER
FullStoreName
は、サブスクライバをレプリケーション・スキームから削除する場合に使用します。 -
INCLUDE
またはEXCLUDE
句は、指定された表、順序またはキャッシュ・グループをレプリケーション・スキームに含めるか、またはレプリケーション・スキームから除外する場合に使用します。INCLUDE
またはEXCLUDE
句は、オブジェクト型(表、順序またはキャッシュ・グループ)ごとに1つ使用します。ALTER ACTIVE STANDBY
文は、DDL_REPLICATION_LEVEL
属性とDDL_REPLICATION_ACTION
属性の値に基づいて自動的にレプリケートされて組み込まれるオブジェクトおよび文には不要です。詳細は、「ALTER SESSION」を参照してください。ただし、DDL_REPLICATION_LEVEL
が2以上で、DDL_REPLICATION_ACTION
="EXCLUDE
"の場合は、INCLUDE
句を使用して、レプリケートされたオブジェクトをレプリケーション・スキームに含めます。 -
EXCLUDE
句はAWTキャッシュ・グループに対して使用しないでください。 -
DDL_REPLICATION_LEVEL
が2以上の場合は、INCLUDE
句はアクティブ・データベースの空の表でのみ使用できます。スタンバイおよびサブスクライバの対応する表の内容は、表がレプリケーション・スキームに追加される前に切り捨てられます。
例
サブスクライバをレプリケーション・スキームに追加します。
ALTER ACTIVE STANDBY PAIR ADD SUBSCRIBER rep4;
2つのサブスクライバをレプリケーション・スキームから削除します。
ALTER ACTIVE STANDBY PAIR DROP SUBCRIBER rep3 DROP SUBSCRIBER rep4;
rep3
およびrep4
データベースのストア属性を変更します。
ALTER ACTIVE STANDBY PAIR ALTER STORE rep3 SET PORT 23000 TIMEOUT 180 ALTER STORE rep4 SET PORT 23500 TIMEOUT 180;
1つの表、1つの順序および2つのキャッシュ・グループをレプリケーション・スキームに追加します。
ALTER ACTIVE STANDBY PAIR INCLUDE TABLE my.newtab INCLUDE SEQUENCE my.newseq INCLUDE CACHE GROUP my.newcg1, my.newcg2;
アクティブ・スタンバイ・ペアにNetworkOperation
句を追加します。
ALTER ACTIVE STANDBY PAIR ADD ROUTE MASTER rep1 ON "machine1" SUBSCRIBER rep2 ON "machine2" MASTERIP "1.1.1.1" PRIORITY 1 SUBSCRIBERIP "2.2.2.2" PRIORITY 1;
ALTER CACHE GROUP
ALTER CACHE GROUP
文は、キャッシュ・グループに対するAUTOREFRESH
の状態、時間隔およびモードを変更します。
Oracle Database表の更新は、AUTOREFRESH
を使用してTimesTenキャッシュ・グループに伝播させることができます。AUTOREFRESH
は、キャッシュ・グループがユーザー管理キャッシュ・グループであるか、またはAUTOREFRESH
句でREADONLY
として定義されている場合に有効にできます。
ALTER CACHE GROUP
を使用して設定した任意の値または状態は永続的です。それらの設定はデータベースに保存されるため、デーモンやキャッシュ・エージェントを再起動した場合にも引き続き使用されます。
必要な権限
キャッシュ・グループの所有者に必要な権限はありません。
別のユーザーのキャッシュ・グループの場合はALTER ANY CACHE GROUP
が必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
この文は、キャッシュ・グループのAUTOREFRESH
モードを変更し、これによって、自動リフレッシュ操作中に更新される行が決まります。ALTER
CACHE
GROUP
...SET AUTOREFRESH MODE
句は、TimesTen Scaleoutでは使用できません。
ALTER CACHE GROUP [Owner.]GroupName SET AUTOREFRESH MODE {INCREMENTAL | FULL}
この文は、キャッシュ・グループのAUTOREFRESH
の時間隔を変更します。ALTER
CACHE
GROUP
...SET AUTOREFRESH INTERVAL
句は、TimesTen Scaleoutでは使用できません。
ALTER CACHE GROUP [Owner.]GroupName SET AUTOREFRESH INTERVAL IntervalValue {MINUTE[S] | SECOND[S] | MILLISECOND[S]}
この文は、AUTOREFRESH
の状態を変更します。
ALTER CACHE GROUP [Owner.]GroupName SET AUTOREFRESH STATE {ON | OFF | PAUSED}
パラメータ
パラメータ | 説明 |
---|---|
|
新しいキャッシュ・グループに割り当てられる名前。 |
|
Oracle Database表への変更を自動的にTimesTenに伝播するように指定します。 |
|
自動リフレッシュ時に更新されるキャッシュ内の行を指定します。 |
|
指定した時間隔で |
|
|
|
指定した時間隔で |
|
スケジュールされた |
|
スケジュールされた |
説明
-
リフレッシュは、
ALTER CACHE GROUP...SET AUTOREFRESH STATE
を実行した直後には実行されません。この文では、AUTOREFRESH
の状態を変更するだけです。ALTER CACHE GROUP
文を含むトランザクションをコミットすると、AUTOREFRESH
のスケジュールのためにキャッシュ・エージェントにはすぐに通知されますが、コミットはリフレッシュの完了を待たずに実行されます。自動リフレッシュ操作のスケジューリングはトランザクションの一部ですが、リフレッシュ自体はトランザクションの一部ではありません。 -
ALTER CACHE GROUP... SET AUTOREFRESH STATE OFF
文を実行し、現在実行中の自動リフレッシュ操作がある場合、次のような結果になります。-
LockWait
の時間隔が0の場合、ALTER
文はロックのタイムアウト・エラーで失敗します。 -
LockWait
の時間隔が0以外の場合、現在の自動リフレッシュ・トランザクションはロールバックされ、ALTER
文の処理が続行されます。これは、同じ自動リフレッシュ間隔を持つすべてのキャッシュ・グループに影響します。
-
-
AUTOREFRESH
が設定されたキャッシュ・グループとAUTOREFRESH
が設定されていないキャッシュ・グループの間では、レプリケートできません。 -
ALTER CACHE GROUP
文がレプリケートされているトランザクションの一部である場合、およびレプリケーション・スキームにRETURN TWOSAFE
属性が指定されている場合、トランザクションは失敗する可能性があります。 -
ALTER CACHE GROUP
文はシリアライズ可能分離レベルでは実行できません。実行しようとするとエラー・メッセージが返されます。
関連項目
ALTER FUNCTION
この文は、TimesTen Scaleoutではサポートされていません。
TimesTen Classicの場合:
ALTER FUNCTION
文は、スタンドアロンのストアド・ファンクションを再コンパイルします。明示的に再コンパイルすることによって、実行時に暗黙的に再コンパイルする必要がなくなり、関連する実行時コンパイル・エラーおよびパフォーマンス・オーバーヘッドが発生しなくなります。
パッケージに含まれるファンクションを再コンパイルするには、ALTER PACKAGE
文を使用してパッケージを再コンパイルします。
必要な権限
PL/SQLファンクションの所有者に必要な権限はありません。
別のユーザーのファンクションの場合はALTER ANY PROCEDURE
が必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutではサポートされていません。
SQL構文
ALTER FUNCTION [Owner.]FunctionNameCOMPILE [
CompilerParametersClause
[...]] [REUSE SETTINGS]
パラメータ
パラメータ | 説明 |
---|---|
|
再コンパイルするファンクションの名前。 |
|
ファンクションの再コンパイルを発生させる必須キーワード。ファンクションを正常にコンパイルできなかった場合は、 |
|
このオプション句を使用して、いずれかのPL/SQL永続コンパイラ・パラメータの値を指定します。PL/SQL永続コンパイラ・パラメータには、 文の中で各パラメータを1回指定できます。 この句のパラメータを省略して |
|
このオプション句を使用して、TimesTenがコンパイラのスイッチ設定を削除および再取得しないようにします。 |
説明
-
ALTER FUNCTION
文は、既存ファンクションの宣言または定義を変更しません。ファンクションを再宣言または再定義するには、CREATE FUNCTION
文を使用します。 -
ファンクションが依存しているオブジェクトが無効な場合、TimesTenは最初にこれらのオブジェクトを再コンパイルします。
-
また、TimesTenは、再コンパイルされたファンクションをコールするファンクションや、再コンパイルされたファンクションをコールするファンクションが定義されているパッケージの本体など、ファンクションに依存しているオブジェクトをすべて無効にします。
-
TimesTenによってファンクションが正常に再コンパイルされると、そのファンクションは有効になります。ファンクションの再コンパイルでコンパイル・エラーになった場合、TimesTenによってエラーが返され、ファンクションは無効のままになります。
ttIsql
コマンドのSHOW ERRORS
を使用して、コンパイル・エラーを表示します。 -
再コンパイル中に、TimesTenはすべての永続コンパイラ設定を削除し、セッションからこれらの設定を再取得して、コンパイルの最後に格納します。この処理を回避するには、
REUSE SETTINGS
句を指定します。
関連項目
ALTER PACKAGE
この文は、TimesTen Scaleoutではサポートされていません。
TimesTen Classicの場合:
ALTER PACKAGE
文は、パッケージ仕様部、パッケージ本体またはその両方を明示的に再コンパイルします。明示的に再コンパイルすることによって、実行時に暗黙的に再コンパイルする必要がなくなり、関連する実行時コンパイル・エラーが発生しなくなります。
この文では、同時にすべてのパッケージ・オブジェクトを再コンパイルします。ALTER PROCEDURE
文またはALTER FUNCTION
文を使用して、パッケージに含まれるプロシージャまたはファンクションを個別に再コンパイルすることはできません。
必要な権限
パッケージの所有者に必要な権限はありません。
別のユーザーのパッケージの場合はALTER ANY PROCEDURE
が必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutではサポートされていません。
SQL構文
ALTER PACKAGE [Owner.]PackageNameCOMPILE [PACKAGE|SPECIFICATION|BODY] [
CompilerParametersClause
[...]] [REUSE SETTINGS]
パラメータ
パラメータ | 説明 |
---|---|
|
再コンパイルするパッケージの名前。 |
|
パッケージ仕様部、パッケージ本体またはその両方の再コンパイルを強制するために使用される必須の句。 |
|
パッケージ仕様部と本体の両方を再コンパイルするには、
|
|
このオプション句を使用して、いずれかのPL/SQL永続コンパイラ・パラメータの値を指定します。PL/SQL永続コンパイラ・パラメータには、 文の中で各パラメータを1回指定できます。 この句のパラメータを省略して |
|
このオプション句を使用して、TimesTenがコンパイラのスイッチ設定を削除および再取得しないようにします。 |
説明
-
パッケージ仕様部を再コンパイルすると、TimesTenは、パッケージ内のプロシージャまたはファンクションをコールするプロシージャなど、仕様部に依存しているローカル・オブジェクトを無効にします。パッケージの本体もまた仕様部に依存しています。この後、先にこれらの依存オブジェクトのいずれかを明示的に再コンパイルしないで参照すると、このオブジェクトはTimesTenによって実行時に暗黙的に再コンパイルされます。
-
パッケージ本体を再コンパイルした場合、パッケージ仕様部に依存しているオブジェクトは無効になりません。本体が依存しているオブジェクトが無効な場合、TimesTenは最初にこれらのオブジェクトを再コンパイルします。TimesTenによって本体が正常に再コンパイルされると、その本体は有効になります。
-
パッケージを再コンパイルすると、仕様部と本体の両方が明示的に再コンパイルされます。コンパイル・エラーが発生しなかった場合、仕様部および本体は有効になります。コンパイル・エラーが発生した場合、TimesTenによってエラーが返され、パッケージは無効のままになります。
関連項目
ALTER PROCEDURE
この文は、TimesTen Scaleoutではサポートされていません。
TimesTen Classicの場合:
ALTER PROCEDURE
文は、スタンドアロンのストアド・プロシージャを再コンパイルします。明示的に再コンパイルすることによって、実行時に暗黙的に再コンパイルする必要がなくなり、関連する実行時コンパイル・エラーおよびパフォーマンス・オーバーヘッドが発生しなくなります。
パッケージに含まれるプロシージャを再コンパイルするには、ALTER PACKAGE
文を使用してパッケージを再コンパイルします。
必要な権限
プロシージャの所有者に必要な権限はありません。
別のユーザーのプロシージャの場合はALTER ANY PROCEDURE
が必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutではサポートされていません。
SQL構文
ALTER PROCEDURE [Owner.]ProcedureNameCOMPILE [
CompilerParametersClause
[...]] [REUSE SETTINGS]
パラメータ
パラメータ | 説明 |
---|---|
|
再コンパイルするプロシージャの名前。 |
|
プロシージャの再コンパイルを発生させる必須キーワード。プロシージャを正常にコンパイルできなかった場合は、 |
|
このオプション句を使用して、いずれかのPL/SQL永続コンパイラ・パラメータの値を指定します。PL/SQL永続コンパイラ・パラメータには、 文の中で各パラメータを1回指定できます。 この句のパラメータを省略して |
|
このオプション句を使用して、TimesTenがコンパイラのスイッチ設定を削除および再取得しないようにします。 |
説明
-
ALTER PROCEDURE
文は、既存プロシージャの宣言または定義を変更しません。プロシージャを再宣言または再定義するには、CREATE PROCEDURE
文を使用します。 -
プロシージャが依存しているオブジェクトが無効な場合、TimesTenは最初にこれらのオブジェクトを再コンパイルします。
-
また、TimesTenは、再コンパイルされたプロシージャをコールするプロシージャや、再コンパイルされたプロシージャをコールするプロシージャが定義されているパッケージの本体など、プロシージャに依存しているオブジェクトをすべて無効にします。
-
TimesTenによってプロシージャが正常に再コンパイルされると、そのプロシージャは有効になります。プロシージャの再コンパイルでコンパイル・エラーになった場合、TimesTenによってエラーが返され、プロシージャは無効のままになります。
ttIsql
コマンドのSHOW ERRORS
を使用して、コンパイル・エラーを表示します。 -
再コンパイル中に、TimesTenはすべての永続コンパイラ設定を削除し、セッションからこれらの設定を再取得して、コンパイルの最後に格納します。この処理を回避するには、
REUSE SETTINGS
句を指定します。
例
システム・ビューUSER_PLSQL_OBJECT_SETTINGS
に問合せを発行して、プロシージャquery_emp
のPLSQL_OPTIMIZE_LEVEL
を確認します。PLSQL_OPTIMIZE_LEVEL
を3に変更することで、query_emp
を修正します。結果を確認します。
Command> SELECT PLSQL_OPTIMIZE_LEVEL FROM user_plsql_object_settings WHERE name = 'QUERY_EMP'; < 2 > 1 row found. Command> ALTER PROCEDURE query_emp COMPILE PLSQL_OPTIMIZE_LEVEL = 3; Procedure altered. Command> SELECT PLSQL_OPTIMIZE_LEVEL FROM user_plsql_object_settings WHERE name = 'QUERY_EMP'; < 3 > 1 row found.
関連項目
ALTER PROFILE
ALTER
PROFILE
文では、プロファイル内の1つ以上のパスワード・パラメータを追加、変更または削除します。
必要な権限
ADMIN
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
ALTER PROFILE profile LIMIT password_parameters password_parameters::= [FAILED_LOGIN_ATTEMPTS password_parameter_options] [PASSWORD_LIFE_TIME password_parameter_options] [PASSWORD_REUSE_TIME password_parameter_options] [PASSWORD_REUSE_MAX password_parameter_options] [PASSWORD_LOCK_TIME password_parameter_options] [PASSWORD_GRACE_TIME password_parameter_options] [{PASSWORD_COMPLEXITY_CHECKER|PASSWORD_VERIFY_FUNCTION} password_checker_options] password_parameter_options::= UNLIMITED|DEFAULT|constant password_checker_options::= function|NULL|DEFAULT function::= TT_VERIFY_FUNCTION|TT_STRONG_VERIFY_FUNCTION|TT_STIG_VERIFY_FUNCTION
パラメータ
パラメータ | 説明 |
---|---|
|
プロファイルの名前。 |
|
パスワード・パラメータは、パスワード・パラメータの名前とパスワード・パラメータの値(または制限)で構成されます。これには、パスワード複雑度チェッカ関数が含まれます。すべてのパラメータ(
|
|
ユーザーのアカウントがロックされるまでの、ユーザーによるデータベースへの接続試行の連続失敗回数を指定します。 |
|
ユーザーが認証に同じパスワードを使用できる日数を指定します。 |
|
これら2つのパラメータは、同時に使用する必要があります。
これらのパラメータを有効にするには、その両方に値を指定する必要があります。具体的には、次のようになります。
|
|
指定した回数連続して接続に失敗した後に、ユーザー・アカウントがロックされる日数を指定します。 |
|
猶予期間の開始後の日数を指定します。この間は、TimesTenが警告を示しますが、データベースへの接続は許可されます。猶予期間中にパスワードが変更されないと、そのパスワードは期限切れになります。このパラメータは、 |
|
パスワード・パラメータに制限がないことを示します。 |
|
このプロファイルのパスワード・パラメータに対する制限を省略することを示します。このプロファイルが割り当てられているユーザーは、このパスワード・パラメータの
|
|
|
|
パスワードに対するパスワード検証を実行するかどうかを示します。実行する場合は、検証に使用する関数を指定します。 function は、サポートされている3つのパスワード複雑度チェッカ関数のいずれかを示します。TimesTenにパスワード検証を実行するように指示するには、これらの関数のいずれかを指定します。有効な値は次のとおりです。
|
説明
-
ALTER
PROFILE
文は、以前に作成したプロファイルを変更するために使用します。プロファイルの作成の詳細は、「CREATE PROFILE」を参照してください。 -
ALTER
PROFILE
文を使用した変更は、その影響を受けるユーザーが次回データベースに接続したときに有効になります。例外は、PASSWORD_COMPLEXITY_CHECKER
パスワード・パラメータを変更した場合です。パスワード検証は、新規に作成されたパスワード(CREATE
USER
またはALTER
USER
文のIDENTIFIED
BY
句で指定されたパスワード)に対してのみ実行されます。そのため、ユーザーは古いパスワードでデータベースに接続できます。例については、「PASSWORD_COMPLEXITY_CHECKERパスワード・パラメータの変更」を参照してください。 -
DEFAULT
プロファイルは変更できます。ただし、DEFAULT
プロファイルは削除できません。DEFAULT
プロファイルの変更例は、「DEFAULTプロファイルの変更」を参照してください。 -
SYSTEM
プロファイルのパスワード・パラメータは変更できません。このプロファイルはインスタンス管理者を含むシステム・ユーザーに割り当てられます。 - プロファイルを変更して、そのプロファイルが割り当てられているユーザーのパスワードに対して実行するパスワード検証を変更できます。パスワード検証およびパスワード複雑度チェッカ検証関数の詳細は、「パスワード複雑度チェッカの検証について」を参照してください。
例
PASSWORD_COMPLEXITY_CHECKERパスワード・パラメータの変更
この例では、myprofile_alterpw1
プロファイルを作成して、PASSWORD_COMPLEXITY_CHECKER
パスワード・パラメータにTT_VERIFY_FUNCTION
を指定します。その後で、sampleuser_alterpw1
ユーザーを作成して、sampleuser_alterpw1
ユーザーにmyprofile_alterpw1
プロファイルを割り当てます。この例では、プロファイルを変更して、PASSWORD_COMPLEXITY_CHECKER
パスワード・パラメータにTT_STIG_VERIFY_FUNCTION
を指定します。sampleuser_alterpw1
は、元のパスワードでデータベースに接続しようとします。その接続に成功します。TimesTenは古いパスワードに対するパスワード検証を実行しません。その後で、ALTER
USER
文を使用して、TT_STIG_VERIFY_FUNCTION
の要件を満たすようにsampleuser_alterpw1
のユーザー・パスワードを変更しています。ALTER
USER
文が成功して、ユーザーのパスワードが変更されています。
Command> CREATE PROFILE myprofile_alterpw1 LIMIT
PASSWORD_COMPLEXITY_CHECKER TT_VERIFY_FUNCTION;
Profile created.
Command> CREATE USER sampleuser_alterpw1
IDENTIFIED BY "%aabb2L90" PROFILE myprofile_alterpw1;
User created.
myprofile_alterpw1
プロファイルを変更することで、PASSWORD_COMPLEXITY_CHECKER
の値をTT_STIG_VERIFY_FUNCTION
に変更します。sampleuser_alterpw1
ユーザーとして、データベースに接続します。接続が成功します。
Command> ALTER PROFILE myprofile_alterpw1 LIMIT
PASSWORD_COMPLEXITY_CHECKER TT_STIG_VERIFY_FUNCTION;
Profile altered.
Command> GRANT CONNECT TO sampleuser_alterpw1;
Command> connect adding "UID=sampleuser_alterpw1;PWD=%aabb2L90" as sampleuser;
Connection successful: DSN=access1;UID=sampleuser_alterpw1;
DataStore=/scratch/sampleuser/mydatabase1;DatabaseCharacterSet=AL32UTF8;
ConnectionCharacterSet=AL32UTF8;PermSize=128;
(Default setting AutoCommit=1)
同じパスワードを指定して、sampleuser_alterpw1
ユーザーを変更します。ALTER
USER
文は失敗します。新しく作成したパスワードは、TT_STIG_VERIFY_FUNCTION
関数の要件を満たしていません。TT_STIG_VERIFY_FUNCTION
関数の要件を満たすパスワードを指定して、sampleuser_alterpw1
を再度変更します。ALTER
USER
文は成功します。TT_STIG_VERIFY_FUNCTION
関数の詳細は、「TT_STIG_VERIFY_FUNCTION」を参照してください。
Command> ALTER USER sampleuser_alterpw1
IDENTIFIED BY "%aabb2L90";
15186: Password complexity check for the specified password failed
15188: TT-20001: Password length less than 15
The command failed.
Command> ALTER USER sampleuser_alterpw1
IDENTIFIED BY "%aabb2L##mf5Fn!";
User altered.
DEFAULTプロファイルの変更
この例では、DEFAULT
プロファイルのパスワード・パラメータの値を検証します。その次に、プロファイルを別の値に変更します。DEFAULT
プロファイルが割り当てられているユーザーは、ユーザーがデータベースに次回接続したときに変更された値を継承します。
Command> SELECT * FROM dba_profiles WHERE profile='DEFAULT' AND resource_type='PASSWORD'; < DEFAULT, FAILED_LOGIN_ATTEMPTS, PASSWORD, 10 > < DEFAULT, PASSWORD_LIFE_TIME, PASSWORD, UNLIMITED > < DEFAULT, PASSWORD_REUSE_TIME, PASSWORD, UNLIMITED > < DEFAULT, PASSWORD_REUSE_MAX, PASSWORD, UNLIMITED > < DEFAULT, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, NULL > < DEFAULT, PASSWORD_LOCK_TIME, PASSWORD, .0034 > < DEFAULT, PASSWORD_GRACE_TIME, PASSWORD, UNLIMITED > 7 rows found.
user1
ユーザーを作成しますが、プロファイルは指定しません。User1
に、DEFAULT
プロファイルが割り当てられます。ALTER
PROFILE
文を使用して、DEFAULT
プロファイルのFAILED_LOGIN_ATTEMPTS
パスワード・パラメータの値を5
に、PASSWORD_LOCK_TIME
パスワード・パラメータの値を1
に変更します。DEFAULT
は予約語なので、DEFAULT
を二重引用符で囲みます。user1
として、毎回間違ったパスワードを指定してデータベースに5回接続します。6回目の試行時に、user1
アカウントがロックされます。
Command> CREATE USER user1 IDENTIFIED BY user1; User created. Command> GRANT CONNECT TO user1;
dba_users
システム・ビューを問い合せて、user1
にDEFAULT
プロファイルが割り当てられていることを確認します。
Command> SELECT profile FROM dba_users WHERE username='USER1'; < DEFAULT > 1 row found.
ALTER
PROFILE
文を使用して、DEFAULT
プロファイルを変更します。
Command> ALTER PROFILE "DEFAULT" LIMIT FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LOCK_TIME 1; Profile altered.
dba_profiles
システム・ビューを問い合せて、値が変更されていることを確認します(太字で表示)。
Command> SELECT * FROM dba_profiles WHERE profile='DEFAULT' AND resource_type='PASSWORD'; < DEFAULT, FAILED_LOGIN_ATTEMPTS, PASSWORD, 5 > < DEFAULT, PASSWORD_LIFE_TIME, PASSWORD, UNLIMITED > < DEFAULT, PASSWORD_REUSE_TIME, PASSWORD, UNLIMITED > < DEFAULT, PASSWORD_REUSE_MAX, PASSWORD, UNLIMITED > < DEFAULT, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, NULL > < DEFAULT, PASSWORD_LOCK_TIME, PASSWORD, 1 > < DEFAULT, PASSWORD_GRACE_TIME, PASSWORD, UNLIMITED > 7 rows found.
user1
として、データベースに接続してみます。間違ったパスワードを指定します。6回目の試行時に、user1
アカウントがロックされます。
Command> connect adding "uid=user1;pwd=user1_test1" as user1; 7001: User authentication failed The command failed. none: Command> connect adding "uid=user1;pwd=user1_test2" as user1; 7001: User authentication failed The command failed. none: Command> connect adding "uid=user1;pwd=user1_test3" as user1; 7001: User authentication failed The command failed. none: Command> connect adding "uid=user1;pwd=user1_test4" as user1; 7001: User authentication failed The command failed. none: Command> connect adding "uid=user1;pwd=user1_test5" as user1; 7001: User authentication failed The command failed. none: Command> connect adding "uid=user1;pwd=user1_test6" as user1; 15179: the account is locked The command failed.
プロファイルの作成後のプロファイルの変更
この例では、profile1
プロファイルを作成して、パスワード・パラメータFAILED_LOGIN_ATTEMPTS
、PASSWORD_LIFE_TIME
、PASSWORD_LOCK_TIME
およびPASSWORD_GRACE_TIME
の値を指定します。その次に、profile1
プロファイルを変更して、パスワード・パラメータPASSWORD_REUSE_TIME
およびPASSWORD_REUSE_MAX
を変更します。
Command> CREATE PROFILE profile1 LIMIT FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LIFE_TIME 90 PASSWORD_LOCK_TIME 30 PASSWORD_GRACE_TIME 10; Profile created.
dba_profiles
システム・ビューを問い合せて、パスワード・パラメータの値を確認します。パスワード・パラメータPASSWORD_REUSE_TIME
およびPASSWORD_REUSE_MAX
の値は、どちらもDEFAULT
(太字で表示)になっています。これらのパスワード・パラメータはCREATE
PROFILE
定義で指定されていないため、TimesTenは各パラメータにDEFAULT
の値を割り当てます。これらのパラメータの値は、DEFAULT
プロファイルの値から導出されます。
Command> SELECT * FROM dba_profiles WHERE profile = 'PROFILE1' AND resource_type= 'PASSWORD'; < PROFILE1, FAILED_LOGIN_ATTEMPTS, PASSWORD, 3 > < PROFILE1, PASSWORD_LIFE_TIME, PASSWORD, 90 > < PROFILE1, PASSWORD_REUSE_TIME, PASSWORD, DEFAULT > < PROFILE1, PASSWORD_REUSE_MAX, PASSWORD, DEFAULT > < PROFILE1, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, DEFAULT > < PROFILE1, PASSWORD_LOCK_TIME, PASSWORD, 30 > < PROFILE1, PASSWORD_GRACE_TIME, PASSWORD, 10 > 7 rows found.
profile1
プロファイルを変更して、PASSWORD_REUSE_TIME
パスワードに20
の値を指定し、PASSWORD_REUSE_MAX
パスワード・パラメータに15
の値を指定します(太字で表示)。このプロファイルが割り当てられているユーザーは、パスワードを15
回変更していれば、20
日後に同じパスワードを再利用できます。
Command> ALTER PROFILE profile1 LIMIT PASSWORD_REUSE_TIME 20 PASSWORD_REUSE_MAX 15; Profile altered.
dba_profiles
システム・ビューを問い合せて、パスワード・パラメータの値が変更されていることを確認します(太字で表示)。
Command> SELECT * FROM dba_profiles WHERE profile = 'PROFILE1' AND resource_type= 'PASSWORD'; < PROFILE1, FAILED_LOGIN_ATTEMPTS, PASSWORD, 3 > < PROFILE1, PASSWORD_LIFE_TIME, PASSWORD, 90 > < PROFILE1, PASSWORD_REUSE_TIME, PASSWORD, 20 > < PROFILE1, PASSWORD_REUSE_MAX, PASSWORD, 15 > < PROFILE1, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, DEFAULT > < PROFILE1, PASSWORD_LOCK_TIME, PASSWORD, 30 > < PROFILE1, PASSWORD_GRACE_TIME, PASSWORD, 10 > 7 rows found.
ALTER REPLICATION
この文は、TimesTen Scaleoutではサポートされていません。
TimesTen Classicの場合:
ALTER REPLICATION
文では、レプリケーション要素の追加、変更、削除を行い、クラシック・レプリケーション・スキームに関連するデータベースのレプリケーション属性を変更します。
ほとんどのALTER REPLICATION
処理は、レプリケーション・エージェントが停止している場合(ttAdmin
-repStop
)にのみサポートされます。ただし、レプリケーション・エージェントの実行中にサブスクライバ・データベースをレプリケーション・スキームに動的に追加することは可能です。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のクラシック・レプリケーション・スキームの変更に関する項を参照してください。
必要な権限
ADMIN
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutではサポートされていません。
SQL構文
ALTER REPLICATION
文の構文は、次のとおりです。
ALTER REPLICATION [Owner.]ReplicationSchemeName ElementOperation [...] | StoreOperation | NetworkOperation [...]
ElementOperation
を1回以上指定します。
ADD ELEMENT ElementName { DATASTORE | { TABLE [Owner.]TableName [CheckConflicts] } | SEQUENCE [Owner.]SequenceName } { MASTER | PROPAGATOR } FullStoreName { SUBSCRIBER FullStoreName [,... ] [ReturnServiceAttribute] } [ ... ] { INCLUDE | EXCLUDE } { TABLE [[Owner.]TableName[,...]] | SEQUENCE [[Owner.]SequenceName[,...]] } [,...] ALTER ELEMENT { ElementName | * IN FullStoreName ]} ADD SUBSCRIBER FullStoreName [,...] [ReturnServiceAttribute] | ALTER SUBSCRIBER FullStoreName [,...]| SET [ReturnServiceAttribute] DROP SUBSCRIBER FullStoreName [,... ] ALTER ELEMENT * IN FullStoreName SET { MASTER | PROPAGATOR } FullStoreName ALTER ELEMENT ElementName {SET NAME NewElementName | SET CheckConflicts} ALTER ELEMENT ElementName { INCLUDE | EXCLUDE } { TABLE [Owner.]TableName | SEQUENCE [Owner.]SequenceName }[,...] DROP ELEMENT { ElementName | * IN FullStoreName }
CheckConflicts
は、TABLE
要素をレプリケートした場合にのみ設定できます。構文の要件は、「CHECK CONFLICTS」を参照してください。
ReturnServiceAttribute
の構文は、次のとおりです。
{ RETURN RECEIPT [BY REQUEST] | NO RETURN }
StoreOperation
句:
ADD STORE FullStoreName [StoreAttribute [... ]] ALTER STORE FullStoreName SET StoreAttribute [... ]
StoreAttribute
の構文は、次のとおりです。
DISABLE RETURN {SUBSCRIBER | ALL} NumFailures RETURN SERVICES {ON | OFF} WHEN [REPLICATION] STOPPED DURABLE COMMIT {ON | OFF} RESUME RETURN Milliseconds LOCAL COMMIT ACTION {NO ACTION | COMMIT} RETURN WAIT TIME Seconds COMPRESS TRAFFIC {ON | OFF} PORT PortNumber TIMEOUT Seconds FAILTHRESHOLD Value CONFLICT REPORTING SUSPEND AT Value CONFLICT REPORTING RESUME AT Value TABLE DEFINITION CHECKING {EXACT|RELAXED}
NetworkOperation
を1回以上指定します。
ADD ROUTE MASTER FullStoreName SUBSCRIBER FullStoreName { { MASTERIP MasterHost | SUBSCRIBERIP SubscriberHost } PRIORITY Priority } [...] DROP ROUTE MASTER FullStoreName SUBSCRIBER FullStoreName { MASTERIP MasterHost | SUBSCRIBERIP SubscriberHost } [...]
パラメータ
パラメータ | 説明 |
---|---|
|
クラシック・レプリケーション・スキームに割り当てる名前です。 |
|
新しい要素を既存のクラシック・レプリケーション・スキームに追加します。 要素が |
|
新しい
要素が順序の場合、 |
|
追加のサブスクライバ・データベースを指定します。 |
|
この構文を一連の要素名に使用すると、次の操作を実行できます。
変更されるデータベースの一部に |
|
サブスクライバが追加または削除される要素の名前です。 |
|
|
|
要素が順序の場合、 |
|
RETURN RECEIPTサービスを有効化、無効化または変更するように、サブスクライバ・データベースを変更します。 |
|
データベース間で |
|
レプリケートされた通信量を圧縮して、ネットワークの帯域幅の量を削減します。 |
|
競合解消のレポートを一時停止します。
この句は、表レベルのレプリケーションで有効です。 |
|
競合解消のレポートを再開します。
この句は、表レベルのレプリケーションで有効です。 |
|
|
|
|
|
|
|
|
|
指定したサブスクライバ・データベースに更新が送信されないように指定します。この処理は、クラシック・レプリケーション・スキームの持つサブスクライバが1つのみの場合に失敗します。 |
|
サブスクライバ・データベースのために累積できるログ・ファイルの数。この値を超えると、サブスクライバは 0を指定すると、この上限は設定されません。これがデフォルトです。 詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のトランザクション・ログ障害しきい値の設定に関する項を参照してください。 |
|
次のいずれかとして指定されたデータベースです。
たとえば、データベースのパスが この名前は、DSNの記述の
|
|
タイムアウト・イベントの
この設定は、 |
|
アプリケーションで特定の要素が更新されるデータベース。更新は |
|
RETURNサービスを使用しないように指定します。これがデフォルトです。 RETURNサービスの使用の詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のRETURNサービスの使用に関する項を参照してください。 |
|
このデータベースのレプリケーション・エージェントが接続をリスニングするTCP/IPポート番号です。指定しない場合は、レプリケーション・エージェントによってポート番号が自動的に割り当てられます。 相互にレプリケートするすべてのTimesTenデータベースで、同じポート番号を使用する必要があります。 |
|
レプリケートされた更新を受け取って他のデータベースに渡すデータベース。 |
|
|
|
RETURN RECEIPTサービスを有効にし、これによって、マスター・データベースに対してトランザクションをコミットするアプリケーションは、すべてのサブスクライバがトランザクションを受信するまでブロックされます。
|
|
レプリケーションが無効になっている場合のRETURNサービスのオンまたはオフを設定します。
|
|
RETURN TWOSAFEサービスを有効にし、これによって、マスター・データベースに対してトランザクションをコミットするアプリケーションは、すべてのサブスクライバがトランザクションをコミットするまでブロックされます。
|
|
RETURNサービスの応答を待機する秒数を指定します。デフォルト値は10秒です。値が0(ゼロ)の場合は、タイムアウトがないことを意味します。 |
|
任意のデータベースを任意の要素の |
|
|
|
サブスクライバで実行される表定義チェックの種類を指定します。
デフォルトは ノート: |
|
レプリケーション・エージェントがリモート・レプリケーション・エージェントからの応答を待機する最大時間(秒)。デフォルトは120秒です。 ノート: リモート・レプリケーション・エージェントからの応答の遅延の原因となる大規模なトランザクションの場合、エージェントは、トランザクションのサイズに基づいて、必要に応じてタイムアウトを次第に大きい値にスケーリングします。大規模なトランザクションに対して |
|
レプリケーション・スキームに 複数回指定できます。
|
|
クラシック・レプリケーション・スキームから 複数回指定できます。
|
|
句は複数回指定できます。 |
|
1から99の整数で表される変数。IPアドレスの優先順位を示します。整数値が小さいほど、優先度は高くなります。同じ優先度を持つアドレスが複数指定されている場合は、エラーが返されます。ピア接続の確立に使用する複数のIPアドレスの順序を制御します。
|
説明
-
ALTER ELEMENT DROP SUBSCRIBER
は、特定のレプリケーション要素のサブスクライバを削除します。 -
レプリケーション要素の名前が、別のデータベースにすでに定義されているレプリケーション要素の名前と競合する場合は、
ALTER ELEMENT SET NAME
を使用してレプリケーション要素の名前を変更できます。SET NAME
では* IN
FullStoreName
は使用できません。FullStoreName
は、データベースのファイルの基本名である必要があります。たとえば、データベースのファイル名がdata.ds0
の場合、ファイルの基本名はdata
になります。 -
ALTER ELEMENT SET MASTER
を使用して、レプリケーション要素のマスター・データベースを変更できます。MASTER
操作には、* IN
FullStoreName
オプションを使用する必要があります。つまり、マスター・データベースは、そのレプリケーション要素すべての所有権を送信して、マスター・ロールを完全に放棄する必要があります。通常、このオプションは、(共通の)MASTER
の障害の後に、SUBSCRIBER
データベースで要求されるALTER REPLICATION
文で使用します。 -
マスター要素の所有権をサブスクライバに送信するには、次の手順を実行します。
-
レプリケートされた各表に対して
ALTER REPLICATION DROP ELEMENT
を実行し、レプリケートされた要素を手動で削除します。 -
新しく指定した
MASTER
/SUBSCRIBER
ロールを付けてALTER REPLICATION ADD ELEMENT
を使用して、各表をレプリケーション・スキームに追加します。
-
-
ALTER REPLICATION ALTER ELEMENT SET MASTER
では、以前のマスターは自動的にはサブスクライバとしてスキームに保持されません。保持する必要がある場合は、ALTER REPLICATION ALTER ELEMENT ADD SUBSCRIBER
文を実行します。ノート:
ALTER ELEMENT DROP MASTER
という文はありません。各レプリケーション要素のMASTER
データベースは1つのみである必要があり、現在指定されているMASTER
はレプリケーション・スキームから削除できません。 -
NetworkOperation
句を使用する前に、レプリケーション・エージェントを停止してください。 -
次のレプリケーション・スキームは
ALTER REPLICATION
文で変更できません。-
アクティブ・スタンバイ・ペア。かわりに、
ALTER ACTIVE STANDBY PAIR
を使用します。 -
クラスタウェア管理のアクティブ・スタンバイ・ペア。かわりに、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のスキーマの変更に関する項で説明されているタスクを実行します。
-
例
この例では、データベースwest
上で更新してデータベースeast
にレプリケートする追加の表westleads
のクラシック・レプリケーション・スキームを設定します。
ALTER REPLICATION r1 ADD ELEMENT e3 TABLE westleads MASTER west ON "westcoast" SUBSCRIBER east ON "eastcoast";
この例では、表westleads
にサブスクライバ(backup
)を追加します。
ALTER REPLICATION r1 ALTER ELEMENT e3 ADD SUBSCRIBER backup ON "backupserver";
この例では、表westleads
の要素名をe3
からnewelementname
に変更します。
ALTER REPLICATION r1 ALTER ELEMENT e3 SET NAME newelementname;
この例では、現在のマスターwest
のすべての要素について、newwest
をマスターに指定します。
ALTER REPLICATION r1 ALTER ELEMENT * IN west SET MASTER newwest;
この要素は、east
のポート番号を変更します。
ALTER REPLICATION r1 ALTER STORE east ON "eastcoast" SET PORT 22251;
この例では、my.tab1
表をmy.rep1
レプリケーション・スキームのds1
データベース要素に追加します。
ALTER REPLICATION my.rep1 ALTER ELEMENT ds1 DATASTORE INCLUDE TABLE my.tab1;
この例では、ds1
データベースをmy.rep1
レプリケーション・スキームに追加します。データベースにmy.tab2
表を含めます。
ALTER REPLICATION my.rep1 ADD ELEMENT ds1 DATASTORE MASTER rep2 SUBSCRIBER rep1, rep3 INCLUDE TABLE my.tab2;
この例では、ds2
データベースをレプリケーション・スキームに追加しますが、my.tab1
表は除外されます。
ALTER REPLICATION my.rep1 ADD ELEMENT ds2 DATASTORE MASTER rep2 SUBSCRIBER rep1 EXCLUDE TABLE my.tab1;
NetworkOperation
句を追加します。
ALTER REPLICATION r ADD ROUTE MASTER rep1 ON "machine1" SUBSCRIBER rep2 ON "machine2" MASTERIP "1.1.1.1" PRIORITY 1 SUBSCRIBERIP "2.2.2.2" PRIORITY 1 MASTERIP "3.3.3.3" PRIORITY 2 SUBSCRIBERIP "4.4.4.4" PRIORITY 2;
NetworkOperation
句を削除します。
ALTER REPLICATION r DROP ROUTE MASTER repl ON "machine1" SUBSCRIBER rep2 ON "machine2" MASTERIP "1.1.1.1" SUBSCRIBERIP "2.2.2.2" MASTERIP "3.3.3.3" SUBSCRIBERIP "4.4.4.4";
関連項目
ALTER ACTIVE STANDBY PAIR
CREATE ACTIVE STANDBY PAIR
CREATE REPLICATION
DROPACTIVE STANDBY PAIR
DROP REPLICATION
データベースから表を削除するには、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のクラシック・レプリケーション・スキーム内のレプリケートされた表の変更に関する項を参照してください。
ALTER SEQUENCE
この文は、TimesTen Scaleoutのみでサポートされています。
ALTER SEQUENCE
文を使用して、順序のバッチ値を変更します。
必要な権限
順序の所有者に必要な権限はありません。
別のユーザーの順序に対するALTER ANY SEQUENCE
権限。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
ALTER SEQUENCE [Owner.]SequenceName BATCH BatchValue
パラメータ
パラメータ | 説明 |
---|---|
|
変更する順序の名前。 |
|
TimesTen Scaleoutのみで有効です。グリッドの各要素に格納される一意の順序値の範囲を構成します。デフォルト値は1000万です。 |
説明
-
この文を使用して、TimesTen Scaleoutの順序のバッチ値を変更します。変更は、将来の順序番号に影響します。
-
この文では、
CREATE
SEQUENCE
文でサポートされている他の値は変更できません。この場合は、DROP SEQUENCE
文を使用してから、同じ名前の順序を新規作成します。たとえば、MINVALUE
を変更する場合、順序を削除し、同じ名前で必要なMINVALUE
を持つ順序を再度作成します。
詳細は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』の順序の使用方法に関する項を参照してください。
例
順序のバッチ値の変更:
ALTER SEQUENCE myseq BATCH 2000; Sequence altered
ALTER SESSION
ALTER SESSION
文は、セッション・パラメータを動的に変更します。これは、現在のセッションの同等の接続属性の設定を上書きします(適用可能な場合)。
必要な権限
なし
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。ただし、これらのパラメータはサポートされていません。
-
DDL_REPLICATION_ACTION
-
DDL_REPLICATION_LEVEL
-
REPLICATION_TRACK
SQL構文
ALTER SESSION SET {COMMIT_BUFFER_SIZE_MAX = n | DDL_REPLICATION_ACTION={'INCLUDE'|'EXCLUDE'} | DDL_REPLICATION_LEVEL={1|2|3} | ISOLATION_LEVEL = {SERIALIZABLE | READ COMMITTED} | NLS_SORT = {BINARY| SortName} | NLS_LENGTH_SEMANTICS = {BYTE|CHAR} | NLS_NCHAR_CONV_EXCP = {TRUE|FALSE} | PLSQL_TIMEOUT = n | PLSQL_OPTIMIZE_LEVEL = {0|1|2|3}| PLSQL_CONN_MEM_LIMIT = n | PLSQL_CCFLAGS = 'name1:value1, name2:value2,..., nameN:valueN' | PLSQL_SESSION_CACHED_CURSORS = n | REPLICATION_TRACK = TrackNumber | }
パラメータ
パラメータ | 説明 |
---|---|
|
接続の実行中に、コミット・バッファの最大サイズを変更します。nは整数で表現され、コミット・バッファの最大サイズ(MB)を示します。 変更は次のトランザクションから有効になります。
コミット・バッファおよびトランザクションの再利用操作の詳細は、『Oracle TimesTen In-Memory Databaseオペレーションガイド』のトランザクションの再利用操作に関する項、および『Oracle TimesTen In-Memory Databaseリファレンス』のCommitBufferSizeMaxに関する項を参照してください。 ノート: 同等の接続属性は |
|
表または順序のいずれかの作成時に表または順序をアクティブ・スタンバイ・ペアに含めるには、
この属性が有効なのは、 詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のアクティブ・スタンバイ・ペアでのDDL変更に関する項を参照してください。 ノート: 同等の接続属性は |
|
DDLがアクティブ・スタンバイ・ペアのすべてのデータベースにわたってレプリケートされるかどうかを指定します。値は次のいずれかです。
詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のアクティブ・スタンバイ・ペアでのDDL変更に関する項を参照してください。 ノート: 同等の接続属性は |
|
分離レベルを設定します。変更は次のトランザクションから有効になります。 分離レベルの詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のトランザクションの分離レベルに関する項を参照してください。 ノート: 同等の接続属性は |
|
言語の比較に使用する照合の順序を示します。 大/小文字を区別しないソートの場合またはアクセントを区別しないソートの場合は、
大/小文字を区別しないソートまたはアクセントを区別しないソートの詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の大/小文字を区別しない言語ソートまたはアクセントを区別しない言語ソートに関する項を参照してください。 |
|
長さセマンティクス構成のデフォルトを設定します。 長さセマンティクスの詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の長さセマンティクスおよびデータ記憶域に関する項を参照してください。 |
|
|
|
PL/SQLプロシージャが自動的に終了されるまでの実行時間を制御します。 この値を変更すると、新しい値は、現在実行しているPL/SQLプログラム・ユニットおよび同じ接続でこの後実行される他のすべてのプログラム・ユニットに影響します。 タイムアウト値の設定の詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のSQLおよびPL/SQLのタイムアウト値の選択に関する項を参照してください。 |
|
PL/SQLライブラリ・ユニットのコンパイルに使用する最適化レベルを指定します。設定値が高いほど、コンパイラでPL/SQLライブラリ・ユニットを最適化するのに多くの処理が必要になります。可能な値は0、1、2または3です。デフォルトは2です。 詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のPLSQL_OPTIMIZE_LEVELに関する項を参照してください。 |
|
この接続でPL/SQLが使用できるプロセス・ヒープ・メモリーの最大量を指定します。 詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のPLSQL_CONN_MEM_LIMITに関する項を参照してください。 |
|
PL/SQLユニットの条件付きコンパイルを制御する問合せディレクティブを指定し、確認する条件に応じて、PL/SQLプログラムの機能をカスタマイズできます。たとえば、デバッグ機能をアクティブ化するには、次のようにします。 PLSQL_CCFLAGS = 'DEBUG:TRUE' |
|
キャッシュするセッション・カーソルの最大数を指定します。デフォルトは50です。値の範囲は1から65535です。 TimesTenの |
|
追跡ベース・パラレル・レプリケーションを管理している場合は、レプリケーション追跡に接続を割り当てることができます。接続によって発行されたすべてのトランザクションは、追跡が変更されないかぎり、この追跡に割り当てられます。 指定された番号が、存在しないレプリケーション・トラック 先行する操作がすべて読取り操作だった場合を除き、トランザクションの途中でトラックを変更することはできません。 詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』の自動パラレル・レプリケーション環境内のレプリケーション・トラックの指定に関する項を参照してください。 同等の接続属性は |
説明
-
ALTER SESSION
文は、そのセッションで次に実行されるコマンドから作用します。ALTER
SESSION
は暗黙的なコミットを実行しません。 -
クライアント・フェイルオーバーの場合、
ALTER
SESSION
文が失敗した接続で発行された場合は、その設定は表示されず、新しい接続に継承されます。ALTER
SESSION
文を再発行して、そのパラメータの値を再指定する必要があります。クライアント・フェイルオーバーの詳細は、TimesTen Classicの場合は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の自動クライアント・フェイルオーバーの使用に関する項を参照してください。また、TimesTen Scaleoutの場合は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』のクライアント接続のフェイルオーバーに関する項を参照してください。 -
文字比較を含む演算では、言語を区別する照合順番がサポートされています。大/小文字を区別しないソートは、
DISTINCT
値の解釈に影響することがあります。 -
CHAR
とNCHAR
間の暗黙的および明示的な変換がサポートされています。 -
サポートされている文字セットで、SQL文字列関数を使用できます。たとえば、
UPPER
およびLOWER
関数では、ASCII
以外のCHAR
およびVARCHAR2
文字とNCHAR
およびNVARCHAR2
文字がサポートされています。 -
選択した文字セットによっては、
CHAR
およびVARCHAR2
列のデータに対するメモリー消費に影響する可能性があります。 -
レプリケーション・スキームに含まれるすべてのデータベースの文字セットが一致している必要があります。
-
既存の表をアクティブ・スタンバイ・ペアに追加するには、
DDL_REPLICATION_LEVEL
を2以上に設定し、DDL_REPLICATION_ACTION
をINCLUDE
に設定します。または、DDL_REPLICATION_ACTION
がEXCLUDE
に設定されている場合は、ALTER ACTIVE STANDBY PAIR ... INCLUDE TABLE
文を使用できます。この場合、ALTER ACTIVE STANDBY PAIR ... INCLUDE TABLE
文を実行すると表の内容は切り捨てられるため、この文を実行する前に、表は空であり、すべてのデータベースに存在している必要があります。 -
既存の順序またはビューをアクティブ・スタンバイ・ペアに追加するには、
DDL_REPLICATION_LEVEL
を3に設定します。順序をレプリケーション・スキームに含めるには、DDL_REPLICATION_ACTION
をINCLUDE
に設定する必要があります。これは、マテリアライズド・ビューには適用されません。 -
オブジェクトは、受信側データベースがそのレベルのレプリケーションをサポートするTimesTenリリースであり、アクティブ・スタンバイ・ペアのレプリケーション・スキーム用に構成されている場合にのみレプリケートされます。たとえば、11.2.2.7.0より前のデータベース・リリースへの順序のレプリケーション(
DDL_REPLICATION_LEVEL=3
が必要)は、サポートされません。受信側データベースは、DDL_REPLICATION_LEVEL=2
でサポートされているオブジェクトのレプリケーション用に、リリース11.2.1.8.0以上である必要があります。
例
ALTER
SESSION
文を使用してCOMMIT_BUFFER_SIZE_MAX
を500MBに設定します。まず、ttConfiguration
をコールして現在の接続設定を表示します。ALTER
SESSION
文を使用して、COMMIT_BUFFER_SIZE_MAX
を500に変更します。ttConfiguration
をコールして、新しい設定を表示します。
Command> CALL ttConfiguration ('CommitBufferSizeMax'); < CommitBufferSizeMax, 0 > 1 row found. Command> ALTER SESSION SET COMMIT_BUFFER_SIZE_MAX = 500; Session altered. Command> CALL ttConfiguration ('CommitBufferSizeMax'); < CommitBufferSizeMax, 500 > 1 row found.
ALTER SESSION
文を使用して、PLSQL_TIMEOUT
を60秒に変更します。2つ目のALTER SESSION
文を使用して、PLSQL_OPTIMIZE_LEVEL
を3に変更します。次に、ttConfiguration
をコールして新しい値を表示します。
Command> ALTER SESSION SET PLSQL_TIMEOUT = 60; Session altered. Command> ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL = 3; Session altered. Command> CALL TTCONFIGURATION (); < CkptFrequency, 600 > < CkptLogVolume, 0 > < CkptRate, 0 > ... < PLSQL_OPTIMIZE_LEVEL, 3 > < PLSQL_TIMEOUT, 60 > ... 47 rows found.
この例では、PLSQL_TIMEOUT
を20秒に設定します。無限にループするプログラムを実行してみます。20秒で実行が終了し、エラーが戻されます。
Command> ALTER SESSION SET PLSQL_TIMEOUT = 20; Command> DECLARE v_timeout NUMBER; BEGIN LOOP v_timeout :=0; EXIT WHEN v_timeout < 0; END LOOP; END; / 8509: PL/SQL execution terminated; PLSQL_TIMEOUT exceeded
次の例では、ALTER SESSION
文を使用してNLS_SORT
設定をBINARY
からBINARY_CI
に変更し、さらにBINARY_AI
に変更しています。データベースおよび接続の文字セットはWE8ISO8859P1
です。
Command> connect "dsn=cs;ConnectionCharacterSet=WE8ISO8859P1"; Connection successful: DSN=cs;UID=user;DataStore=/datastore/user/cs; DatabaseCharacterSet=WE8ISO8859P1; ConnectionCharacterSet=WE8ISO8859P1;PermSize=32; (Default setting AutoCommit=1) Command> -- Create the Table Command> CREATE TABLE collatingdemo (letter VARCHAR2 (10)); Command> -- Insert values Command> INSERT INTO collatingdemo VALUES ('a'); 1 row inserted. Command> INSERT INTO collatingdemo VALUES ('A'); 1 row inserted. Command> INSERT INTO collatingdemo VALUES ('Y'); 1 row inserted. Command> INSERT INTO collatingdemo VALUES ('ä'); 1 row inserted. Command> -- SELECT Command> SELECT * FROM collatingdemo; < a > < A > < Y > < ä > 4 rows found. Command> --SELECT with ORDER BY Command> SELECT * FROM collatingdemo ORDER BY letter; < A > < Y > < a > < ä > 4 rows found. Command>-- set NLS_SORT to BINARY_CI and SELECT Command> ALTER SESSION SET NLS_SORT = BINARY_CI; Command> SELECT * FROM collatingdemo ORDER BY letter; < a > < A > < Y > < Ä > < ä > 4 rows found. Command> -- Set NLS_SORT to BINARY_AI and SELECT Command> ALTER SESSION SET NLS_SORT = BINARY_AI; Command> SELECT * FROM collatingdemo ORDER BY letter; < ä > < a > < A > < Y > 4 rows found.
次の例では、コミット依存性を無効にした自動パラレル・レプリケーションを有効にします。ALTER SESSION
文を使用して、現在の接続のレプリケーション・トラック数を5に変更します。レプリケーション・スキームのコミット依存性を無効にした自動パラレル・レプリケーションを有効にするには、ReplicationApplyOrdering
を2に設定します。次に、REPLICATION_TRACK
は常にReplicationParallelism
以下の番号に設定します。たとえば、ReplicationParallelism
接続属性を、REPLICATION_TRACK
に設定された値である5よりも大きい6に設定できます。
Command> ALTER SESSION SET REPLICATION_TRACK = 5; Session altered.
次の例では、変更スタンバイ・レプリケーション・ペアのアクティブ・データベースでDDL_REPLICATON_LEVEL
を2
に設定し、DDLReplicationAction
を'INCLUDE'
に設定して、列、表、シノニムおよび索引の追加および削除のレプリケーションを有効にします。
Command > ALTER SESSION SET DDL_REPLICATION_LEVEL=2; Session altered. Command > ALTER SESSION SET DDL_REPLICATION_ACTION='INCLUDE'; Session altered.
ノート:
DDL_REPLICATION_LEVEL
およびDDL_REPLICATION_ACTION
の同等の接続属性は、それぞれDDLReplicationLevel
およびDDLReplicationAction
です。
ALTER TABLE
ALTER TABLE
文は、既存の表定義を変更します。
ALTER
TABLE
文は、TimesTen ScaleoutおよびTimesTen Classicでサポートされています。ただし、構文とセマンティクスでは違いがあります。わかりやすくするために、サポートされている構文、パラメータ、説明(セマンティクス)およびTimesTen ScaleoutとTimesTen Classicの例は、TimesTen Scaleoutでの使用方法とTimesTen Classicでの使用方法に分けられています。使用方法に繰返しがありますが、構文からパラメータへ進み、セマンティクスから各使用方法の例に進むことができるように、このような方法で示されています。
必要な権限セクションを確認してから、次を確認してください。
必要な権限
表の所有者に必要な権限はありません。
別のユーザーの表の場合はALTER ANY TABLE
が必要です。
ALTER TABLE...ADD FOREIGN KEY
の場合、変更される表の所有者に、外部キー句で参照される表のREFERENCES
権限が必要です。
この項を確認した後、次を参照してください。
ALTER TABLE: TimesTen Scaleoutでの使用方法
この文は、TimesTen Scaleoutでサポートされています。列ベースの圧縮およびエージングはサポートされていません。
次を参照してください。
ALTER TABLE: TimesTen Classicでの使用方法
次を参照してください。
ALTER TABLEのSQL構文: TimesTen Scaleout
TimesTen Scaleoutでの分散キーの変更:
ALTER TABLE [Owner.]TableName DistributionClause
主キー制約を追加して、オプションでグローバル索引またはローカル索引を指定するには:
ノート: (
CreateIndexStmt
)
は、TimesTenのCREATE
INDEX
文を表すために使用する句です。カッコ( )
が必要です。主キー制約の要件に応じて、一意索引を作成する必要があります。詳細は、「CREATE INDEX」を参照してください。
ALTER TABLE [Owner.]TableName ADD CONSTRAINT ConstraintName
PRIMARY KEY (ColumnName [,... ]) [(UsingIndexClause2)]
UsingIndexClause2::= USING INDEX {GLOBAL|LOCAL} [USE HASH INDEX PAGES=RowPages
|CURRENT]|
USING INDEX (CreateIndexStmt)
ノート:
ALTER TABLE
を使用して主キー制約を削除することはできません。制約を削除するには、表を削除してから再作成する必要があります。
列に一意制約を追加して、オプションでグローバル索引またはローカル索引を指定するには:
ノート: (
CreateIndexStmt
)
は、TimesTenのCREATE
INDEX
文を表すために使用する句です。カッコ( )
が必要です。一意制約の要件に応じて、一意索引を作成する必要があります。詳細は、「CREATE INDEX」を参照してください。
ALTER TABLE Owner.]TableName
ADD UNIQUE (ColumnName)
[UsingIndexClause1]
UsingIndexClause1::= USING INDEX {GLOBAL | LOCAL}| USING INDEX (CreateIndexStmt)
1つの列の追加:
ALTER TABLE [Owner.]TableName ADD [COLUMN] ColumnName ColumnDataType [DEFAULT DefaultVal] [[NOT] INLINE] [UNIQUE] [NULL] [COMPRESS (CompressColumns [,...])]
複数の列の追加:
ALTER TABLE [Owner.]TableName ADD (ColumnName ColumnDataType [DEFAULT DefaultVal] [[NOT] INLINE] [UNIQUE] [NULL] [,... ] )
NOT
NULL
列の追加(注意: DEFAULT
句が必要):
ALTER TABLE [Owner.]TableName ADD [COLUMN] ColumnName ColumnDataType NOT NULL [ENABLE] DEFAULT DefaultVal [[NOT] INLINE] [UNIQUE]
複数のNOT
NULL
列の追加(注意: DEFAULT
句が必要):
ALTER TABLE [Owner.]TableName ADD (ColumnName ColumnDataType NOT NULL [ENABLE] DEFAULT DefaultVal [[NOT] INLINE] [UNIQUE] [,...])
列の削除。
ALTER TABLE [Owner.]TableName DROP {[COLUMN] ColumnName | (ColumnName [,... ] )}
外部キーおよびON DELETE CASCADE
(オプション)の追加:
ALTER TABLE [Owner.]TableName ADD [CONSTRAINT ForeignKeyName] FOREIGN KEY (ColumnName [,...]) REFERENCES RefTableName [(ColumnName [,...])] [ON DELETE CASCADE]
外部キーの削除:
ALTER TABLE [Owner.]TableName DROP CONSTRAINT ForeignKeyName
ハッシュ索引のサイズ変更:
ALTER TABLE [Owner.]TableName SET PAGES = RowPages | CURRENT
主キーで使用する索引をハッシュ索引に変更:
ALTER TABLE [Owner.]TableName USE HASH INDEX PAGES = RowPages | CURRENT
主キーで使用する索引をUSE RANGE INDEX
句で範囲索引に変更するには、次のように実行します。
ALTER TABLE [Owner.]TableName USE RANGE INDEX
列のデフォルト値の変更:
ALTER TABLE [Owner.]TableName MODIFY (ColumnName DEFAULT DefaultVal)
列の一意制約を削除するには:
ALTER TABLE Owner.]TableName DROP UNIQUE (ColumnName)
NULL値可能な列のデフォルト値をNULL
に変更することによるデフォルト値の削除:
ALTER TABLE [Owner.]TableName MODIFY (ColumnName DEFAULT NULL)
ALTER TABLE ADD CONSTRAINT PRIMARY KEYのパラメータ: TimesTen Scaleout
パラメータ | 説明 |
---|---|
ALTER TABLE [Owner.] TableName |
ALTER TABLE 文の冒頭部分。表の名前は必須です。所有者はオプションです。
|
ADD CONSTRAINT ConstraintName PRIMARY KEY |
主キー制約の追加によって表が変更されることを示す句。ConstraintName は、制約の名前です。主キー制約は追加すると削除できなくなります。表を削除する必要があります。
|
(ColumnName [,…]) |
(ColumnName) は必須です。主キー制約に使用する列を指定します。
|
[UsingIndexClause2] |
UsingIndexClause2 はオプションです。説明は、この表の残りの部分に示します。ALTER TABLE の定義には、2つのUSING INDEX 句を指定できません。
|
USING INDEX {GLOBAL|LOCAL} |
[UsingIndexClause2] の一部: 指定することで、主キーにグローバル索引またはローカル索引を作成するかどうかを示します。
|
USE HASH INDEX PAGES = RowPages|CURRENT |
USING INDEX {GLOBAL|LOCAL} 句の一部であり、オプションです。指定することで、主キーに一意のハッシュ索引を作成することを示します。指定しないと、一意の範囲索引が作成されます。グローバル索引とローカル索引の両方に使用できます。
TimesTenでは、表に行がない場合は、 |
USING INDEX (CreateIndexStmt) |
[UsingIndexClause2] 句の一部。このUSING INDEX 句が指定されている場合、(CreateIndexStmt) 句は、TimesTenのCREATE INDEX 文に従って索引を定義することを示します。カッコ( ) が必要です。主キー制約の要件に応じて、一意索引を作成する必要があります。CREATE INDEX 文の詳細は、「CREATE INDEX」を参照してください。
|
ALTER TABLE ADD UNIQUE CONSTRAINTのパラメータ: TimesTen Scaleout
パラメータ | 説明 |
---|---|
ALTER TABLE [Owner.] TableName |
ALTER TABLE 文の冒頭部分。表の名前は必須です。所有者はオプションです。
|
ADD UNIQUE (ColumnName [,…])
|
一意制約の追加によって表が変更されることを示す句。(ColumnName) は必須です。一意制約に使用する列を指定します。
|
[UsingIndexClause1] |
UsingIndexClause1 はオプションです。説明は、この表の残りの部分に示します。ALTER TABLE の定義には、2つのUSING INDEX 句を指定できません。この句を使用すると、PRIMARY KEY に対するグローバル索引またはローカル索引を定義できます |
USING INDEX {GLOBAL|LOCAL} |
[UsingIndexClause1] 句の一部。指定することで、一意制約にグローバル索引またはローカル索引を作成するかどうかを示します。
|
USING INDEX (CreateIndexStmt) |
[UsingIndexClause1] 句の一部。このUSING INDEX 句が指定されている場合、(CreateIndexStmt) 句は、TimesTenのCREATE INDEX 文に従って索引を定義することを示します。カッコ( ) が必要です。一意制約の要件に応じて、一意索引を作成する必要があります。CREATE INDEX 文の詳細は、「CREATE INDEX」を参照してください。
|
ALTER TABLEの追加パラメータ: TimesTen Scaleout
パラメータ | 説明 |
---|---|
|
変更する表を指定します。 |
|
構文の詳細は、「CREATE TABLE」を参照してください。 |
|
列 |
|
指定した列の属性を新しい値に変更します。 |
|
列がデフォルト値( 列のデフォルト値を変更しても、既存の行は変更されません。 ノート: レプリケーション・スキームの一部である表に |
|
|
|
追加する列のデータ型です。追加のパラメータが必要なデータ型もあります。指定できるデータ型の詳細は、「データ型」を参照してください。 |
|
列を追加する場合に、 |
|
デフォルトでは、宣言された列の長さが128バイトより大きい可変長の列は表外に保存されます。宣言された列の長さが128バイト以下の可変長の列は、表内に保存されます。 |
|
外部キーを削除することを指定します。オプションで、追加された外部キーの名前をユーザーが指定するように指定します。 |
DROP UNIQUE (ColumnName) |
一意制約が削除されることを示します。ColumnName は、制約の名前です。
|
|
追加または削除する外部キーの名前です。すべての外部キーは、ユーザーが名前を指定しなかった場合、デフォルトの名前が割り当てられます。ユーザーが指定した名前またはシステムの名前のいずれかを |
|
外部キーを追加することを指定します。 |
|
外部キーが別の表を参照することを指定します。 |
|
外部キーが参照する表の名前です。 |
|
|
|
主キーで使用する索引をハッシュ索引に変更します。主キーですでにハッシュ索引を使用している場合、この句は |
|
主キーで使用する索引を範囲索引に変更します。主キーですでに範囲索引を使用している場合、この句は無視されます。 |
|
表の想定ページ数に基づいてハッシュ索引のサイズを変更します。
TimesTenでは、表に行がない場合は、 推定した数が小さすぎると、パフォーマンスが悪化します。ハッシュ索引の詳細は、「列定義: TimesTen Scaleout」を参照してください。 |
ALTER TABLE ADD PRIMARY KEYの説明: TimesTen Scaleout
ALTER
TABLE
の定義には、PRIMARY
KEY
句の後に追加の句を指定するオプションがあります。この句を使用すると、主キー制約に対するグローバル索引またはローカル索引を指定できます。
-
USING
INDEX {GLOBAL | LOCAL}
句は、主キー制約に対するグローバル索引またはローカル索引を指定できるようにする1つのオプションです。GLOBAL
またはLOCAL
のキーワードを指定する必要があります。ハッシュ索引を定義する場合は、USING
INDEX {GLOBAL | LOCAL}
句の後にオプションでUSE
HASH
INDEX
句を指定できます。 USING INDEX (CreateIndexStmt)
句は、グローバル索引またはローカル索引を指定する別のオプションです。(CreateIndexStmt)
句は、TimesTenのCREATE
INDEX
文に従って索引を定義することを示します。カッコ( )
が必要です。主キー制約の要件に応じて、一意索引を作成する必要があります。CREATE
INDEX
文の詳細は、「CREATE INDEX」を参照してください。
ノート:
ALTER
TABLE
の定義では、USING
INDEX {GLOBAL | LOCAL}
とUSING INDEX (CreateIndexStmt)
の両方を使用することはできません。どちらかの句を指定するか、どちらの句も指定しないでください。
グローバル索引とローカル索引およびそれらのTimesTen Scaleoutでの使用の詳細は、「CREATE INDEX」を参照してください。
ALTER TABLE ADD UNIQUEの説明: TimesTen Scaleout
ALTER
TABLE
の定義には、UNIQUE
句の後に追加の句を指定するオプションがあります。この句を使用すると、一意制約に対するグローバル索引またはローカル索引を指定できます。
-
USING
INDEX {GLOBAL | LOCAL}
句は、主キー制約に対するグローバル索引またはローカル索引を指定できるようにする1つのオプションです。GLOBAL
またはLOCAL
のキーワードを指定する必要があります。 USING INDEX (CreateIndexStmt)
句は、グローバル索引またはローカル索引を指定する別のオプションです。(CreateIndexStmt)
句は、TimesTenのCREATE
INDEX
文に従って索引を定義することを示します。カッコ( )
が必要です。一意制約の要件に応じて、一意索引を作成する必要があります。CREATE
INDEX
文の詳細は、「CREATE INDEX」を参照してください。
ノート:
ALTER
TABLE
の定義では、USING
INDEX {GLOBAL | LOCAL}
とUSING INDEX (CreateIndexStmt)
の両方を使用することはできません。どちらかの句を指定するか、どちらの句も指定しないでください。
グローバル索引とローカル索引およびそれらのTimesTen Scaleoutでの使用の詳細は、「CREATE INDEX」を参照してください。
ALTER TABLEの追加情報: TimesTen Scaleout
-
表を変更してデフォルトを変更したり、列と制約を追加および削除できます。ただし、表が空でない場合は、分散スキームを変更できません。また、
DISTRIBUTE
BY
REFERENCE
句で指定された制約は削除できません。分散スキームの詳細は、「CREATE TABLE」を参照してください。詳細は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』の表の変更に関する項を参照してください。 -
ALTER TABLE
文を使用して一時表を変更することはできません。 -
ALTER TABLE ADD [COLUMN]
ColumnName
文は、既存の表に1つ以上の新しい列を追加します。1つ以上の列を追加した場合、新しい列は、新しい1つのパーティション内の表のすべての既存の行の最後に追加されます。 -
マテリアライズド・ビューから参照されている列は削除できません。
-
列の追加、列の削除、およびキャッシュ・グループ表の制約の追加に
ALTER
TABLE
文は使用できません。 -
追加される列の数に関係なく、1文につき1つのパーティションのみが表に追加されます。
-
表に
ALTER
を実行して、デフォルト値を持つNOT
NULL
列を追加します。DEFAULT
句は必須です。次の制限があります。-
この列を主キー列として使用することはできません。具体的には、
ALTER
TABLE
ADD
ConstraintName
PRIMARY
KEY
(
ColumnName
[,...])
文では、その列を指定できないということです。
-
-
新しい列に対してデフォルト値が指定されている場合を除き、追加されるすべての列の初期値は
NULL
です。 -
表の列の合計数は1000以下です。また、表のパーティションの合計数は1000以下であり、そのうちの1つはTimesTenによって使用されます。
-
グローバル一時表で
ADD CONSTRAINT ... PRIMARY KEY
句を指定しないでください。 -
ALTER TABLE ADD
文の結果として、問合せ時に新しい各パーティションに対して追加の読取りが発生します。このため、変更された表のパフォーマンスがわずかに悪化することがあります。パフォーマンスを回復するには、表を削除して再作成するか、またはttMigrate create -c
-relaxedUpgrade
コマンドを使用してから、ttRestore -r
-relaxedUpgrade
コマンドを使用して表をリストアします。追加された列を削除しても、悪化したパフォーマンスは回復されず、パーティションの数も減りません。 -
ALTER TABLE DROP
文を使用して既存の表から1つ以上の列を削除すると、削除された列は、表の現在のすべての行から削除されます。それ以降のSQL文では、削除した列は使用できなくなります。表の主キーに含まれている列は削除できません。また、表の外部キーに含まれている列も、すべての外部キーを削除しないかぎり削除できません。索引付けされた列は、列の索引をすべて削除しないかぎり削除できません。ALTER TABLE
を使用して表の列をすべて削除することはできません。かわりにDROP TABLE
を使用します。 -
表から列が削除された場合、その表を参照するすべてのコマンドを再コンパイルする必要があります。削除された列が参照されると、再コンパイル時にエラーが発生することがあります。アプリケーションはそのコマンドを再度準備し、パラメータと結果列を再作成する必要があります。列が表に追加された場合、
SELECT *
文を含むコマンドは無効になります。これらのコマンドのみを再度準備する必要があります。その他のすべてのコマンドは、想定したとおりに動作します。 -
列を削除しても、列の領域は解放されません。
-
UNIQUE
制約を追加すると、(領域の増加および処理時間の増加という点で)オーバーヘッドが発生します。これは、UNIQUE
制約を維持するための索引が作成されるためです。UNIQUE
制約を維持するために使用している索引を、DROP INDEX
文を使用して削除することはできません。 -
UNIQUE
制約とそれに関連付けられている索引は、レプリケートされた表の一意索引として使用されている場合、削除できません。 -
アプリケーションで表の主キーに対して範囲問合せを実行する場合は、
ALTER TABLE...USE RANGE INDEX
を使用します。 -
アプリケーションで表の主キーに対して完全一致検索を実行する場合は、
ALTER TABLE...USE HASH INDEX
を使用します。 -
表に主キーがない場合、
USE HASH INDEX
句またはUSE RANGE INDEX
句を指定すると、エラーが生成されます。 -
子表の外部キー制約で
ON DELETE CASCADE
を指定している場合、ユーザーは、子表のDELETE
権限を明示的に必要とせずに、DELETE
権限を持つ親表から行を削除できます。 -
ON DELETE CASCADE
トリガー・アクションを変更するには、外部キー制約を削除して再定義してください。 -
ON DELETE CASCADE
は、マテリアライズド・ビューのディテール表でサポートされています。子表に対して定義されたマテリアライズド・ビューがある場合、親表からの削除によって子表でカスケード削除が行われます。つまり、親表での削除により、マテリアライズド・ビューも変更されます。 -
DELETE
文によって報告される行の総数には、ON DELETE CASCADE
アクションの結果、子表から削除された行は含まれません。 -
ON DELETE CASCADE
: 親表から子表へのパスが異なる場合があるため、次のルールが適用されます。 -
親表から子表へのすべてのパスを、deleteパスかdo not deleteパスのいずれかに統一します。
-
deleteパスのすべての子表で
ON DELETE CASCADE
を指定します。 -
このルールは、1つの親表から複数の子表へ、または複数の親表から1つの子表へのパスには適用されません。
-
-
ON DELETE CASCADE
: 第2のルールも適用されます。 -
ある表にdeleteパスでアクセスする場合、その表のすべての子表にもdeleteパスでアクセスします。
-
ALTER TABLE ADD/DROP CONSTRAINT
文には、次の制限があります。-
外部キーが削除されると、TimesTenでは外部キーに関連付けられている索引も削除されます。通常の
DROP INDEX
文を使用して外部キーに関連付けられている索引を削除しようとすると、エラーになります。 -
外部キーは、ビューまたは一時表では追加または削除できません。
-
ALTER TABLE
を使用して主キー制約を削除することはできません。制約を削除するには、表を削除してから再作成する必要があります。
-
例: TimesTen Scaleoutのグローバル索引を使用した主キー制約の追加
次に示す例は、ALTER
TABLE ADD PRIMARY KEY
でグローバル索引を使用するための様々な構文の使用を示しています。
USING
INDEX
GLOBAL
句を指定します。表を削除します。Command> CREATE TABLE mytab1 (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL,
a TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b);
Command> ALTER TABLE mytab1 ADD CONSTRAINT pk PRIMARY KEY (c,b) USING INDEX GLOBAL;
Command> indexes mytab1;
Indexes on table SAMPLEUSER.MYTAB1:
PK: global unique range index on columns:
C
B
1 index found.
1 index found on 1 table.
Command> DROP TABLE mytab1;
表を作成します。表を変更することで主キー制約を追加します。USING
INDEX
GLOBAL
をUSE
HASH
INDEX
PAGES
句とともに指定します。表を削除します。
Command> CREATE TABLE mytab1 (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL,
a TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b);
Command> ALTER TABLE mytab1 ADD CONSTRAINT pk PRIMARY KEY (c,b)
USING INDEX GLOBAL USE HASH INDEX PAGES =200;
Command> INDEXES mytab1;
Indexes on table SAMPLEUSER.MYTAB1:
PK: global unique hash index on columns:
C
B
1 index found.
1 index found on 1 table.
Command> DROP TABLE mytab1;
表を作成します。表を変更することで主キー制約を追加します。USING
INDEX
(CreateIndexStmt)
句を指定します。(CreateIndexStmt)
句は、TimesTenのCREATE
INDEX
文です。この文の詳細は、「CREATE INDEX」を参照してください。
Command> CREATE TABLE mytab1 (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL,
a TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b);
Command> ALTER TABLE mytab1 ADD CONSTRAINT pk PRIMARY KEY (c,b)
USING INDEX (CREATE GLOBAL UNIQUE HASH INDEX myglobalix ON mytab1 (c,b) PAGES =200);
Command> indexes mytab1;
Indexes on table SAMPLEUSER.MYTAB1:
MYGLOBALIX: global unique hash index on columns:
C
B
1 index found.
1 index found on 1 table.
Command> DROP TABLE mytab1;
USING
INDEX
GLOBAL|LOCAL
句にはUSING INDEX (CreateIndexStmt)
句を使用できないことを示しています。Command> CREATE TABLE mytab1 (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL,
a TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b);
Command> ALTER TABLE mytab1 ADD CONSTRAINT pk PRIMARY KEY (c,b)
USING INDEX GLOBAL USE HASH INDEX PAGES = 200
USING INDEX (CREATE GLOBAL UNIQUE HASH INDEX myglobalix ON mytab1 (c,b) PAGES =200);
1001: Syntax error in SQL statement before or at: "USING", character position: 102
...USING INDEX GLOBAL USE HASH INDEX PAGES = 200 USING INDEX (CREATE G...
^^^^^
The command failed.
例: TimesTen Scaleoutのグローバル索引を使用した一意制約の追加
次に示す例は、ALTER
TABLE ADD UNIQUE CONSTRAINT
でグローバル索引を使用するための様々な構文の使用を示しています。
表を作成します。表を変更することで一意制約を追加します。表を削除します。表を再作成して、一意制約を追加し、USING
INDEX
GLOBAL
句を指定します。
Command> CREATE TABLE mytab1 (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL,
a TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b);
Command> ALTER TABLE mytab1 ADD UNIQUE (a);
Command> indexes mytab1;
Indexes on table SAMPLEUSER.MYTAB1:
TTUNIQUE_6E6: unique range index on columns:
A
1 index found.
1 index found on 1 table.
Command> DROP TABLE mytab1;
Command> CREATE TABLE mytab1 (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL,
a TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b);
Command> ALTER TABLE mytab1 ADD UNIQUE (a) USING INDEX GLOBAL;
Command> indexes mytab1;
Indexes on table SAMPLEUSER.MYTAB1:
$GUA8C5B4ECE6D8: global unique range index on columns:
A
1 index found.
1 index found on 1 table.
Command> DROP TABLE mytab1;
表を作成します。一意制約を追加することで表を変更し、USING
INDEX
(CreateIndexStmt)
句を使用してローカル一意索引を作成します。別の一意制約を追加することで表を再度変更します。USING
INDEX
(CreateIndexStmt)
句を使用して、グローバル一意索引を作成します。
Command> CREATE TABLE mytab1 (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL,
a TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b);
Command> ALTER TABLE mytab1 ADD UNIQUE (b) USING INDEX (CREATE UNIQUE INDEX myuniqueidxB ON mytab1 (b));
Command> indexes mytab1;
Indexes on table SAMPLEUSER.MYTAB1:
MYUNIQUEIDXB: unique range index on columns:
B
1 index found.
1 index found on 1 table.
Command> ALTER TABLE mytab1 ADD UNIQUE (c) USING INDEX (CREATE GLOBAL UNIQUE INDEX myuniqueidxC ON mytab1 (c));
Command> indexes mytab1;
Indexes on table SAMPLEUSER.MYTAB1:
MYUNIQUEIDXB: unique range index on columns:
B
MYUNIQUEIDXC: global unique range index on columns:
C
2 indexes found.
2 indexes found on 1 table.
Command> DROP TABLE mytab1;
ALTER TABLEのその他の例: TimesTen Scaleout
表6-6に、表の変更に関連付けられているルールを示します。サポートされている例を次に示します。
表6-6 ALTER TABLEルール
ALTER文 | コメント |
---|---|
ALTER TABLE t1 ADD CONSTRAINT c1 PRIMARY KEY (p); |
表に主キー制約が追加されます。分散キーは変更されません。 |
CREATE TABLE t1 (c1 NUMBER, c2 VARCHAR2 (10)); ALTER TABLE t1 DISTRIBUTE BY HASH (c1); |
表が空の場合、操作は成功します。表が空でない場合、空でない表では分散キーを変更できないため、操作は失敗します。 |
ALTER TABLE t1 ADD CONSTRAINT c1 FOREIGN KEY (f1)REFERENCES t2 (c2); |
操作が成功します。 |
CREATE TABLE t1...CONSTRAINT fk1... DISTRIBUTE BY REFERENCE(fk1); ALTER TABLE t1 DROP CONSTRAINT(fk1); |
操作が失敗します。表を分散するために外部キーが使用されます。 |
次に示す例は、「表6-6」の表に示した情報をサポートします。
ALTER TABLEを使用した主キー制約の追加
この例では、主キーまたは分散句なしでmytable
表を作成します。表は、ハッシュによって非表示列に分散されます。次に、ALTER
TABLE
文を使用して主キー制約が追加されます。操作は成功しますが、分散キーは変更されません。
Command> CREATE TABLE mytable (col1 NUMBER NOT NULL, col2 VARCHAR2 (32)); Command> describe mytable; Table SAMPLEUSER.MYTABLE: Columns: COL1 NUMBER NOT NULL COL2 VARCHAR2 (32) INLINE DISTRIBUTE BY HASH 1 table found. (primary key columns are indicated with *)
ここで、表を変更して主キーを追加します。操作が成功します。分散スキームおよび分散キーは変更されません。
Command> ALTER TABLE mytable ADD CONSTRAINT c1 PRIMARY KEY (col1); Command> describe mytable; Table SAMPLEUSER.MYTABLE: Columns: *COL1 NUMBER NOT NULL COL2 VARCHAR2 (32) INLINE DISTRIBUTE BY HASH 1 table found. (primary key columns are indicated with *)
一意列に分散した表への主キー制約の追加
この例では、mytab
表を作成し、ハッシュによってデータをid2
一意列に分散します。この例では、次に、id
列に主キー制約を追加して、mytab
表を変更します。ttIsql
describe
コマンドは、表がハッシュによってid2
列に分散されたままであることを示します。
Command> CREATE TABLE mytab (id TT_INTEGER NOT NULL, id2 TT_INTEGER UNIQUE, id3 TT_INTEGER) distribute by hash (id2); Command> ALTER TABLE mytab ADD CONSTRAINT c1 PRIMARY KEY (id); Command> describe mytab; Table SAMPLEUSER.MYTAB: Columns: *ID TT_INTEGER NOT NULL ID2 TT_INTEGER UNIQUE ID3 TT_INTEGER DISTRIBUTE BY HASH (ID2) 1 table found. (primary key columns are indicated with *)
ALTER TABLEを使用した分散キーの変更
この例では、表が空の場合にのみ、ALTER
TABLE
文を使用して分散キーを変更できることを示します。
Command> CREATE TABLE mytable2 (col1 NUMBER NOT NULL, col2 VARCHAR2 (32)) DISTRIBUTE BY HASH (col1,col2); Command> describe mytable2; Table SAMPLEUSER.MYTABLE2: Columns: COL1 NUMBER NOT NULL COL2 VARCHAR2 (32) INLINE DISTRIBUTE BY HASH (COL1, COL2) 1 table found. (primary key columns are indicated with *)
ALTER
TABLE
文を使用して、分散キーをcol1
に変更します。表が空であるため、操作は成功します。
Command> ALTER TABLE mytable2 DISTRIBUTE BY HASH (col1); Command> describe mytable2; Table SAMPLEUSER.MYTABLE2: Columns: COL1 NUMBER NOT NULL COL2 VARCHAR2 (32) INLINE DISTRIBUTE BY HASH (COL1) 1 table found. (primary key columns are indicated with *)
データの行を挿入し、分散キーを再度col1
、col2
に変更することを試みます。表が空でないため、操作は失敗します。
Command> INSERT INTO mytable2 VALUES (10, 'test'); 1 row inserted. Command> commit; Command> ALTER TABLE mytable2 DISTRIBUTE BY HASH (col1,col2); 1069: Table not empty. Alter table distribution is only permitted on empty tables. The command failed.
分散キーの一部ではない外部キー制約の追加
この例では、まず、accounts
表とaccounts2
表を記述します。この例では、次に、accounts2
表を変更して、外部キー制約を追加します。この制約はaccounts2
表の分散に含まれていないため、操作は成功します。
Command> describe accounts; Table SAMPLEUSER.ACCOUNTS: Columns: *ACCOUNT_ID NUMBER (10) NOT NULL PHONE VARCHAR2 (15) INLINE NOT NULL ACCOUNT_TYPE CHAR (1) NOT NULL STATUS NUMBER (2) NOT NULL CURRENT_BALANCE NUMBER (10,2) NOT NULL PREV_BALANCE NUMBER (10,2) NOT NULL DATE_CREATED DATE NOT NULL CUST_ID NUMBER (10) NOT NULL DISTRIBUTE BY REFERENCE (FK_CUSTOMER) 1 table found. (primary key columns are indicated with *) Command> describe accounts2; Table SAMPLEUSER.ACCOUNTS2: Columns: *ACCOUNTS2_ID NUMBER (10) NOT NULL ACCOUNT_ORIG_ID NUMBER (10) NOT NULL STATUS NUMBER (2) NOT NULL DISTRIBUTE BY HASH (ACCOUNTS2_ID) 1 table found. (primary key columns are indicated with *) Command> ALTER TABLE accounts2 ADD CONSTRAINT accounts2_fk FOREIGN KEY (account_orig_id) REFERENCES accounts (account_id);
ttIsql
indexes
コマンドを使用して、accounts2_fk
制約が正常に作成されたことを示します。
Command> indexes accounts2; Indexes on table SAMPLEUSER.ACCOUNTS2: ACCOUNTS2: unique range index on columns: ACCOUNTS2_ID ACCOUNTS2_FK: non-unique range index on columns: ACCOUNT_ORIG_ID (foreign key index references table SAMPLEUSER.ACCOUNTS(ACCOUNT_ID)) 2 indexes found. 2 indexes found on 1 table.
分散キーとして使用される外部キー制約の削除試行
この例では、fk_accounts
制約の削除を試みます。制約が分散キーとして使用されているため、操作は失敗します。
Command> describe transactions; Table SAMPLEUSER.TRANSACTIONS: Columns: *TRANSACTION_ID NUMBER (10) NOT NULL *ACCOUNT_ID NUMBER (10) NOT NULL *TRANSACTION_TS TIMESTAMP (6) NOT NULL DESCRIPTION VARCHAR2 (60) INLINE OPTYPE CHAR (1) NOT NULL AMOUNT NUMBER (6,2) NOT NULL DISTRIBUTE BY REFERENCE (FK_ACCOUNTS) 1 table found. (primary key columns are indicated with *) Command> ALTER TABLE transactions DROP CONSTRAINT fk_accounts; 1072: Dropping a table's reference by distribution foreign key is not allowed. The command failed.
ALTER TABLEのSQL構文: TimesTen Classic
1つの列の追加:
ALTER TABLE [Owner.]TableName ADD [COLUMN] ColumnName ColumnDataType [DEFAULT DefaultVal] [[NOT] INLINE] [UNIQUE] [NULL] [COMPRESS (CompressColumns [,...])]
複数の列の追加:
ALTER TABLE [Owner.]TableName ADD (ColumnName ColumnDataType [DEFAULT DefaultVal] [[NOT] INLINE] [UNIQUE] [NULL] [,... ] ) [COMPRESS (CompressColumns [,...])]
NOT
NULL
列の追加(注意: DEFAULT
句が必要):
ALTER TABLE [Owner.]TableName ADD [COLUMN] ColumnName ColumnDataType NOT NULL [ENABLE] DEFAULT DefaultVal [[NOT] INLINE] [UNIQUE] [COMPRESS (CompressColumns [,...])]
複数のNOT
NULL
列の追加(注意: DEFAULT
句が必要):
ALTER TABLE [Owner.]TableName ADD (ColumnName ColumnDataType NOT NULL [ENABLE] DEFAULT DefaultVal [[NOT] INLINE] [UNIQUE] [,...]) [COMPRESS (CompressColumns [,...])]
CompressColumns
の構文は次のとおりです。
{ColumnDefinition | (ColumnDefinition [,...])} BY DICTIONARY [MAXVALUES = CompressMax]
列の削除。
ALTER TABLE [Owner.]TableName DROP {[COLUMN] ColumnName | (ColumnName [,... ] )}
ノート:
圧縮列グループの列を削除する場合は、圧縮列グループのすべての列を指定する必要があります。範囲索引を使用した主キー制約の追加:
ALTER TABLE [Owner.]TableName ADD CONSTRAINT ConstraintName PRIMARY KEY (ColumnName [,... ])
ハッシュ索引を使用した主キー制約の追加:
ALTER TABLE [Owner.]TableName ADD CONSTRAINT ConstraintName PRIMARY KEY (ColumnName [,... ]) USE HASH INDEX PAGES = RowPages | CURRENT
外部キーおよびON DELETE CASCADE
(オプション)の追加:
ALTER TABLE [Owner.]TableName ADD [CONSTRAINT ForeignKeyName] FOREIGN KEY (ColumnName [,...]) REFERENCES RefTableName [(ColumnName [,...])] [ON DELETE CASCADE]
外部キーの削除:
ALTER TABLE [Owner.]TableName DROP CONSTRAINT ForeignKeyName
ノート:
ALTER TABLE
を使用して主キー制約を削除することはできません。制約を削除するには、表を削除して再作成します。
ハッシュ索引のサイズ変更:
ALTER TABLE [Owner.]TableName SET PAGES = RowPages | CURRENT
主キーで使用する索引をハッシュ索引に変更:
ALTER TABLE [Owner.]TableName USE HASH INDEX PAGES = RowPages | CURRENT
主キーで使用する索引をUSE RANGE INDEX
句で範囲索引に変更するには、次のように実行します。
ALTER TABLE [Owner.]TableName USE RANGE INDEX
列のデフォルト値の変更:
ALTER TABLE [Owner.]TableName MODIFY (ColumnName DEFAULT DefaultVal)
列の一意制約の追加または削除:
ALTER TABLE Owner.]TableName {ADD | DROP} UNIQUE (ColumnName)
NULL値可能な列のデフォルト値をNULL
に変更することによるデフォルト値の削除:
ALTER TABLE [Owner.]TableName MODIFY (ColumnName DEFAULT NULL)
LRUエージングの追加:
ALTER TABLE [Owner.]TableName ADD AGING LRU [ON | OFF]
時間ベースのエージングの追加:
ALTER TABLE [Owner.]TableName ADD AGING USE ColumnName LIFETIME num1 {SECOND[S] | MINUTE[S] | HOUR[S] | DAY[S]} [CYCLE num2 {SECOND[S] | MINUTE[S] | HOUR[S] | DAY[S] }] [ON | OFF]
エージング状態の変更:
ALTER TABLE [Owner.]TableName SET AGING {ON | OFF}
エージングの削除:
ALTER TABLE [Owner.]TableName DROP AGING
存続期間の変更(時間ベースのエージングの場合):
ALTER TABLE [Owner.]TableName SET AGING LIFETIME num1 {SECOND[S] | MINUTE[S] | HOUR[S] | DAY[S]}
サイクルの変更(時間ベースのエージングの場合):
ALTER TABLE [Owner.]TableName SET AGING CYCLE num2 {SECOND[S] | MINUTE[S] | HOUR[S] | DAY[S]}
ALTER TABLEのパラメータ: TimesTen Classic
パラメータ | 説明 |
---|---|
|
変更する表を指定します。 |
|
列 |
|
指定した列の属性を新しい値に変更します。 |
|
列がデフォルト値( 列のデフォルト値を変更しても、既存の行は変更されません。 ノート: レプリケーション・スキームの一部である表に |
|
|
|
追加する列のデータ型です。追加のパラメータが必要なデータ型もあります。指定できるデータ型の詳細は、「データ型」を参照してください。 |
|
列を追加する場合に、 |
|
デフォルトでは、宣言された列の長さが128バイトより大きい可変長の列は表外に保存されます。宣言された列の長さが128バイト以下の可変長の列は、表内に保存されます。 |
|
圧縮が有効な表について圧縮列グループを定義します。表の1つ以上の列を含めることができます。 圧縮グループで複数列を定義する場合は、列を 各圧縮列グループは、最大16列に制限されます。 圧縮列の詳細は、「表の列ベースの圧縮(TimesTen Classic)」を参照してください。 |
|
各圧縮列グループの圧縮ディクショナリを定義します。 |
|
ディクショナリ表の場合、
MAXVALUES句を省略した場合の最大サイズのデフォルトは2 圧縮ディクショナリの最大サイズ指定の詳細は、「表の列ベースの圧縮(TimesTen Classic)」を参照してください。 |
|
表に主キー制約を追加します。主キーの列は 主キー制約を適用するために使用する索引の名前として 主キーに対してハッシュ索引を使用するには、
TimesTenでは、表に行がない場合は、 推定した数が小さすぎると、パフォーマンスが悪化します。ハッシュ索引の詳細は、「列定義: TimesTen Classic」を参照してください。 ノート: |
|
外部キーを削除することを指定します。オプションで、追加された外部キーの名前をユーザーが指定するように指定します。 |
|
追加または削除する外部キーの名前です。すべての外部キーは、ユーザーが名前を指定しなかった場合、デフォルトの名前が割り当てられます。ユーザーが指定した名前またはシステムの名前のいずれかを |
|
外部キーを追加することを指定します。 |
|
外部キーが別の表を参照することを指定します。 |
|
外部キーが参照する表の名前です。 |
|
|
|
主キーで使用する索引をハッシュ索引に変更します。主キーですでにハッシュ索引を使用している場合、この句は |
|
主キーで使用する索引を範囲索引に変更します。主キーですでに範囲索引を使用している場合、この句は無視されます。 |
|
表の想定ページ数に基づいてハッシュ索引のサイズを変更します。
TimesTenでは、表に行がない場合は、 推定した数が小さすぎると、パフォーマンスが悪化します。ハッシュ索引の詳細は、「列定義: TimesTen Classic」を参照してください。 |
|
エージング・ポリシーが定義されていない既存の表に、LRUエージングを追加します。 LRUエージング・ポリシーでは、エージングのタイプ(LRU)、エージング状態( エージング状態を LRU属性は、組込みプロシージャの |
|
エージング・ポリシーが定義されていない既存の表に、時間ベースのエージングを追加します。 時間ベースのエージング・ポリシーでは、エージングのタイプ(時間ベース)、エージング状態( エージング状態を 時間ベースのエージング属性はSQLレベルで定義され、 時間ベース・エージングに使用する列の名前として エージングに使用される列の値は、アプリケーションによって更新されます。この列の値が不明な行がある場合、その行がエージ・アウトされないようにするには、列に大きなデフォルト値を定義します(この列は
時間ベースのエージングの詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の表へのエージングの実装に関する項を参照してください。 |
|
時間ベースのエージング・ポリシーを既存の表に追加する場合は、
時間の単位の概念がサポートされています。時間の単位に |
|
時間ベースのエージング・ポリシーを既存の表に追加する場合は、
エージング状態が
|
|
エージング状態を変更します。エージング・ポリシーが事前に定義されている必要があります。 |
|
表からエージング・ポリシーを削除します。一度定義すると、変更することはできません。エージングを削除してから再定義してください。 |
|
この句を使用して時間ベースのエージングの存続期間を変更します。
エージング列を |
|
この句を使用して時間ベースのエージングのサイクルを変更します。
|
ALTER TABLEの説明: TimesTen Classic
-
ALTER TABLE
文を使用して一時表を変更することはできません。 -
ALTER TABLE ADD [COLUMN]
ColumnName
文は、既存の表に1つ以上の新しい列を追加します。1つ以上の列を追加した場合、新しい列は、新しい1つのパーティション内の表のすべての既存の行の最後に追加されます。 -
ALTER TABLE
ADD
またはDROP COLUMN
文を使用して、レプリケートされた表に対して列を追加または削除できます。ALTER
TABLE
を使用して、TWOSAFE BY REQUEST
トランザクションの一部であるレプリケートされた表を変更しないでください。 -
マテリアライズド・ビューから参照されている列は削除できません。
-
列の追加、列の削除、およびキャッシュ・グループ表の制約の追加に
ALTER
TABLE
文は使用できません。 -
追加される列の数に関係なく、1文につき1つのパーティションのみが表に追加されます。
-
表に
ALTER
を実行して、デフォルト値を持つNOT
NULL
列を追加します。DEFAULT
句は必須です。次の制限があります。-
この列を主キー列として使用することはできません。具体的には、
ALTER
TABLE
ADD
ConstraintName
PRIMARY
KEY
(
ColumnName
[,...])
文では、その列を指定できないということです。 -
この列を時間ベースのエージングに使用することはできません。具体的には、文
ALTER TABLE ADD AGING USE
ColumnName
に、この列を指定することはできません。ノート:
レプリケーション・スキームの一部である表にNOT NULL
列を追加するには、DDL_REPLICATON_LEVEL
が3以上である必要があります。
-
-
新しい列に対してデフォルト値が指定されている場合を除き、追加されるすべての列の初期値は
NULL
です。 -
表の列の合計数は1000以下です。また、表のパーティションの合計数は1000以下であり、そのうちの1つはTimesTenによって使用されます。
-
主キー制約を通常の表またはディテール表やマテリアライズド・ビュー表に追加するには、
ADD CONSTRAINT ... PRIMARY KEY
句を使用します。すでに主キーを持つ表に対しては、この句を使用しないでください。 -
ADD CONSTRAINT... PRIMARY KEY
句を使用して主キー制約を追加する際に、USE HASH INDEX
句を指定しないと、主キー制約に対して範囲索引が使用されます。 -
表がレプリケートされる際に、レプリケーション・エージェントがアクティブである場合は、
ADD CONSTRAINT ... PRIMARY KEY
句を使用できません。最初にレプリケーション・エージェントを停止します。 -
グローバル一時表で
ADD CONSTRAINT ... PRIMARY KEY
句を指定しないでください。 -
主キーを指定して定義されているキャッシュ・グループ表は
CREATE CACHE GROUP
文で定義する必要があるため、キャッシュ・グループ表ではADD CONSTRAINT ... PRIMARY KEY
句を指定しないでください。 -
ALTER TABLE ADD
文の結果として、問合せ時に新しい各パーティションに対して追加の読取りが発生します。このため、変更された表のパフォーマンスがわずかに悪化することがあります。パフォーマンスを回復するには、表を削除して再作成するか、またはttMigrate create -c
-relaxedUpgrade
コマンドを使用してから、ttRestore -r
-relaxedUpgrade
コマンドを使用して表をリストアします。追加された列を削除しても、悪化したパフォーマンスは回復されず、パーティションの数も減りません。 -
ALTER TABLE DROP
文を使用して既存の表から1つ以上の列を削除すると、削除された列は、表の現在のすべての行から削除されます。それ以降のSQL文では、削除した列は使用できなくなります。表の主キーに含まれている列は削除できません。また、表の外部キーに含まれている列も、すべての外部キーを削除しないかぎり削除できません。索引付けされた列は、列の索引をすべて削除しないかぎり削除できません。ALTER TABLE
を使用して表の列をすべて削除することはできません。かわりにDROP TABLE
を使用します。 -
表から列が削除された場合、その表を参照するすべてのコマンドを再コンパイルする必要があります。削除された列が参照されると、再コンパイル時にエラーが発生することがあります。アプリケーションはそのコマンドを再度準備し、パラメータと結果列を再作成する必要があります。列が表に追加された場合、
SELECT *
文を含むコマンドは無効になります。これらのコマンドのみを再度準備する必要があります。その他のすべてのコマンドは、想定したとおりに動作します。 -
列を削除しても、列の領域は解放されません。
-
UNIQUE
制約を追加すると、(領域の増加および処理時間の増加という点で)オーバーヘッドが発生します。これは、UNIQUE
制約を維持するための索引が作成されるためです。UNIQUE
制約を維持するために使用している索引を、DROP INDEX
文を使用して削除することはできません。 -
UNIQUE
制約とそれに関連付けられている索引は、レプリケートされた表の一意索引として使用されている場合、削除できません。 -
アプリケーションで表の主キーに対して範囲問合せを実行する場合は、
ALTER TABLE...USE RANGE INDEX
を使用します。 -
アプリケーションで表の主キーに対して完全一致検索を実行する場合は、
ALTER TABLE...USE HASH INDEX
を使用します。 -
表に主キーがない場合、
USE HASH INDEX
句またはUSE RANGE INDEX
句を指定すると、エラーが生成されます。 -
レプリケートされた表で外部キーの追加や削除を行う前に、レプリケーション・エージェントを停止してください。
-
子表の外部キー制約で
ON DELETE CASCADE
を指定している場合、ユーザーは、子表のDELETE
権限を明示的に必要とせずに、DELETE
権限を持つ親表から行を削除できます。 -
ON DELETE CASCADE
トリガー・アクションを変更するには、外部キー制約を削除して再定義してください。 -
ON DELETE CASCADE
は、マテリアライズド・ビューのディテール表でサポートされています。子表に対して定義されたマテリアライズド・ビューがある場合、親表からの削除によって子表でカスケード削除が行われます。つまり、親表での削除により、マテリアライズド・ビューも変更されます。 -
DELETE
文によって報告される行の総数には、ON DELETE CASCADE
アクションの結果、子表から削除された行は含まれません。 -
ON DELETE CASCADE
: 親表から子表へのパスが異なる場合があるため、次のルールが適用されます。 -
親表から子表へのすべてのパスを、deleteパスかdo not deleteパスのいずれかに統一します。
-
deleteパスのすべての子表で
ON DELETE CASCADE
を指定します。 -
このルールは、1つの親表から複数の子表へ、または複数の親表から1つの子表へのパスには適用されません。
-
-
ON DELETE CASCADE
: 第2のルールも適用されます。 -
ある表にdeleteパスでアクセスする場合、その表のすべての子表にもdeleteパスでアクセスします。
-
レプリケーションを含む
ON DELETE CASCADE
: 次の制限が適用されます。-
ON DELETE CASCADE
で指定された外部キーは、レプリケートされた表のマスターとサブスクライバの間で一致している必要があります。これは実行時に確認されます。エラーが発生すると、RECEIVERスレッドは処理を停止します。 -
カスケード削除のツリーに含まれる表をレプリケートする場合は、ツリーに含まれるすべての表をレプリケートする必要があります。この制限は、レプリケーション・スキームを作成したとき、またはレプリケーション表のいずれかに
ON DELETE CASCADE
付きの外部キーを追加したときにチェックされます。エラーが検出されると、処理は中断します。外部キー制約を変更する前に、まずレプリケーション・スキームを削除することが必要になる場合があります。
-
-
ALTER TABLE ADD/DROP CONSTRAINT
文には、次の制限があります。-
外部キーが削除されると、TimesTenでは外部キーに関連付けられている索引も削除されます。通常の
DROP INDEX
文を使用して外部キーに関連付けられている索引を削除しようとすると、エラーになります。 -
外部キーは、キャッシュ・グループの表では追加または削除できません。
-
外部キーは、ビューまたは一時表では追加または削除できません。
-
ALTER TABLE
を使用して主キー制約を削除することはできません。制約を削除するには、表を削除してから再作成する必要があります。
-
-
表のエージング・ポリシーを定義した後に、エージング・ポリシーをLRUから時間ベースに、または時間ベースからLRUに変更できません。最初にエージングを削除し、表を変更して新しいエージング・ポリシーを追加する必要があります。
-
エージング・ポリシーは、エージング状態を変更するように定義する必要があります。
-
LRUエージングでは、行がアクセスされているかまたは参照されているかどうかを、次のルールで判断します。
-
SELECT
文の結果セットを構築するために使用された行。 -
INSERT ... SELECT
文の結果セットを構築するために使用された行。 -
更新または削除対象の行。
-
-
コマンドで参照される表に対してLRUエージングの削除や追加を行うと、コンパイルされたコマンドは無効と指定され、再コンパイルが必要になります。
-
エージング状態が
ON
かOFF
かにかかわらずエージング処理をすぐにスケジュールするには、ttAgingScheduleNow
プロシージャをコールします。 -
時間ベースのエージング・ポリシーの場合、エージング列を追加または変更できません。これは、
NOT NULL
列を追加または変更できないためです。 -
エージングの制限:
-
時間ベースのエージングに使用されている列は削除できません。
-
外部キーによって関連付けられている表には、同じエージング・ポリシーを設定する必要があります。
-
LRUエージングでは、子行がエージングの対象でない場合、この子行とその親行は削除されません。
ON DELETE CASCADE
の設定は無視されます。 -
時間ベースのエージングでは、親行がエージングの対象である場合、すべての子行が削除されます。
ON DELETE CASCADE
は、設定の有無にかかわらず無視されます。
-
-
表の列ベースの圧縮の制限:
-
表の作成時に表の圧縮が有効化された場合は、
ALTER TABLE
文でのみ圧縮列グループを追加できます。非圧縮列は、圧縮が有効な表を含め、任意の表に追加できます。表への圧縮列グループの追加の詳細は、表の列ベースの圧縮(TimesTen Classic)を参照してください。 -
圧縮列グループの列は変更できません。
-
ALTER TABLE
コマンドを使用して圧縮列グループ内のすべての列を削除でき、圧縮列グループ内の列を削除するときは、圧縮列グループ内のすべての列を削除に対して指定する必要があります。 -
既存の非圧縮列を変更して圧縮するために
ALTER TABLE
は使用できません。たとえば:Command> create table mytab (a varchar2 (30), b int, c int) compress ((a,b) by dictionary); Command> alter table mytab add (d int) compress (c by dictionary); 2246: Cannot change compression clause for already defined column C The command failed.
-
TimesTenでALTER TABLEを使用する場合のパーティションの理解
表を作成すると、初期パーティションが作成されます。表にALTER
を実行して列を追加すると、セカンダリ・パーティションが作成されます。各ALTER
TABLE
文に対して、1つのセカンダリ・パーティションが作成されます。セカンダリ・パーティション内の列については、その列に主キー制約を作成したり、その列を時間ベースのエージングに使用することはできません。
ttMigrate
-r
-relaxedUpgrade
を使用すると、複数のパーティションをまとめることができます。これは、初期パーティションと1つ以上のセカンダリ・パーティションが、初期パーティションと呼ばれる単一のパーティションにまとめられることを意味します。複数のパーティションをまとめると、表にALTER
を実行して列に主キー制約を追加したり、その列を時間ベースのエージングに使用することができます。これは、列がセカンダリ・パーティションにはなく、現在は初期パーティションに存在するためです。
データベースがレプリケーションに関係し、複数のパーティションをまとめる必要がある場合は、(CREATE
REPLICATION
文の) StoreAttribute
TABLE
DEFINITION
CHECKING
RELAXED
を使用する必要があります。マスターとサブスクライバの両方で、あるいはマスターまたはサブスクライバで-duplicate
を使用して、ttMigrate
-r
-relaxedUpgrade
を実行します。
ttSchema
を使用して、列のパーティション番号を表示します。ttSchema
によって、セカンダリ・パーティション番号1はパーティション1として、セカンダリ・パーティション番号2はパーティション2として、以降同様に表示されます。
例として、2つの列を持つ表MyTab
を作成します。この表にALTER
を使用して、Col3
とCol4
の2つの列を、NOT
NULL
DEFAULT
句を指定して追加します。
Command> CREATE TABLE MyTab (Col1 NUMBER, Col2 VARCHAR2 (30)); Command> ALTER TABLE MyTab ADD (Col3 NUMBER NOT NULL DEFAULT 10, Col4 TIMESTAMP NOT NULL DEFAULT TIMESTAMP '2012-09-03 12:00:00');
ttSchema
を使用して、Col3
およびCol4
がセカンダリ・パーティション1に含まれていることを確認します。
ttschema -DSN sampledb_1122 -- Database is in Oracle type mode create table TESTUSER.MYTAB ( COL1 NUMBER, COL2 VARCHAR2(30 BYTE) INLINE, COL3 NUMBER NOT NULL DEFAULT 10, COL4 TIMESTAMP(6) NOT NULL DEFAULT TIMESTAMP '2012-09-03 12:00:00'); -- column COL3 partition 1 -- column COL4 partition 1
Col3
に主キー制約を、Col4
に時間ベースのエージングを追加してみます。初期パーティションに含まれていない列には、主キー制約も、時間ベースのエージングも追加できないため、エラーが表示されます。
Command> ALTER TABLE MyTab ADD CONSTRAINT PriKey PRIMARY KEY (Col3); 2419: All columns in a primary key constraint must be in the initial partition; column COL3 was added by ALTER TABLE The command failed. Command> ALTER TABLE MyTab ADD AGING USE Col4 LIFETIME 3 DAYS; 3023: Aging column must be in the initial partition; column COL4 was added by ALTER TABLE The command failed.
ttMigrate
を、-relaxedUpgrade
オプションとともに使用して、パーティションをまとめます。その後ttSchema
を使用して、パーティションがまとめられて、セカンダリ・パーティション1には列がないことを確認します。
ttMigrate -c dsn=sampledb_1122 test.migrate Saving user PUBLIC User successfully saved. Saving table TESTUSER.MYTAB Saving rows... 0/0 rows saved. Table successfully saved. ttDestroy sampledb_1122 ttMigrate -r -relaxedUpgrade dsn=sampledb_1122 test.migrate Restoring table TESTUSER.MYTAB Restoring rows... 0/0 rows restored. Table successfully restored. ttSchema DSN=sampledb_1122 -- Database is in Oracle type mode create table TESTUSER.MYTAB ( COL1 NUMBER, COL2 VARCHAR2(30 BYTE) INLINE, COL3 NUMBER NOT NULL DEFAULT 10, COL4 TIMESTAMP(6) NOT NULL DEFAULT TIMESTAMP '2012-09-03 12:00:00');
この段階で、Col3
に主キー制約を追加し、Col4
に時間ベースのエージングを追加します。ttMigrate
の結果としてCol3
およびCol4
は初期パーティションに含まれているため、成功します。ttSchema
を使用して結果を確認します。
Command> ALTER TABLE MyTab ADD CONSTRAINT PriKey PRIMARY KEY (Col3); Command> ALTER TABLE MyTab ADD AGING USE Col4 LIFETIME 3 DAYS; ttschema sampledb_1122 -- Database is in Oracle type mode create table TESTUSER.MYTAB ( COL1 NUMBER, COL2 VARCHAR2(30 BYTE) INLINE, COL3 NUMBER NOT NULL DEFAULT 10, COL4 TIMESTAMP(6) NOT NULL DEFAULT TIMESTAMP '2012-09-03 12:00:00') AGING USE COL4 LIFETIME 3 days CYCLE 5 minutes ON; alter table TESTUSER.MYTAB add constraint PRIKEY primary key (COL3);
ALTER TABLEの例: TimesTen Classic
returnrate
列をparts
表に追加します。
ALTER TABLE parts ADD COLUMN returnrate DOUBLE;
numsssign
列とprevdept
列をcontractor
表に追加します。
ALTER TABLE contractor ADD ( numassign INTEGER, prevdept CHAR(30) );
employee
表のaddr1
列とaddr2
列を削除します。
ALTER TABLE employee DROP ( addr1, addr2 );
表books
のUNIQUE
のtitle列を削除します。
ALTER TABLE books DROP UNIQUE (title);
デフォルト値5を使用してx1
列をt1
表に追加します。
ALTER TABLE t1 ADD (x1 INT DEFAULT 5);
列のデフォルト値x1
を2に変更します。
ALTER TABLE t1 MODIFY (x1 DEFAULT 2);
主キー制約c1
を追加するようにprimarykeytest
表を変更します。ttIsql
INDEXES
コマンドを使用して、主キー制約c1
が作成され、範囲索引が使用されていることを表示します。
Command> CREATE TABLE primarykeytest (col1 TT_INTEGER NOT NULL); Command> ALTER TABLE primarykeytest ADD CONSTRAINT c1 PRIMARY KEY (col1); Command> INDEXES primarykeytest; Indexes on table SAMPLEUSER.PRIMARYKEYTEST: C1: unique range index on columns: COL1 1 index found. 1 index found on 1 table.
ハッシュ索引を使用して主キー制約c2
を追加するようにprikeyhash
表を変更します。ttIsql
INDEXES
コマンドを使用して、主キー制約c2
が作成され、ハッシュ索引が使用されていることを表示します。
Command> CREATE TABLE prikeyhash (col1 NUMBER (3,2) NOT NULL); Command> ALTER TABLE prikeyhash ADD CONSTRAINT c2 PRIMARY KEY (col1) USE HASH INDEX PAGES = 20; Command> INDEXES prikeyhash; Indexes on table SAMPLEUSER.PRIKEYHASH: C2: unique hash index on columns: COL1 1 index found. 1 table found.
すでに主キーを使用して定義されている表に主キー制約を追加してみます。次のエラーが表示されます。
Command> CREATE TABLE oneprikey (col1 VARCHAR2 (30) NOT NULL, col2 TT_BIGINT NOT NULL, col3 CHAR (15) NOT NULL, PRIMARY KEY (col1,col2)); Command> ALTER TABLE oneprikey ADD CONSTRAINT c2 PRIMARY KEY (col1,col2); 2235: Table can have only one primary key The command failed.
NOT NULL
として定義されていない列に主キー制約を追加してみます。次のエラーが表示されます。
Command> CREATE TABLE prikeynull (col1 CHAR (30)); Command> ALTER TABLE prikeynull ADD CONSTRAINT c3 PRIMARY KEY (col1); 2236: Nullable column cannot be part of a primary key The command failed.
この例では、範囲索引およびハッシュ索引の使用方法を示しています。col1
を主キーとしてpkey
表を作成します。デフォルトで範囲索引が作成されます。次に、col1
の索引をハッシュ索引に変更するよう、この表をALTER文で変更します。再度、索引を範囲索引に戻すよう、この表をALTER文で変更します。
Command> CREATE TABLE pkey (col1 TT_INTEGER PRIMARY KEY, col2 VARCHAR2 (20)); Command> INDEXES pkey; Indexes on table SAMPLEUSER.PKEY: PKEY: unique range index on columns: COL1 1 index found. 1 index found on 1 table.
ハッシュ索引を使用するようにpkey
表を変更します。
Command> ALTER TABLE pkey USE HASH INDEX PAGES = CURRENT; Command> INDEXES pkey; Indexes on table SAMPLEUSER.PKEY: PKEY: unique hash index on columns: COL1 1 index found. 1 table found.
USE RANGE INDEX
句で、範囲索引を使用するようにpkey
表を変更します。
Command> ALTER TABLE pkey USE RANGE INDEX; Command> INDEXES pkey; Indexes on table SAMPLEUSER.PKEY: PKEY: unique range index on columns: COL1 1 index found. 1 table found.
この例では、主キーを使用しないで列に範囲索引またはハッシュ索引を定義するように表を変更しようとしたときに、エラーが生成されます。
Command> CREATE TABLE myindex (Ccl1 CHAR (20)); Command> ALTER TABLE myindex USE RANGE INDEX; 2810: The table has no primary key so cannot change its index type The command failed. Command> ALTER TABLE myindex USE HASH INDEX PAGES = CURRENT; 2810: The table has no primary key so cannot change its index type The command failed.
これらの例では、エージングにおいて、時間の単位がどのように機能するかを示しています。この例では、存続期間は3 Daysです。
-
(SYSDATE - ColumnValue) <= 3
の場合、行はエージ・アウトされません。 -
(SYSDATE - ColumnValue) > 3
の場合、行はエージ・アウトの対象となります。 -
(SYSDATE - ColumnValue) = 3 Days, 22 Hours
の場合、存続期間がDaysで指定されているため、行はエージ・アウトされません。存続期間が72 Hoursと指定されていた場合は、行はエージ・アウトされます。
この例では、LRUエージングを追加して表を変更します。表には事前に設定されたエージング・ポリシーはありません。エージング状態は、デフォルトでON
になっています。
ALTER TABLE agingdemo3 ADD AGING LRU; Command> DESCRIBE agingdemo3; Table USER.AGINGDEMO3: Columns: *AGINGID NUMBER NOT NULL NAME VARCHAR2 (20) INLINE Aging lru on 1 table found. (primary key columns are indicated with *)
この例では、時間ベースのエージングを追加して表を変更します。表には事前に設定されたエージング・ポリシーはありません。agingcolumn
列はエージングに使用します。LIFETIME
は2日です。CYCLE
は30分です。
ALTER TABLE agingdemo4 ADD AGING USE agingcolumn LIFETIME 2 DAYS CYCLE 30 MINUTES; Command> DESCRIBE agingdemo4; Table USER.AGINGDEMO4: Columns: *AGINGID NUMBER NOT NULL NAME VARCHAR2 (20) INLINE AGINGCOLUMN TIMESTAMP (6) NOT NULL Aging use AGINGCOLUMN lifetime 2 days cycle 30 minutes on
この例では、エージング・ポリシーを一度作成すると、変更できないことを示しています。エージングを削除して、再定義する必要があります。
CREATE TABLE agingdemo5 (agingid NUMBER NOT NULL PRIMARY KEY ,name VARCHAR2 (20) ,agingcolumn TIMESTAMP NOT NULL ) AGING USE agingcolumn LIFETIME 3 DAYS OFF; ALTER TABLE agingdemo5 ADD AGING LRU; 2980: Cannot add aging policy to a table with an existing aging policy. Have to drop the old aging first The command failed.
表のエージングを削除し、LRUエージングを使用して再定義します。
ALTER TABLE agingdemo5 DROP AGING; ALTER TABLE agingdemo5 ADD AGING LRU; Command> DESCRIBE agingdemo5; Table USER.AGINGDEMO5: Columns: *AGINGID NUMBER NOT NULL NAME VARCHAR2 (20) INLINE AGINGCOLUMN TIMESTAMP (6) NOT NULL Aging lru on 1 table found. (primary key columns are indicated with *)
この例では、ALTER文で表のエージング状態をOFF
に設定します。表には時間ベースのエージング・ポリシーが定義されています。エージング状態をOFF
に設定すると、エージングは自動的には行われません。これは、外部のスケジューラを使用してエージング処理を制御する必要がある場合に有効です。エージング状態をOFF
に設定し、ttAgingScheduleNow
プロシージャをコールしてエージング処理を開始します。
Command> DESCRIBE agingdemo4; Table USER.AGINGDEMO4: Columns: *AGINGID NUMBER NOT NULL NAME VARCHAR2 (20) INLINE AGINGCOLUMN TIMESTAMP (6) NOT NULL Aging use AGINGCOLUMN lifetime 2 days cycle 30 minutes on ALTER TABLE AgingDemo4 SET AGING OFF;
DESCRIBE agingdemo4
を実行すると、エージング・ポリシーが定義されてエージング状態がOFF
に設定されることに注意してください。
Command> DESCRIBE agingdemo4; Table USER.AGINGDEMO4: Columns: *AGINGID NUMBER NOT NULL NAME VARCHAR2 (20) INLINE AGINGCOLUMN TIMESTAMP (6) NOT NULL Aging use AGINGCOLUMN lifetime 2 days cycle 30 minutes off 1 table found. (primary key columns are indicated with *)
ttAgingScheduleNow
をコールして、外部スケジューラでエージングを起動します。
Command> CALL ttAgingScheduleNow ('agingdemo4');
表にエージング列を追加し、その列を時間ベースのエージングに使用するように変更してみます。エラーが生成されます。
Command> DESCRIBE x; Table USER1.X: Columns: *ID TT_INTEGER NOT NULL 1 table found. (primary key columns are indicated with *) Command> ALTER TABLE x ADD COLUMN t TIMESTAMP; Command> ALTER TABLE x ADD AGING USE t LIFETIME 2 DAYS; 2993: Aging column cannot be nullable The command failed.
時間ベースのエージングを使用して定義された表のLIFETIME
句を変更してみます。エージング列はTT_DATE
データ型を使用して定義されています。LIFETIME
単位がDAYS
で表されていないため、エラーが生成されます。
Command> CREATE TABLE aging1 (col1 TT_DATE NOT NULL) AGING USE col1 LIFETIME 2 DAYS; Command> ALTER TABLE aging1 SET AGING LIFETIME 2 HOURS; 2977: Only DAY lifetime unit is allowed with a TT_DATE column The command failed.
employees
表を変更して、州のフルネームを含む新しい圧縮列state
を追加します。employees
表には、job_id
およびmanager_id
で構成された圧縮列グループがすでにあることに注意してください。
Command> ALTER TABLE employees ADD COLUMN state VARCHAR2(20) COMPRESS (state BY DICTIONARY); Command> DESCRIBE employees; Table MYSCHEMA.EMPLOYEES: Columns: *EMPLOYEE_ID NUMBER (6) NOT NULL FIRST_NAME VARCHAR2 (20) INLINE LAST_NAME VARCHAR2 (25) INLINE NOT NULL EMAIL VARCHAR2 (25) INLINE NOT NULL PHONE_NUMBER VARCHAR2 (20) INLINE HIRE_DATE DATE NOT NULL JOB_ID VARCHAR2 (10) INLINE NOT NULL SALARY NUMBER (8,2) COMMISSION_PCT NUMBER (2,2) MANAGER_ID NUMBER (6) DEPARTMENT_ID NUMBER (4) STATE VARCHAR2 (20) INLINE COMPRESS ( ( JOB_ID, MANAGER_ID ) BY DICTIONARY, STATE BY DICTIONARY ) 1 table found. (primary key columns are indicated with *)
次の例では、圧縮列state
をemployees
表から削除します。
Command> ALTER TABLE employees DROP state; Command> DESCRIBE employees; Table MYSCHEMA.EMPLOYEES: Columns: *EMPLOYEE_ID NUMBER (6) NOT NULL FIRST_NAME VARCHAR2 (20) INLINE LAST_NAME VARCHAR2 (25) INLINE NOT NULL EMAIL VARCHAR2 (25) INLINE NOT NULL PHONE_NUMBER VARCHAR2 (20) INLINE HIRE_DATE DATE NOT NULL JOB_ID VARCHAR2 (10) INLINE NOT NULL SALARY NUMBER (8,2) COMMISSION_PCT NUMBER (2,2) MANAGER_ID NUMBER (6) DEPARTMENT_ID NUMBER (4) COMPRESS ( ( JOB_ID, MANAGER_ID ) BY DICTIONARY ) 1 table found. (primary key columns are indicated with *)
関連項目
ALTER USER
ALTER USER
文を使用すると、ユーザーのパスワードを変更できます。また、ユーザーのプロファイルを変更することも、ユーザーのアカウントをロックまたはロック解除することも、ユーザーのパスワードを有効期限切れにすることもできます。こうした操作は、ADMIN
権限を持つユーザーが実行できます。
また、この文を使用すると、ユーザーを内部から外部に変更することも、外部から内部に変更することもできます。
必要な権限
ユーザー自身のパスワードの変更に必要な権限はありません。
その他のすべての操作には、ADMIN
権限が必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
これは、ALTER
USER
...IDENTIFIED
BY
の構文です。少なくともIDENTIFIED
BY
句、PROFILE
句、ACCOUNT
句またはPASSWORD
EXPIRE
句のいずれかを必ず指定します。
ALTER USER user
[IDENTIFIED BY {password | "password"}]
[PROFILE profile] [ACCOUNT {LOCK|UNLOCK}] [PASSWORD EXPIRE]
これは、ALTER
USER
...IDENTIFIED
EXTERNALLY
の構文です。少なくともIDENTIFIED
EXTERNALLY
句、PROFILE
句またはACCOUNT
句のいずれかを必ず指定します。
ALTER USER user [IDENTIFIED EXTERNALLY] [PROFILE profile] [ACCOUNT {LOCK|UNLOCK}]
パラメータ
パラメータ | 説明 |
---|---|
|
変更するユーザーの名前。 |
|
内部ユーザーと、その内部ユーザーのパスワードを指定します。 指定できるパスワードは、ユーザーに割り当てられたプロファイルによって異なります。具体的には、 |
|
ユーザーが外部ユーザーであることを指定します。 |
|
|
|
|
|
|
説明
-
データベース・ユーザーには、内部ユーザーまたは外部ユーザーを指定できます。
-
内部ユーザーは、TimesTenデータベース用に定義されるユーザーです。
-
外部ユーザーは、オペレーティング・システムで定義されています。外部ユーザーにTimesTenパスワードを割り当てることはできません。
-
- パスワードの要件:
- 30文字を超えることはできません。
- 大文字と小文字が区別されます。
- 先頭に文字を使用する必要があります。パスワードを二重引用符で囲まないかぎり、パスワードの先頭を数字または特殊文字にすることはできません。
- 特殊文字を使用する場合は、パスワードを二重引用符で囲む必要があります。例外は、
#
と@
の特殊文字です。#
または@
の特殊文字を含むパスワードは、二重引用符で囲む必要がありません。 - セミコロン(
;
)や二重引用符("
)を含めることはできません。
-
PROFILE
句は、ユーザーのプロファイルを変更する場合に使用します。詳細は、「CREATE PROFILE」を参照してください。 -
ACCOUNT
LOCK
またはACCOUNT
UNLOCK
は、ユーザー・アカウントのロック設定を変更する場合に使用します。 -
PASSWORD
EXPIRE
句は、データベースに接続する前に、ユーザーのパスワードを期限切れにして、パスワードの変更を強制するために使用します。 -
接続がTLSで暗号化されている場合は、クライアント/サーバー接続を使用してユーザーを変更できます。詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』のTimesTen Client/ServerのTransport Layer Securityに関する項を参照してください。
-
レプリケーションが構成されている場合、この文はレプリケートされます。
例
ユーザー変更時のパスワード検証の説明
この例では、myprofile_strongpw
プロファイルを作成して、PASSWORD_COMPLEXITY_CHECKER
パスワード・パラメータにTT_VERIFY_FUNCTION
の値を指定します。その後で、sampleuser_pwchange
ユーザーを作成し、このユーザーにmyprofile_strongpw
プロファイルを割り当てます。指定したパスワードはTT_STRONG_VERIFY_FUNCTION
関数の要件を満たしていて、ユーザーが作成されます。TT_STRONG_VERIFY_FUNCTION
関数の詳細は、「TT_STRONG_VERIFY_FUNCTION」を参照してください。
Command> CREATE PROFILE myprofile_strongpw LIMIT
PASSWORD_COMPLEXITY_CHECKER TT_STRONG_VERIFY_FUNCTION;
Profile created.
Command> CREATE USER sampleuser_pwchange
IDENTIFIED BY "5&AbbN*60" PROFILE myprofile_strongpw;
User created.
次に、myprofile_strongpw
プロファイルを変更することで、PASSWORD_COMPLEXITY_CHECKER
パスワード・パラメータの値をTT_STIG_VERIFY_FUNCTION
に変更します。ALTER
USER
文を使用して、sampleuser_pwchange
ユーザーのパスワードを期限切れにします。sampleuser_pwchange
ユーザーとしてデータベースに接続してみます。この接続は、パスワードの有効期限が切れているために失敗します。
Command> ALTER PROFILE myprofile_strongpw LIMIT
PASSWORD_COMPLEXITY_CHECKER TT_STIG_VERIFY_FUNCTION;
Profile altered.
Command> ALTER USER sampleuser_pwchange PASSWORD EXPIRE;
User altered.
Command> GRANT CONNECT TO sampleuser_pwchange;
Command> connect adding "UID=sampleuser_pwchange;PWD=5&AbbN*60" as sampleuser;
15180: the password has expired
The command failed.
ALTER
USER
文を使用して、sampleuser_pwchange
ユーザーのパスワードを変更します。このパスワードはTT_STIG_VERIFY_FUNCTION
関数の要件を満たしているため、ALTER
USER
文は成功します。sampleuser_pwchange
ユーザーとしてデータベースに接続してみます。その接続に成功します。TT_STIG_VERIFY_FUNCTION
関数の詳細は、「TT_STIG_VERIFY_FUNCTION」を参照してください。
access1: Command> ALTER USER sampleuser_pwchange
IDENTIFIED BY "bd@<!BCvvKASn67";
User altered.
Command> connect adding "UID=sampleuser_pwchange;PWD=bd@<!BCvvKASn67"
as sampleuser;
Connection successful: DSN=access1;UID=sampleuser_pwchange;
DataStore=/scratch/sampleuser/mydatabase1;DatabaseCharacterSet=AL32UTF8;
ConnectionCharacterSet=AL32UTF8;PermSize=128;
(Default setting AutoCommit=1)
ユーザーのプロファイルの変更
この例では、user1
ユーザーを作成して、user1
ユーザーにprofile1
プロファイルを割り当てます。その次に、ALTER
USER
文を使用して、user1
ユーザーのプロファイルをprofile2
に変更します。
Command> CREATE USER user1 IDENTIFIED BY user1 PROFILE profile1; User created. Command> ALTER USER user1 PROFILE profile2; User altered.
dba_users
システム・ビューを問い合せて、user1
プロファイルがprofile2
に変更されたことを確認します。
Command> SELECT profile FROM dba_users WHERE username = 'USER1'; < PROFILE2 > 1 row found.
ユーザーのアカウントのロックとロック解除
この例では、user2
ユーザーを作成します。その次に、ALTER
USER
文を使用して、user2
ユーザーのアカウントをロックしてからロックを解除します。
Command> CREATE USER user2 IDENTIFIED BY user2 PROFILE profile1; User created. Command> ALTER USER user2 ACCOUNT LOCK; User altered.
user2
にCONNECT
権限を付与します。
Command> GRANT CONNECT TO user2;
user2
として、データベースに接続してみます。user2
アカウントはロックされているため、接続に失敗します。
Command> connect adding "UID=user2;PWD=user2" as user2; 15179: the account is locked The command failed.
インスタンス管理者としてデータベースに再接続し、ALTER
USER
文を使用してuser2
アカウントのロックを解除します。
none: Command> use database1 database1: Command> ALTER USER user2 ACCOUNT UNLOCK; User altered.
user2
ユーザーとして、データベースに接続してみます。接続が成功します。
database1: Command> connect adding "UID=user2;PWD=user2" as user2; Connection successful: DSN=database1;UID=user3;DataStore=/scratch/database1; DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=AL32UTF8;PermSize=128; (Default setting AutoCommit=1)
ユーザーのパスワードの有効期限
この例では、ALTER
USER
文を使用して、user2
ユーザーのアカウントを変更し、パスワードを期限切れにします。ADMIN
権限を持つユーザーは、user2
がデータベースに接続する前に、user2
のパスワードを変更しておく必要があります。
Command> ALTER USER user2 PASSWORD EXPIRE; User altered.
user2
として、データベースに接続してみます。user2
ユーザーがデータベースに接続する前に、user2
のパスワードを変更しておく必要があります。
Command> connect adding "UID=user2;PWD=user2" as user2; 15180: the password has expired The command failed.
インスタンス管理者としてデータベースに再接続し、ALTER
USER
文を使用してuser2
のパスワードを変更します。
none: Command> use database1 database1: Command> ALTER USER user2 IDENTIFIED BY newuser2password; User altered.
user2
ユーザーとして、データベースに接続してみます。接続が成功します。
database1: Command> connect adding "UID=user2;PWD=newuser2password" as user2; Connection successful: DSN=database1;UID=user4;DataStore=/scratch/database1; DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=AL32UTF8;PermSize=128; (Default setting AutoCommit=1)
ユーザーの外部から内部への変更と内部から外部への変更
この例では、ALTER
USER
文を使用して、user2
内部ユーザーを外部ユーザーに変更してから、内部ユーザーに戻します。
Command> ALTER USER user2 IDENTIFIED EXTERNALLY; User altered.
ALTER
USER
文を使用して、user2
外部ユーザーを内部ユーザーに戻します。
Command> ALTER USER user2 IDENTIFIED BY user2_password_change; User altered.
CALL
CALL
文を使用して、TimesTen組込みプロシージャを実行したり、スタンドアロンまたはSQLのパッケージに含まれるPL/SQLプロシージャまたはファンクションを実行します。
必要な権限
各TimesTen組込みプロシージャの実行に必要な権限は、『Oracle TimesTen In-Memory Databaseリファレンス』の組込みプロシージャに関する項に示された各プロシージャの説明を参照してください。
CALL
文を使用して、スタンドアロンまたはパッケージに含まれる独自のPL/SQLプロシージャまたはファンクションをコールする所有者には、必要な権限はありません。その他のすべてのユーザーには、プロシージャまたはファンクション、またはこれらが定義されているパッケージに対するEXECUTE
権限が必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
TimesTen組込みプロシージャをコールする場合:
CALL TimesTenBuiltIn [( arguments
)]
スタンドアロンまたはパッケージに含まれるPL/SQLプロシージャまたはファンクションをコールする場合、名前でコールするか、式の結果としてコールできます。
PL/SQLプロシージャをコールする場合:
CALL [Owner.][Package.]ProcedureName [( arguments
)]
パラメータを返すPL/SQLファンクションをコールする場合は、次のいずれかが適切です。
CALL [Owner.][Package.]FunctionName [(arguments
)] INTO :return_param
ノート:
ユーザー独自のPL/SQLプロシージャまたはファンクションは、同じ名前のTimesTen組込みプロシージャよりも優先されます。
パラメータ
パラメータ | 説明 |
---|---|
|
TimesTen組込みプロシージャの名前。TimesTen組込みプロシージャの完全なリストは、『Oracle TimesTen In-Memory Databaseリファレンス』の組込みプロシージャに関する項を参照してください。 |
|
PL/SQLプロシージャの名前。オプションで、プロシージャの所有者を指定できます。 |
|
PL/SQLファンクションの名前。オプションで、ファンクションの所有者を指定できます。 |
|
PL/SQLプロシージャまたはファンクションの0個以上の引数を指定します。 |
|
ルーチンがファンクションである場合は、 |
|
ファンクションの戻り値を格納するホスト変数を指定します。 |
説明
TimesTenでCALL
文を使用してPL/SQLプロシージャまたは関数を実行する方法の詳細は、『Oracle TimesTen In-Memory Database PL/SQL開発者ガイド』のプロシージャおよび関数の実行に関する項、『Oracle TimesTen In-Memory Database C開発者ガイド』のCALLを使用したプロシージャおよび関数の実行に関する項または『Oracle TimesTen In-Memory Database Java開発者ガイド』のCALLを使用したプロシージャおよび関数の実行に関する項を参照してください。
例
次に、mytest
ファンクションの定義を示します。
create or replace function mytest return number is begin return 1; end; /
次に示すように、CALL
文でmytest
ファンクションを実行します。
Command> variable n number; Command> call mytest() into :n; Command> print n; N : 1
次の例では、入力として従業員IDが指定された従業員の給与を戻すファンクションを作成し、ファンクションをコールして、戻された結果を表示します。
Command> CREATE OR REPLACE FUNCTION get_sal (p_id employees.employee_id%TYPE) RETURN NUMBER IS v_sal employees.salary%TYPE := 0; BEGIN SELECT salary INTO v_sal FROM employees WHERE employee_id = p_id; RETURN v_sal; END get_sal; / Function created. Command> variable n number; Command> call get_sal(100) into :n; Command> print n; N : 24000
COMMIT
COMMIT
文は、現在のトランザクションを終了し、そのトランザクション内で実行されたすべての変更を永続的な変更とします。
必要な権限
なし
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
COMMIT [WORK]
パラメータ
COMMIT
文では次のオプションのキーワードを使用できます。
パラメータ | 説明 |
---|---|
|
SQL標準に準拠するためにサポートされているオプションの句。 |
説明
-
トランザクションのコミット前:
-
トランザクション中に行った変更はすべて表示できますが、他のユーザーがそれらの変更を表示することはできません。トランザクションをコミットすると、コミット後に実行される他のユーザーの文に変更が表示されるようになります。
-
ROLLBACK
文を使用して、トランザクション中に行った変更をロールバック(UNDO)できます。
-
-
この文によって、トランザクションのロックが解除されます。
-
パススルーの場合も、Oracle Databaseトランザクションはコミットされます。
-
コミットによってすべてのオープン・カーソルがクローズされます。
例
HR
スキーマのregions
表に行を挿入し、トランザクションをコミットします。最初にautocommitを0(ゼロ)に設定します。
Command> SET AUTOCOMMIT 0; Command> INSERT INTO regions VALUES (5,'Australia'); 1 row inserted. Command> COMMIT; Command> SELECT * FROM regions; < 1, Europe > < 2, Americas > < 3, Asia > < 4, Middle East and Africa > < 5, Australia > 5 rows found.
関連項目
CREATE ACTIVE STANDBY PAIR
この文は、TimesTen Scaleoutではサポートされていません。
TimesTen Classicの場合:
この文は、アクティブ・スタンバイ・ペアを作成します。アクティブ・マスター・データベースとスタンバイ・マスター・データベースが含まれており、1つ以上の読取り専用サブスクライバが含まれる場合もあります。アクティブ・マスター・データベースはスタンバイ・マスター・データベースへ更新をレプリケートし、スタンバイ・マスター・データベースはサブスクライバへ更新を伝播します。
必要な権限
ADMIN
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutではサポートされていません。
SQL構文
CREATE ACTIVE STANDBY PAIR FullStoreName, FullStoreName [ReturnServiceAttribute] [SUBSCRIBER FullStoreName [,...]] [STORE FullStoreName [StoreAttribute [...]]] [NetworkOperation [...] ] [{ INCLUDE | EXCLUDE }{TABLE [[Owner.]TableName [,...]]| CACHE GROUP [[Owner.]CacheGroupName [,...]]| SEQUENCE [[Owner.]SequenceName [,...]]} [,...]]
ReturnServiceAttribute
の構文を次に示します。
{ RETURN RECEIPT [BY REQUEST] | RETURN TWOSAFE [BY REQUEST] | NO RETURN }
StoreAttribute
の構文を次に示します。
DISABLE RETURN {SUBSCRIBER | ALL} NumFailures RETURN SERVICES {ON | OFF} WHEN [REPLICATION] STOPPED DURABLE COMMIT {ON | OFF} RESUME RETURN Milliseconds LOCAL COMMIT ACTION {NO ACTION | COMMIT} RETURN WAIT TIME Seconds COMPRESS TRAFFIC {ON | OFF} PORT PortNumber TIMEOUT Seconds FAILTHRESHOLD Value TABLE DEFINITION CHECKING {RELAXED|EXACT}
NetworkOperation
の構文は、次のとおりです。
ROUTE MASTER FullStoreName SUBSCRIBER FullStoreName { { MASTERIP MasterHost | SUBSCRIBERIP SubscriberHost } PRIORITY Priority } [...]
パラメータ
パラメータ | 説明 |
---|---|
|
次のいずれかとして指定されたデータベースです。
たとえば、データベースのパスが この名前は、DSNの記述の
|
|
RETURN RECEIPTサービスを有効にし、これによって、アクティブ・マスター・データベースに対してトランザクションをコミットするアプリケーションは、スタンバイ・マスター・データベースがトランザクションを受信するまでブロックされます。
|
|
RETURN TWOSAFEサービスを有効にし、これによって、アクティブ・マスター・データベースに対してトランザクションをコミットするアプリケーションは、スタンバイ・マスター・データベースでトランザクションがコミットされるまでブロックされます。
RETURNサービスの使用の詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のRETURNサービスの使用に関する項を参照してください。 |
|
この障害ポリシーは、 |
|
レプリケーションが無効になっている場合のRETURNサービスのオンまたはオフを設定します。
『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のRETURNサービスの失敗/リカバリ・ポリシーの策定に関する項を参照してください。 |
|
|
|
RETURNサービスを使用しないように指定します。これがデフォルトです。 RETURNサービスの使用の詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のRETURNサービスの使用に関する項を参照してください。 |
|
RETURNサービスの応答を待機する秒数を指定します。値が0(ゼロ)の場合は、待機しないことを意味します。デフォルト値は10秒です。 このタイムアウト設定は、アプリケーションから |
|
マスター・データベースから更新を受け取るデータベース。 |
|
指定されたデータベースの属性を定義します。属性には、 |
|
StoreAttribute句。 サブスクライバで実行される表定義チェックの種類を指定します。
デフォルトは ノート: |
|
デフォルトでは、アクティブ・スタンバイ・ペアはデータベース全体をレプリケートします。
|
|
レプリケートされた通信量を圧縮して、ネットワークの帯域幅の量を削減します。 |
|
|
|
サブスクライバ・データベースのために累積できるログ・ファイルの数。この値を超えると、サブスクライバは 詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のトランザクション・ログ障害しきい値の設定に関する項を参照してください。 |
|
タイムアウト・イベントのRETURN TWOSAFEトランザクションで実行されるデフォルトのアクションを指定します。 ノート: この属性は、
この設定は、 |
|
アプリケーションで特定の要素が更新されるデータベース。更新は |
|
データベースのレプリケーション・エージェントが接続をリスニングするTCP/IPポート番号です。指定しない場合は、レプリケーション・エージェントによってポート番号が自動的に割り当てられます。 アクティブ・スタンバイ・ペアでは、スタンバイ・マスター・データベースは、アクティブ・マスター・データベースからの更新をリスニングします。読取り専用サブスクライバは、スタンバイ・マスター・データベースからの更新をリスニングします。 |
|
アクティブ・スタンバイ・ペアを使用する場合、読取り専用サブスクライバがないアクティブ・スタンバイ・ペアに対して
|
|
句は複数回指定できます。 |
|
1から99の整数で表される変数。IPアドレスの優先順位を示します。整数値が小さいほど、優先度は高くなります。同じ優先度を持つアドレスが複数指定されている場合は、エラーが返されます。ピア接続の確立に使用する複数のIPアドレスの順序を制御します。
|
|
レプリケーション・エージェントがリモート・レプリケーション・エージェントからの応答を待機する最大時間(秒)。デフォルトは120秒です。 アクティブ・スタンバイ・ペアでは、アクティブ・マスター・データベースは、スタンバイ・マスター・データベースにメッセージを送信します。スタンバイ・マスター・データベースは、読取り専用サブスクライバにメッセージを送信します。 ノート: リモート・レプリケーション・エージェントからの応答の遅延の原因となる大規模なトランザクションの場合、エージェントは、トランザクションのサイズに基づいて、タイムアウトをスケーリングします。 |
説明
-
アクティブ・スタンバイ・ペアを作成した後、データベースの1つをアクティブ・データベースにします。そのためには、
ttRepStateSet
('ACTIVE')
をコールします。次に、ttRepAdmin
を使用して、アクティブ・データベースをセカンダリ・データベースに複製します。処理が完了すると、セカンダリ・データベースがスタンバイ・データベースになります。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のキャッシュ・グループのないアクティブ・スタンバイ・ペアの設定に関する項を参照してください。 -
SUBSCRIBER
句には、1つ以上の読取り専用サブスクライバ・データベースを指定します。最大127のサブスクライバ・データベースを指定できます。 -
アクティブ・マスター・データベースとスタンバイ・マスター・データベースの間のレプリケーションは、
RETURN TWOSAFE
、RETURN RECEIPT
または非同期のいずれかに設定できます。RETURN TWOSAFE
に設定すると、トランザクションは失われません。 -
指定された表、順序およびキャッシュ・グループをレプリケーションから除外する場合、または指定された表、順序およびキャッシュ・グループのみを含めて他は除外する場合は、
INCLUDE
およびEXCLUDE
句を使用します。 -
アクティブ・スタンバイ・ペアに
RETURN TWOSAFE
属性があり、キャッシュ・グループをレプリケートしている場合、次のような状態のときにトランザクションが失敗する可能性があります。-
レプリケートされるトランザクションに
ALTER TABLE
文またはALTER CACHE GROUP
文が含まれている。 -
トランザクションに、レプリケートされた表、レプリケートされたキャッシュ・グループまたはASYNCHRONOUS WRITETHROUGHキャッシュ・グループに対する
INSERT
、UPDATE
またはDELETE
文が含まれている。
-
-
アクティブ・スタンバイ・ペアを使用して読取り専用キャッシュ・グループおよびASYNCHRONOUS WRITETHROUGH(AWT)キャッシュ・グループをレプリケートできます。アクティブ・スタンバイ・ペアを使用してSYNCHRONOUS WRITETHROUGH(SWT)キャッシュ・グループまたはユーザー管理キャッシュ・グループをレプリケートすることはできません。
-
EXCLUDE
句はAWTキャッシュ・グループに対して使用できません。 -
TimesTenでOracle Clusterwareを使用する場合は、
CREATE ACTIVE STANDBY PAIR
文は実行できません。
例
この例では、マスター・データベースがrep1
およびrep2
であるアクティブ・スタンバイ・ペアを作成します。サブスクライバrep3
が1つあります。レプリケーションのタイプはRETURN RECEIPT
です。また、この文では、PORT
およびTIMEOUT
属性をマスター・データベースに対して設定します。
CREATE ACTIVE STANDBY PAIR rep1, rep2 RETURN RECEIPT SUBSCRIBER rep3 STORE rep1 PORT 21000 TIMEOUT 30 STORE rep2 PORT 22000 TIMEOUT 30;
NetworkOperation
句を指定してネットワーク・インタフェースを制御します。
CREATE ACTIVE STANDBY PAIR rep1,rep2 ROUTE MASTER rep1 ON "machine1" SUBSCRIBER rep2 ON "machine2" MASTERIP "1.1.1.1" PRIORITY 1 SUBSCRIBERIP "2.2.2.2" PRIORITY 1; ROUTE MASTER rep2 ON "machine2" SUBSCRIBER rep1 ON "machine1" MASTERIP "2.2.2.2" PRIORITY 1 SUBSCRIBERIP "1.1.1.1" PRIORITY 1;
CREATE CACHE GROUP
CREATE CACHE GROUP
文は、次の処理を実行します。
-
キャッシュ・グループで定義される表を作成します。
-
キャッシュ・グループに関連付けられたすべての新しい情報を、適切なシステム表にロードします。
キャッシュ・グループとは、Oracle Databaseの表からデータをキャッシュする表のセットのことで、外部キーを介して関連付けられます。ルート表は1つで、この表は他の表を参照しません。キャッシュ・グループに含まれる他のすべてのキャッシュ表は、キャッシュ・グループ内の表を1つのみ参照します。つまり、外部キーのリレーションシップによってツリーが形成されます。
キャッシュ表は、次の条件を満たす行の集合です。
-
Oracle Database表の垂直パーティションの行のサブセットで構成されている。
-
Oracle Database表と同じ名前でTimesTen表に格納されている。
データベースに2つ以上のキャッシュ・グループがある場合、キャッシュ・グループは別々のOracle Database(およびTimesTen)表に対応している必要があります。
キャッシュ・グループ・インスタンスは、ルート表の1つの行と、ルート表の行に直接的または間接的に関連付けられている子表のすべての行を参照します。
キャッシュ・グループは、システム管理またはユーザー管理のいずれかになります。
システム管理キャッシュ・グループは、TimesTenによって完全に管理され、プロパティは固定されています。システム管理キャッシュ・グループには、次のタイプがあります。
-
読取り専用キャッシュ・グループはOracle Databaseで更新され、Oracle Databaseからキャッシュに更新が伝播されます。
-
ASYNCHRONOUS WRITETHROUGH(AWT)キャッシュ・グループはキャッシュで更新され、Oracle Databaseに更新が伝播されます。トランザクションはOracle Databaseでのコミットを待機せずに、キャッシュ上で続行します。
-
SYNCHRONOUS WRITETHROUGH(SWT)キャッシュ・グループはキャッシュで更新され、Oracle Databaseに更新が伝播されます。トランザクションは、Oracle Databaseでコミットが発生したことを通知した後、キャッシュ上でコミットされます。
ローディングやアンローディングなど、システム管理のキャッシュ・グループはTimesTenによって管理されるため、これらのキャッシュ・グループの定義では、次のような特定の文や句は使用できません。
-
AWTおよびSWTキャッシュ・グループ定義での
WHERE
句 -
キャッシュ表定義での
READONLY
、PROPAGATE
およびNOT PROPAGATE
-
AWTおよびSWTキャッシュ・グループ定義での
AUTOREFRESH
FLUSH CACHE GROUP
およびREFRESH CACHE GROUP
操作は、AWTおよびSWTキャッシュ・グループでは使用できません。
AWTキャッシュ・グループを作成する前に、レプリケーション・エージェントを停止する必要があります。
ユーザー管理キャッシュ・グループは、アプリケーションまたはユーザーによって管理される必要があります。ユーザー管理キャッシュ・グループのPROPAGATE
は、同期型です。表レベルのREADONLY
キーワードは、ユーザー管理キャッシュ・グループでのみ使用できます。
さらに、TimesTenおよびOracle Databaseの両方ですべてのWHERE
句を解析できる必要があります。
キャッシュ・グループは、明示的または動的にロードできます。
明示的にロードされるキャッシュ・グループでは、LOAD CACHE GROUP
またはREFRESH CACHE GROUP
文を使用してOracle Database表からTimesTenキャッシュ表に手動で新しいキャッシュ・インスタンスをロードするか、または自動リフレッシュ操作を使用して自動でロードします。
動的キャッシュ・グループでは、LOAD CACHE GROUP
を使用してTimesTenキャッシュ表に手動で新しいキャッシュ・インスタンスをロードするか、または動的ロード操作を使用して要求時にロードできます。動的ロード操作では、いずれかのキャッシュ表でSELECT
、UPDATE
、DELETE
、またはINSERT
文が発行され、データがキャッシュ表に存在しないもののキャッシュされたOracle Database表には存在すると、キャッシュされたOracle Database表からTimesTenキャッシュ表にデータが自動的にロードされます。動的キャッシュ・グループでの手動リフレッシュ操作または自動リフレッシュ操作では、既存のキャッシュ・インスタンスの更新または削除はできますが、新しいキャッシュ・インスタンスのロードはできません。
どのキャッシュ・グループ・タイプ(読取り専用、ASYNCHRONOUS WRITETHROUGH、SYNCHRONOUS WRITETHROUGH、ユーザー管理)でも、明示的にロードされるキャッシュ・グループとして定義できます。
AUTOREFRESHキャッシュ・グループ属性とPROPAGATE
キャッシュ表属性の両方を持つユーザー管理キャッシュ・グループを除いて
、どのキャッシュ・グループ・タイプでも動的キャッシュ・グループとして定義できます。
LRUエージングがデフォルトで定義されているため、動的キャッシュ・グループのデータはエージ・アウトされます。組込みプロシージャのttAgingLRUConfig
またはttAgingTableLRUConfig
のどちらか(あるいは両方)を使用して、LRUエージングの領域使用しきい値を上書きします。また、動的キャッシュ・グループに時間ベースのエージングを定義して、LRUエージングを上書きすることもできます。
静的および動的キャッシュ・グループの詳細は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』のキャッシュ・グループおよびキャッシュ表に関する項を参照してください。
必要な権限
CREATE CACHE GROUP
またはCREATE ANY CACHE GROUP
およびCREATE TABLE
(キャッシュ・グループ内のすべての表が現在のユーザーによって所有されている場合)またはCREATE ANY TABLE
(キャッシュ・グループ内の1つ以上の表が現在のユーザーによって所有されていない場合)。
TimesTen Scaleoutでの使用
増分自動リフレッシュを使用した静的読取り専用キャッシュ・グループがサポートされています。
SQL構文: TimesTen Scaleout
CREATE READONLY CACHE GROUP [Owner.]GroupName
[AUTOREFRESH
[MODE INCREMENTAL]
[INTERVAL IntervalValue {MINUTE[S] | SECOND[S] | MILLISECOND[S]}]
[STATE {ON|OFF|PAUSED}]
]
FROM
[Owner.]TableName (ColumnDefinition[,...][,PRIMARY KEY(ColumnName[,...])])
[UNIQUE HASH ON (HashColumnName[,...]) PAGES=PrimaryPages]
[ParentDistributionClause]
[WHERE ExternalSearchCondition]
[,[Owner.]TableName (ColumnDefinition[,...]
[,PRIMARY KEY(ColumnName[,...])]
[,FOREIGN KEY(ColumnName[,...])
REFERENCES RefTableName (ColumnName [,...])[ON DELETE CASCADE]])
[UNIQUE HASH ON (HashColumnName[,...]) PAGES=PrimaryPages]
[ChildDistributionClause]
[WHERE ExternalSearchCondition]
[,...]
]
The syntax for the distribution clause for a parent:
ParentDistributionClause::= DISTRIBUTE BY HASH [(ColumnName [,...])] | DUPLICATE
The syntax for the distribution clause for a child:
ChildDistributionClause::= DISTRIBUTE BY HASH [(ColumnName [,...])] |
DISTRIBUTE BY REFERENCE [(ForeignKeyConstraint)] | DUPLICATE
SQL構文: TimesTen Classic
読取り専用キャッシュ・グループの場合:
CREATE [DYNAMIC] [HYBRID] READONLY CACHE GROUP [Owner.]GroupName [AUTOREFRESH [MODE {INCREMENTAL | FULL}] [INTERVAL IntervalValue {MINUTE[S] | SECOND[S] | MILLISECOND[S] }] [STATE {ON|OFF|PAUSED}] ] FROM [Owner.]TableName ( {ColumnDefinition[,...]} [,PRIMARY KEY(ColumnName[,...])] [,FOREIGN KEY(ColumnName [,...]) REFERENCES RefTableName (ColumnName [,...])] [ON DELETE CASCADE]) [UNIQUE HASH ON (HashColumnName[,...]) PAGES=PrimaryPages] [AGING {LRU| USE ColumnName LIFETIME Num1 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]} [CYCLE Num2 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]}] }[ON|OFF] ] [WHERE ExternalSearchCondition] } [,...]
非同期ライトスルー・キャッシュ・グループの場合:
CREATE [DYNAMIC] [ASYNCHRONOUS] WRITETHROUGH CACHE GROUP [Owner.]GroupName FROM {[Owner.]TableName ( {ColumnDefinition[,...]} [,PRIMARY KEY(ColumnName[,...])] [FOREIGN KEY(ColumnName [,...]) REFERENCES RefTableName (ColumnName [,...])] [ON DELETE CASCADE]) UNIQUE HASH ON (HashColumnName[,...]) PAGES=PrimaryPages] [AGING {LRU| USE ColumnName LIFETIME Num1 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]} [CYCLE Num2 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]}] }[ON|OFF] ] } [,...]
同期ライトスルー・キャッシュ・グループの場合:
CREATE [DYNAMIC] SYNCHRONOUS WRITETHROUGH CACHE GROUP [Owner.]GroupName FROM {[Owner.]TableName ( {ColumnDefinition[,...]} [,PRIMARY KEY(ColumnName[,...])] [FOREIGN KEY(ColumnName [,...]) REFERENCES RefTableName (ColumnName [,...])] [ON DELETE CASCADE]) [UNIQUE HASH ON (HashColumnName[,...]) PAGES=PrimaryPages] [AGING {LRU| USE ColumnName LIFETIME Num1 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]} [CYCLE Num2 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]}] }[ON|OFF] ] } [,...]
ユーザー管理キャッシュ・グループの場合:
CREATE [DYNAMIC][USERMANAGED] CACHE GROUP [Owner.]GroupName [AUTOREFRESH [MODE {INCREMENTAL | FULL}] [INTERVAL IntervalValue {MINUTE[S] | SECOND[S] | MILLISECOND[S] }] [STATE {ON|OFF|PAUSED}] ] FROM {[Owner.]TableName ( {ColumnDefinition[,...]} [,PRIMARY KEY(ColumnName[,...])] [FOREIGN KEY(ColumnName[,...]) REFERENCES RefTableName (ColumnName [,...])] [ON DELETE CASCADE] [,{READONLY | PROPAGATE | NOT PROPAGATE}]) [UNIQUE HASH ON (HashColumnName[,...]) PAGES=PrimaryPages] [AGING {LRU| USE ColumnName LIFETIME Num1 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]} [CYCLE Num2 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]}] }[ON|OFF] ] [WHERE ExternalSearchCondition] } [,...]
パラメータ
キャッシュ・グループ定義のFROM
キーワードより前のパラメータは次のとおりです。
パラメータ | 説明 |
---|---|
|
新しいキャッシュ・グループに割り当てられる所有者および名前です。 |
|
TimesTen Classicのみでサポートされています。 指定すると、動的キャッシュ・グループが作成されます。 |
HYBRID |
TimesTen Classicのみでサポートされています。 指定すると、Oracleデータベースにルート表が存在しない動的な読取り専用キャッシュ・グループになります。 |
|
|
|
自動リフレッシュ時に更新されるキャッシュ内の行を指定します。 TimesTen Scaleoutでは、 |
|
自動リフレッシュを行う時間隔を分、秒またはミリ秒の単位で指定します。 指定した時間隔でAUTOREFRESHを完了できない場合は、実行時に警告が生成され、現在の処理が終了するまで次回のAUTOREFRESHを待機します。待機キューが10に達すると、サポート・ログに通知メッセージが生成されます。 |
|
キャッシュ・グループの作成時に自動リフレッシュを |
|
キャッシュ・グループに1つ以上の表定義を指定します。 |
FROM
キーワード以降のすべての記述は、キャッシュ・グループがキャッシュするOracle Database表の定義で構成されています。各表定義の構文は、CREATE TABLE
文と同様です。ただし、キャッシュ・グループ表には、主キー制約が必要です。
表定義には次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
新しい表に割り当てる所有者および名前です。 所有者名を指定しない場合は、新しい表の所有者名としてログイン名が使用されます。 |
|
表の個々の列の名前、データ型およびNULL値可能かどうかを指定します。各表には、列が少なくとも1つ必要です。 |
|
表に主キーを指定します。キャッシュ・グループには、主キー制約が必要です。 |
|
表に外部キーを指定します。 |
|
外部キーを関連付ける表を指定します。 |
|
|
|
キャッシュされた表に対する変更の禁止を指定します。 |
|
TimesTen Classicのみでサポートされています。 キャッシュされた表への変更が、コミット時に自動的に対応するOracle Database表に伝播されるかどうかを指定します。 |
|
この表にハッシュ索引を作成することを指定します。 |
|
表の想定ページ数に基づいてハッシュ索引のサイズを設定します。
ハッシュ索引の詳細は、「CREATE TABLE」を参照してください。 |
|
Oracle Databaseでキャッシュ・グループに対して評価される |
|
TimesTen Scaleoutの場合は、増分自動リフレッシュを使用した静的読取り専用キャッシュ・グループ内の親表に対する分散句です。次の分散スキームが親表でサポートされています。
|
|
TimesTen Scaleoutの場合は、増分自動リフレッシュを使用した静的読取り専用キャッシュ・グループ内の子表に対する分散句です。次の分散スキームが子表でサポートされています。
|
|
TimesTen Classicのみでサポートされています。 指定する場合、ルート表にLRUエージング・ポリシーを定義します。LRUエージング・ポリシーはキャッシュ・グループのすべての表に適用します。LRUエージング・ポリシーでは、エージングのタイプ(LRU)、エージング状態( エージング状態を 動的キャッシュ・グループでは、LRUエージングはデフォルトで キャッシュ・グループが動的でないかぎり、自動リフレッシュ属性が指定されたキャッシュ・グループにはLRUエージングを指定できません。 LRU属性は、組込みプロシージャの |
|
TimesTen Classicのみでサポートされています。 指定する場合、ルート表に時間ベースのエージング・ポリシーを定義します。時間ベースのエージング・ポリシーはキャッシュ・グループのすべての表に適用します。時間ベースのエージング・ポリシーでは、エージングのタイプ(時間ベース)、エージング状態( エージング状態を 時間ベースのエージング属性はSQLレベルで定義され、 時間ベース・エージングに使用する列の名前として エージングに使用される列の値は、アプリケーションによって更新されます。この列の値が不明な行がある場合、その行がエージ・アウトされないようにするには、列に大きなデフォルト値を定義します(この列は 時間ベースのエージングの詳細は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』のTimesTen Classicのキャッシュ・グループへのエージングの実装に関する項を参照してください。 |
|
TimesTen Classicのみでサポートされています。
時間の単位の概念がサポートされています。時間の単位に |
|
TimesTen Classicのみでサポートされています。
エージング状態が |
TimesTen Scaleoutのキャッシュ・グループ
TimesTen Scaleoutは、増分自動リフレッシュを使用した静的読取り専用キャッシュ・グループがサポートしています。分散スキームは、親表と1つ以上の子表に指定できます。分散スキームでは、データベースの要素間にデータを分散する方法を指定します。
DISTRIBUTE
BY
句によって示されます。
- 単一表キャッシュ・グループの場合、デフォルトの分散スキームは
HASH
です。 DISTRIBUTE
BY
句で列を指定しない場合は、主キー列が分散スキームのキー列として使用されます。- 複数表キャッシュ・グループの場合は、親表に
HASH
またはDUPLICATE
の分散スキームを指定できます。DUPLICATE
分散スキームを定義する場合は、子表にHASH
またはDUPLICATE
のみを指定できます。 - 複数表キャッシュ・グループの場合は、
HASH
が親表のデフォルト分散スキームになり、すべての子表はREFERENCE
分散スキームにデフォルト設定されます。親表にDUPLICATE
を指定して、子表に分散スキームを指定しない場合、子表のデフォルト分散スキームはDUPLICATE
になります。 - 子表の外部キーと親表の主キーが同じ場合、子表には最適化として
HASH
分散スキームが使用されます。 - 子表は参照によって分散することをお薦めします。
分散スキームの詳細は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』のTimesTen ScaleoutにおけるTimesTen Cacheの分散スキームに関する項を参照してください。
- 完全自動リフレッシュ・モード
- エージング
- マテリアライズド・ビュー
- グローバル索引
TimesTen Scaleoutの静的読取り専用キャッシュ・グループの詳細は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』のTimesTen Scaleoutのキャッシュ・グループの使用に関する項を参照してください。
TimesTen Classicのキャッシュ・グループ
動的ハイブリッド読取り専用キャッシュ・グループ
動的ハイブリッド読取り専用キャッシュ・グループとは、Oracleデータベースにルート表が存在しない動的な読取り専用キャッシュ・グループのことです。ルート表は、キャッシュ・グループ定義から自動的にTimesTenデータベースに作成されます。キャッシュ・グループ定義には、このルート表がOracleデータベースに存在するかのような記述が含まれています。
- ルート表は、Oracleデータベースに存在していないことが必要です。
- TimesTenデータベース内のルート表には、主キーが必要です。
- ルート表には、主キーの列のみを含めることができます。主キーは、少なくとも1つの子表から参照される必要があります。
- 動的ロードのトリガーには、
SELECT
文のFROM
句で導出表を使用できます。SELECT
問合せでは、同じハイブリッド・キャッシュ・グループの複数の表を指定することもできます。 - TimesTenデータベース内のルート表に対して
SELECT
問合せを発行した場合は、このSELECT
操作が動的ロードをトリガーすることはありません。 - このタイプのキャッシュ・グループには、時間ベースのエージングを指定できません。LRUエージングは、デフォルトで有効になっています。
- キャッシュ・グループ定義では、
WHERE
句はサポートされません。 LOAD
CACHE
GROUP
文を使用して、手動でキャッシュ・グループをロードすることはできません。UNLOAD
CACHE GROUP ...WITH ID
文はサポートされません。
動的ハイブリッド読取り専用キャッシュ・グループの詳細は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』のハイブリッド・キャッシュ・グループに関する項を参照してください。
キャッシュ・グループの説明
-
2つのキャッシュ・グループで所有者名とグループ名を同じにすることはできません。所有者名を指定しない場合、スキーマは新しいキャッシュ・グループの所有者名になります。
-
キャッシュ表名およびキャッシュ・グループ名のどちらにも、#を含めることはできません。
-
WHERE
句に動的パラメータを指定することはできません。 -
Oracle Databaseの一時表はキャッシュできません。
-
各表は、Oracle Databaseの表と対応している必要があります。
-
Oracle Databaseでは、親子関係を定義して、子表の外部キー列にNULL値を挿入できます。子表の該当行は、NULL親を参照していることになります。この状態で、キャッシュ・グループを作成して、Oracle Database表の親子関係をキャッシュできます。ただし、Oracle Database表からキャッシュ・グループにデータをロードする場合は、外部キー列にNULL値を持つ行はロードされません。TimesTenでは、キャッシュする表で、外部キーがNULL親を表す親子関係が定義された場合は、キャッシュ・グループを作成しないことをお薦めします。
-
小文字のデリミタ付き識別子を使用してキャッシュ表に名前を付けることはできません。TimesTenの表の名前は大文字と小文字が区別されず、大文字として格納されます。キャッシュ表の名前はOracle Database表の名前と同じである必要があります。TimesTenの大文字の表名は、大文字と小文字が混在するOracle Databaseの表の名前と一致しません。解決方法として、Oracle Databaseの表のシノニムを作成し、そのシノニムをキャッシュ・グループの表名として使用します。この解決方法は、読取り専用キャッシュ・グループまたは
AUTOREFRESH
パラメータが設定されたキャッシュ・グループには適用できません。 -
キャッシュ表の各列の名前およびデータ型は、Oracle Databaseの表の各列と一致する必要があります。『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』のOracle DatabaseとTimesTenデータ型の間のマッピングに関する項を参照してください。また、
WHERE
句内で列名を参照する場合は、各列名を所有者と表名で完全に修飾する必要があります。 -
WHERE
句は、キャッシュ・グループ表のみ直接参照できます。キャッシュ・グループ外の表は、副問合せでのみ参照できます。 -
一般的には、
CREATE CACHE GROUP
、LOAD CACHE GROUP
、UNLOAD CACHE GROUP
、REFRESH CACHE GROUP
またはFLUSH CACHE GROUP
文のWHERE
句の列名を完全に修飾する必要はありません。ただし、同一キャッシュ・グループ内の複数の表を結合する問合せがTimesTenによって自動的に生成されるため、キャッシュ・グループ内に同じ名前の列を持つ表が複数ある場合は、列を完全に修飾する必要があります。 -
デフォルトでは、キャッシュ・グループ表で主キーを使用するために範囲索引が作成されます。主キーに対してハッシュ索引を指定する場合は、
UNIQUE HASH
句を使用します。-
アプリケーションでキャッシュ・グループ表の主キーに対して範囲問合せを実行する場合は、
UNIQUE HASH
句を省略して、そのキャッシュ・グループ表に対して範囲索引を選択してください。 -
ただし、主キーの完全一致検索のみをアプリケーションで実行する場合は、ハッシュ索引の方がレスポンス時間およびスループットが優れている場合があります。その場合は、
UNIQUE HASH
句を指定します。UNIQUE HASH
句の詳細は、「CREATE TABLE」を参照してください。 -
表の主キーで使用する索引を変更するには、
ALTER TABLE
を使用します。
-
-
PROPAGATE
属性が指定されたキャッシュ・グループ表と、SWTキャッシュ・グループおよびAWTキャッシュ・グループの表の場合、ON DELETE CASCADE
で指定する外部キーは、Oracle Database表のON DELETE CASCADE
で指定されている外部キーの適切なサブセットであることが必要です。 -
CREATE CACHE GROUP
文はシリアライズ可能分離レベルでは実行できません。実行しようとするとエラー・メッセージが返されます。
AUTOREFRESH
パラメータは、Oracle DatabaseからTimesTenキャッシュ・グループに自動的に変更を伝播します。静的なキャッシュ・グループの場合、削除、更新および挿入がOracle Databaseからキャッシュ・グループに自動的に伝播されます。動的キャッシュ・グループの場合、削除と更新のみが伝播されます。指定されたOracle Database表への挿入は動的キャッシュ・グループには伝播されません。これらは、アプリケーションで参照されたときに、動的にTimesTen Cacheにロードされます。また、アプリケーションで明示的にロードすることもできます。
キャッシュ・グループで自動リフレッシュを使用するには、キャッシュ・グループを作成する際にAUTOREFRESH
を指定する必要があります。MODE
、STATE
およびINTERVAL
AUTOREFRESH
の設定は、ALTER CACHE GROUP
文を使用することによって、キャッシュ・グループが作成された後で変更できます。キャッシュ・グループをAUTOREFRESH
またはPROPAGATE
に指定した後は、これらの属性を変更することはできません。読取り専用キャッシュ・グループを作成する場合は、自動リフレッシュ句を指定する必要はありません。読取り専用キャッシュ・グループは、デフォルトで増分自動リフレッシュに設定されます。
TimesTenでは、FULL
またはINCREMENTAL AUTOREFRESH
がサポートされています。FULL
モードでは、キャッシュ全体が定期的にアンロードされてから再ロードされます。INCREMENTAL
モードでは、Oracle Databaseにトリガーがインストールされて変更の追跡が行われ、特定のOracle表で変更された行のみが定期的に更新されます。自動リフレッシュの状態がPAUSED
になっている場合を除き、最初の増分リフレッシュは常に完全リフレッシュになります。デフォルトのモードはINCREMENTAL
です。
FULL AUTOREFRESH
は、Oracle Database表でほとんどの行が変更されている場合に効果的です。変更が少ない場合は、INCREMENTAL AUTOREFRESH
がより有効です。
TimesTenは、AUTOREFRESH
を指定した文を含むトランザクションがコミットされたときに、自動リフレッシュ操作をスケジュールします。自動リフレッシュをスケジュールする文は、次のとおりです。
-
AUTOREFRESH
を指定し、AUTOREFRESH
状態をON
に指定したCREATE CACHE GROUP
文。 -
AUTOREFRESH状態をON
に変更したALTER CACHE GROUP
文。
-
自動リフレッシュの状態が
PAUSEDに指定されている、空のキャッシュ・グループに対して実行される
LOAD CACHE GROUP文。
自動リフレッシュの頻度は、指定した時間隔によって決まります。
AUTOREFRESH
のSTATE
には、ON
、OFF
またはPAUSED
が指定できます。デフォルトでは、自動リフレッシュの状態はPAUSED
です。
NOT PROPAGATE
属性とAUTOREFRESH
属性を同時に使用することはできません。
キャッシュ・グループでのエージング:
-
時間ベースのエージングでは、スライド期間を指定できます。『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』のTimesTen Classicのスライド・ウィンドウの構成に関する項を参照してください。
-
表のエージング・ポリシーを定義した後に、エージング・ポリシーをLRUから時間ベースに、または時間ベースからLRUに変更できません。最初にエージングを削除し、表を変更して新しいエージング・ポリシーを追加する必要があります。
-
エージング・ポリシーは、エージング状態を変更するように定義する必要があります。
-
1つのシステムでLRUエージングと時間ベースのエージングの両方を組み合せて使用できます。LRUエージングのみを使用する場合、エージング・スレッドはデータベース全体に指定されたサイクルに基づいて起動します。一方、時間ベースのエージングのみを使用する場合、エージング・スレッドは最適な頻度に基づいて起動します。この頻度は、データベースに対する
CYCLE
句で指定された値によって決定されます。LRUエージングと時間ベースのエージングの両方を使用する場合は、両方のタイプを組み合せて考慮した上でスレッドが起動します。 -
エージング状態が
ON
かOFF
かにかかわらずエージング処理をすぐにスケジュールするには、ttAgingScheduleNow
プロシージャをコールします。 -
LRUエージングでは、行がアクセスされているかまたは参照されているかどうかを、次のルールで判断します。
-
SELECT
文の結果セットを構築するために使用された行。 -
INSERT...SELECT
文の結果セットを構築するために使用された行。 -
更新または削除対象の行。
-
-
コマンドで参照される表に対してLRUエージングの削除や追加を行うと、コンパイルされたコマンドは無効と指定され、再コンパイルが必要になります。
- 使用
LRUエージングでは、子行がエージングの対象でない場合、この子行とその親行は削除されません。
ON DELETE CASCADE
の設定は無視されます。 -
時間ベースのエージングでは、親行がエージングの対象である場合、すべての子行が削除されます。
ON DELETE CASCADE
は、設定の有無にかかわらず無視されます。 -
ルート表にLRUエージング・ポリシーまたは時間ベースのエージング・ポリシーを指定します。ポリシーはキャッシュ・グループのすべての表に適用します。
-
時間ベースのエージング・ポリシーの場合、エージング列を追加または変更できません。これは、
NOT NULL
列を追加または変更できないためです。 -
キャッシュ・グループのエージングを定義する場合の制限:
-
動的キャッシュ・グループでないかぎり、LRUエージングは自動リフレッシュ属性が設定されたキャッシュ・グループではサポートされません。
-
キャッシュ・エージェントがアクティブの間は、読取り専用キャッシュ・グループまたは
AUTOREFRESH
属性を持つキャッシュ・グループに対するエージング・ポリシーの追加、変更または削除はできません。まず、キャッシュ・エージェントを停止してください。 -
時間ベースのエージングに使用されている列は削除できません。
-
例: TimesTen Classic
次に示す例は、TimesTen Classicに固有です。TimesTen Scaleoutのキャッシュ・グループの詳細と使用例は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』のTimesTen Scaleoutのキャッシュ・グループの使用に関する項を参照してください。
読取り専用キャッシュ・グループを作成します。
CREATE READONLY CACHE GROUP customerorders AUTOREFRESH INTERVAL 10 MINUTES FROM customer (custid INT NOT NULL, name CHAR(100) NOT NULL, addr CHAR(100), zip INT, region CHAR(10), PRIMARY KEY(custid)), ordertab (orderid INT NOT NULL, custid INT NOT NULL, PRIMARY KEY (orderid), FOREIGN KEY (custid) REFERENCES customer(custid));
ASYNCHRONOUS WRITETHROUGHキャッシュ・グループを作成します。
CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP cstomers FROM customer (custid INT NOT NULL, name CHAR(100) NOT NULL, addr CHAR(100), zip INT, PRIMARY KEY(custid));
SYNCHRONOUS WRITETHROUGHキャッシュ・グループを作成します。
CREATE SYNCHRONOUS WRITETHROUGH CACHE GROUP customers FROM customer (custid INT NOT NULL, name CHAR(100) NOT NULL, addr CHAR(100), zip INT, PRIMARY KEY(custid));
ユーザー管理キャッシュ・グループを作成します。
CREATE USERMANAGED CACHE GROUP updateanywherecustomers AUTOREFRESH MODE INCREMENTAL INTERVAL 30 SECONDS STATE ON FROM customer (custid INT NOT NULL, name CHAR(100) NOT NULL, addr CHAR(100), zip INT, PRIMARY KEY(custid), PROPAGATE);
時間ベースのエージングが指定されたキャッシュ・グループを作成します。エージング用の列として、agetimestamp
を指定します。LIFETIME
は2時間、CYCLE
は30分を指定します。エージング状態は指定しないため、デフォルト設定(ON
)が使用されます。
CREATE READONLY CACHE GROUP agingcachegroup AUTOREFRESH MODE INCREMENTAL INTERVAL 5 MINUTES STATE PAUSED FROM customer (customerid NUMBER NOT NULL, agetimestamp TIMESTAMP NOT NULL, PRIMARY KEY (customerid)) AGING USE agetimestamp LIFETIME 2 HOURS CYCLE 30 MINUTES; Command> DESCRIBE customer; Table USER.CUSTOMER: Columns: *CUSTOMERID NUMBER NOT NULL AGETIMESTAMP TIMESTAMP (6) NOT NULL AGING USE AgeTimestamp LIFETIME 2 HOURS CYCLE 30 MINUTES ON 1 table found. (primary key columns are indicated with *)
Oracle Databaseで大文字と小文字が混在するデリミタ付き識別子の表名にシノニムを使用すると、大文字と小文字が混在する表名をTimesTenでキャッシュできます。まず、大文字と小文字が混在するOracle Database表名のキャッシュを試みます。"Could not find '
NameofTable
' in Oracle"
というエラーが表示されます。
Command> AUTOCOMMIT 0; Command> PASSTHROUGH 3; Command> CREATE TABLE "MixedCase" (col1 NUMBER PRIMARY KEY NOT NULL); Command> INSERT INTO "MixedCase" VALUES (1); 1 row inserted. Command> COMMIT; Command> CREATE CACHE GROUP MixedCase1 from "MixedCase" (col1 NUMBER PRIMARY KEY NOT NULL); 5140: Could not find SAMPLEUSER.MIXEDCASE in Oracle. May not have privileges. The command failed.
ここで、PassThrough
属性を使用して、シノニム"MIXEDCASE"
をOracle Databaseに作成し、そのシノニムを表名として使用します。
Command> AUTOCOMMIT 0; Command> PASSTHROUGH 3; Command> CREATE SYNONYM "MIXEDCASE" FOR "MixedCase"; Command> COMMIT; Command> CREATE CACHE GROUP MixedCase2 FROM "MIXEDCASE" (col1 NUMBER PRIMARY KEY NOT NULL); Warning 5147: Cache group contains synonyms Command> COMMIT;
読取り専用キャッシュ・グループまたはAUTOREFRESH
属性を持つキャッシュ・グループでシノニムの名前を使用してみます。次のエラーが表示されます。
Command> AUTOCOMMIT 0; Command> PASSTHROUGH 3; Command> CREATE SYNONYM "MIXEDCASE_AUTO" FOR "MixedCase"; Command> COMMIT; Command> CREATE READONLY CACHE GROUP MixedCase3 AUTOREFRESH MODE INCREMENTAL INTERVAL 10 MINUTES FROM "MIXEDCASE_AUTO" (Col1 NUMBER PRIMARY KEY NOT NULL); 5142: Autorefresh is not allowed on cache groups with Oracle synonyms The command failed.
CREATE FUNCTION
CREATE FUNCTION
文は、スタンドアロンのストアド・ファンクションを作成します。
必要な権限
CREATE PROCEDURE
(所有者の場合)またはCREATE ANY PROCEDURE
(非所有者の場合)。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
CREATE [OR REPLACE] FUNCTION [Owner.]FunctionName[(arguments [IN|OUT|IN OUT][NOCOPY] DataType [DEFAULT expr][,...])] RETURN DataType [InvokerRightsClause][AccessibleByClause][DETERMINISTIC] {IS|AS} PlsqlFunctionBody InvokerRightsClause::= AUTHID {CURRENT_USER|DEFINER} AccessibleByClause::= ACCESSIBLE BY (accessor[,...])
accessor
::= [UnitKind][Owner.]UnitName
InvokerRightsClause
、AccessibleByClause
またはDETERMINISTIC
は任意の順序で指定できます。
パラメータ
パラメータ | 説明 |
---|---|
|
ファンクションがすでに存在する場合に再作成するには、 |
|
ファンクションの名前。 |
|
引数またはパラメータの名前。ファンクションに0以上のパラメータを指定できます。パラメータを指定する場合は、パラメータのデータ型を指定する必要があります。データ型はPL/SQLデータ型である必要があります。 |
|
パラメータのモード。
|
|
可能なかぎり迅速にパラメータを渡すようにTimesTenに指示するには、 |
|
パラメータのデフォルト値を指定するには、この句を使用します。キーワード |
|
必須の句。ファンクションは値を戻す必要があります。ファンクションの戻り値のデータ型を指定する必要があります。 データ型の長さ、精度またはスケールは指定しないでください。 データ型はPL/SQLデータ型です。 |
|
PL/SQLファンクションまたはプロシージャ内のSQL文が定義者権限で実行されるか実行者権限で実行されるかを指定できます。
詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』の定義者権限および実行者権限(AUTHID句)に関する項を参照してください。 |
|
この句は、ファンクションを直接呼び出せる1つ以上のアクセッサ(PL/SQLユニット)を指定する場合に使用します。ファンクションにアクセスできるアクセッサのリストは、ホワイト・リストと呼ばれます。ホワイト・リストを使用すると、PL/SQLオブジェクトにセキュリティ・レイヤーを追加できます。特に、ホワイト・リストにあるオブジェクトのみにファンクションへのアクセスを制限できます。
構文: |
|
アクセッサは、 構文: |
|
|
|
|
|
パラメータに同じ値を指定して関数をコールした場合に常に同じ結果値を返すように指定するには、 |
|
|
|
ファンクションの本体を指定します。 |
説明
-
AccessibleByClause
:-
コンパイラは
ACCESSIBLE
BY
句の構文の妥当性をチェックしますが、アクセッサが存在することはチェックしません。このため、所有者のスキーマにまだ存在しているアクセッサを定義できます。 -
ファンクションを呼び出すと、コンパイラはまず呼出しの通常のアクセス権チェックを実行します。いずれかのチェックに失敗すると、呼出し元がアクセッサであっても呼出しは失敗します。呼出し時の通常のアクセス権チェックがすべて成功し、このファンクションに
ACCESSIBLE
BY
句がない場合、呼出しは成功します。ファンクションにACCESSIBLE
BY
句がある場合、呼出し元がアクセッサである場合にのみ呼出しは成功します。
-
-
ファンクションを作成または置き換えた場合、ファンクションに付与された権限は同じままです。オブジェクトを削除して再作成した場合、元のオブジェクトに付与されていたオブジェクト権限は削除されます。
-
レプリケーション環境で、
CREATE FUNCTION
文はレプリケートされません。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』の既存のアクティブ・スタンバイ・ペアでの新規PL/SQLオブジェクトの作成に関する項および既存のクラシック・レプリケーション・スキームへのPL/SQLオブジェクトの追加に関する項を参照してください。 -
次の句はTimesTenではサポートされません。
-
parallel_enable_clause
句を指定できますが、無効になります。
-
call_spec
句 -
AS EXTERNAL
句
-
例
AccessibleByClauseの使用
この例では、ProtectedFunction
関数を作成します。ACCESSIBLE
BY
句は、ファンクションの呼出しをCallingProc1
プロシージャおよびCallingProc2
プロシージャに制限するために使用されます。CallingProc1
ではPL/SQLユニットのタイプは指定されず、CallingProc2
では、PL/SQLユニットのタイプは(PROCEDURE
)と指定されることに注意してください。
Command> CREATE OR REPLACE FUNCTION ProtectedFunction (a IN NUMBER) RETURN NUMBER ACCESSIBLE BY (CallingProc1, PROCEDURE CallingProc2) AS BEGIN RETURN a * 1; END; / Function created.
CallingProc1
プロシージャとCallingProc2
プロシージャを作成します。
Command> CREATE OR REPLACE PROCEDURE CallingProc1 AS a NUMBER:=1; BEGIN a:=ProtectedFunction(a); DBMS_OUTPUT.PUT_LINE ('Calling Procedure: '|| a); END; / Procedure created. Command> CREATE OR REPLACE PROCEDURE CallingProc2 AS a NUMBER:=2; BEGIN a:=ProtectedFunction(a); DBMS_OUTPUT.PUT_LINE ('Calling Procedure: '|| a); END; / Procedure created.
プロシージャをコールします。CallingProc1
およびCallingProc2
はホワイト・リストにあり、実行は成功します。
Command> SET SERVEROUTPUT ON Command> exec CallingProc1; Calling Procedure: 1 PL/SQL procedure successfully completed. Command> exec CallingProc2; Calling Procedure: 2 PL/SQL procedure successfully completed.
PL/SQLファンクションを作成するための構文を示します
1つの入力パラメータを指定してファンクションget_sal
を作成します。NUMBER
型としてsalary
を戻します。
Command> CREATE OR REPLACE FUNCTION get_sal (p_id employees.employee_id%TYPE) RETURN NUMBER IS v_sal employees.salary%TYPE := 0; BEGIN SELECT salary INTO v_sal FROM employees WHERE employee_id = p_id; RETURN v_sal; END get_sal; / Function created.
CREATE INDEX
CREATE
INDEX
文は、表またはマテリアライズド・ビューの1つ以上の列に索引を作成します。
必要な権限
- 所有者の場合、権限は不要です。
- 所有者でない場合は、システム権限の
CREATE
ANY
INDEX
またはオブジェクト権限のINDEX
が必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。グローバル索引またはローカル索引を作成できます。
SQL構文
次に、範囲索引を作成する構文を示します。GLOBAL
キーワード、オプションのINCLUDE
句およびオプションのIndexDistributionClause
句を使用して、グローバル索引を作成します。グローバル索引は、TimesTen Scaleoutでのみサポートされます。
CREATE [GLOBAL][UNIQUE] INDEX [Owner.]IndexName ON [Owner.]TableName (ColumnName [ASC | DESC][,... ]) [INCLUDE (ColumnName[,…])] [IndexDistributionClause]
次に、ハッシュ索引を作成する構文を示します。GLOBAL
キーワードを使用して、グローバル索引を作成します。オプションのINCLUDE
句およびオプションのIndexDistributionClause
句は、グローバル索引にのみ使用できます。グローバル索引は、TimesTen Scaleoutでのみサポートされます。
CREATE [GLOBAL][UNIQUE] HASH INDEX [Owner.]IndexName ON [Owner.]TableName (ColumnName [ASC | DESC][,... ] ) [INCLUDE (ColumnName [,…])] [ PAGES = RowPages | CURRENT ] [IndexDistributionClause]
IndexDistributionClause
の構文は、グローバル索引(TimesTen Scaleoutでサポート)にのみ使用できます。
IndexDistributionClause::= DISTRIBUTE BY HASH [(ColumnName [,…])]
パラメータ
パラメータ | 説明 |
---|---|
|
TimesTen Scaleout:
|
|
範囲索引およびハッシュ索引の両方に |
|
ハッシュ索引を作成する場合は、 |
|
新しい索引に割り当てる名前。表の2つの索引に同じ名前を付けることはできません。所有者を指定する場合、表の所有者と同じ名前を指定する必要があります。 |
|
索引を作成する表またはマテリアライズド・ビューを指定します。 |
|
索引キーとして使用する列の名前。主索引キーから補助索引キーの順に、最大32列を指定できます。 |
|
索引の順序を昇順(デフォルト)または降順で指定します。現在、TimesTenでは、この句は無視されます。 |
|
|
|
表に行がない場合は、 |
|
この句を指定しない場合は、グローバル索引定義で定義された列が分散キーを形成します。 この句を指定する場合は、
ColumnName 句をオプションで指定できます。
|
TimesTen Scaleoutの索引
- グローバル索引: 表内のすべての行をハッシュ分散スキームにマップします。グローバル索引を作成すると、TimesTen Scaleoutは、ローカル索引と索引キー列へのハッシュ分散スキームを使用したマテリアライズド・ビューを作成します。マテリアライズド・ビューで作成されるローカル索引は、問合せのパフォーマンスをさらに最適化します。
- ローカル索引: 各データベース要素に作成されます。データベース要素の索引は、データベース要素の表の行にマップされます。表に分散キー列を含まない索引列に対する問合せでは、すべてのレプリカ・セットの要素と通信する必要があります。
TimesTen Scaleoutでの索引の使用の詳細は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』の索引の理解に関する項を参照してください。
TimesTen Scaleoutでのグローバルまたはローカル索引の選択
-
グローバル索引を使用する対象を次に示します。
- 一意の列: グローバル一意索引は、一意制約チェックをより効率的に実行することにより、問合せの実行を最適化します。TimesTen Scaleoutは、一意性の検証のために、すべてのレプリカ・セットにアクセスするのではなく分散キー列を使用します。ただし、分散キーが索引キーのサブセットの場合は、ローカル索引を作成します。
- 表の分散キーにすべての列を含まない等式述語を持つ問合せ。
- 主キー列を持つ問合せで頻繁に結合される列のグループ。
- 問合せで頻繁に使用される索引以外の列:
INCLUDE
句を使用してグローバル索引を定義し、これらの索引以外の列を含めます。このような場合、問合せを満たすために表にアクセスする必要はありません。 - 索引キーが表の分散キーの接頭辞である索引。
- ローカル索引を使用する対象を次に示します。
- 一意でない列: 索引キーが一意でない列のみで構成されている場合は、ローカルの一意でない索引を作成します。
- 表の分散キーと同じ列を含む索引キー。
- 表の分散キーが索引キーの接頭辞である状況。
- 表の分散キーにすべての列が含まれる等式述語を持つ問合せ。
詳細は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』の索引の理解に関する項を参照してください。
グローバル索引の説明
- グローバル索引を作成するには、
GLOBAL
キーワードを指定する必要があります。索引は、デフォルトではローカルです。 - デフォルトでは、グローバル索引はハッシュによって分散されます。また、ハッシュによってのみ分散できます。ローカル索引は分散されません。
- グローバル索引を作成すると、TimesTen Scaleoutは、内部的に独自のマテリアライズド・ビューと、そのマテリアライズド・ビューに独自のローカル索引を作成します。
- グローバル索引によって、結合を使用した問合せ実行の効率が向上します。ただし、内部マテリアライズド・ビュー(グローバル索引の定義時に作成されるビュー)のメンテナンスのためにDML操作は遅くなります。
- グリッドに新しい要素が追加されると、その新しい要素にスキーマがレプリケートされます。さらに、行が再分散され、索引が再構築されます。これには、グローバル索引が含まれます。同様に、要素がグリッドから削除されたときにも、行が再分散され、索引が再作成されます。
- グローバル索引は、ハッシュによって分散された表と参照によって分散された表に定義できます。親表と子(第1レベルの参照)表のグローバル索引がサポートされます。ただし、孫表または第1レベルの参照表以外の表には、グローバル索引を定義できません。
- 重複によって分散された表には、グローバル索引を定義できません。
グローバル索引の制限事項:
- 分散キーの列リストには、
ROWID
疑似列またはROWID
型の列を含めることができません。 - グローバル一時表ではサポートされません。
- 読取り専用キャッシュ・グループではサポートされません。
- マテリアライズド・ビューではサポートされません。
グローバル索引の構文およびセマンティック・ルール
グローバル索引を作成するには、GLOBAL
キーワードを指定する必要があります。GLOBAL
キーワードを指定しないと、ローカル索引が作成されます。グローバル索引は、索引キー列のハッシュによって分散されます。
GLOBAL
キーワードを指定した場合は、グローバル索引に固有の次の句を必要に応じて指定できます。
INCLUDE
句: 索引に非キー列を含めることができるオプションの句。そのような列が索引を使用する問合せで頻繁にアクセスされる場合は、パフォーマンスが向上する可能性があります。-
IndexDistributionClause
: ハッシュ分散に使用する列を指定できるオプションの句。この句を指定しない場合は、索引列が分散キーを形成します。索引の分散キーは、表の分散キーと同じにすることはできません。 -
例:
グローバル範囲索引:
Command> CREATE GLOBAL INDEX globalindex1 ON mytab (a) INCLUDE (b,c) DISTRIBUTE BY HASH (a); Command> indexes mytab; Indexes on table SAMPLEUSER.MYTAB: MYTAB: unique range index on columns: C B GLOBALINDEX1: global non-unique range index on columns: A Included columns: B C 2 indexes found. 2 indexes found on 1 table. Command> drop table mytab;
グローバル・ハッシュ索引:
Command> CREATE TABLE mytab (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL, a TT_INTEGER NOT NULL, PRIMARY KEY (c,b)) DISTRIBUTE BY HASH (a,b); Command> CREATE GLOBAL HASH INDEX globalhashindex1 ON mytab(a) INCLUDE (b,c) PAGES=200 DISTRIBUTE BY HASH (a); Command> indexes MYTAB; Indexes on table SAMPLEUSER.MYTAB: MYTAB: unique range index on columns: C B GLOBALHASHINDEX1: global non-unique hash index on columns: A Included columns: B C 2 indexes found. 2 indexes found on 1 table.
その他の例は、「例: TimesTen Scaleout」を参照してください。
TimesTen Scaleoutの索引についての一般的な説明
-
TimesTenでは、一意でない範囲索引がデフォルトで作成されます。一意の範囲索引を作成するには、
CREATE
UNIQUE INDEX
を指定します。 -
一意でないハッシュ索引を作成する場合は、
CREATE
HASH
INDEX
を指定します。一意のハッシュ索引を作成するには、CREATE
UNIQUE
HASH
INDEX
を指定します。 -
UNIQUE
を指定した場合、索引付けされた列の既存の行の値はすべて一意である必要があります。 -
新しい索引は、
DROP INDEX
文を使用して索引を削除するか、その索引に関連付けられた表を削除しないかぎり自動的にメンテナンスされます。 -
準備された文が新しく索引付けされた表を参照している場合、その文を次回に実行する際に自動的に再度準備されます。これにより、文は新しい索引を活用することができます。
-
他の接続が所有する空でないインスタンスが一時表にある場合、別の接続によって一時表に索引を作成することはできません。
-
言語比較を使用する場合は、言語索引を作成できます。言語索引ではソート・キー値が使用され、ソート・キー値用の記憶域が必要です。1つの索引に指定できる
NLS_SORT
の値は、一意の値を1つのみです。言語索引および言語比較の詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の言語索引の使用に関する項を参照してください。 -
冗長な索引を作成すると、TimesTenにより警告またはエラーが生成されます。
ttRedundantIndexCheck
をコールして、表に対する冗長な索引のリストを表示します。 -
ハッシュ索引のサイズまたは型を変更するには、ハッシュ索引を削除して新しい索引を作成します。
-
ハッシュ索引は、固定サイズで作成され、表の存続中は変化しません。ハッシュ索引のサイズを変更するには、索引を削除して再作成します。ハッシュ索引のページが十分でない場合は、ハッシュの衝突が発生して索引の検索が遅くなります。ハッシュ・キー比較は高速な操作であるため、少数のハッシュ衝突がTimesTenにパフォーマンスの問題を発生させることはありません。
ハッシュ索引のサイズが適性に設定されていることを確認するには、
SET
PAGES
句のRowPages
パラメータの値により、アプリケーションで表の想定サイズを示す必要があります。この値は、表の想定行数を256で除算して計算します。たとえば、表に256,000行ある場合は、RowPagesに1000を指定します(256000/256=1000)。 -
索引に指定できる最大列数は32です。
問合せ処理での索引の使用
適正な索引は問合せのパフォーマンス向上につながります。索引の使用が有益な問合せと有益でない問合せがあります。また、問合せでの索引の選択も重要です。
範囲索引は、索引列の値のほとんどが一意の場合に、範囲検索および完全一致の処理に適しています。たとえば、範囲索引が列(C1,C2)
に定義されている場合、次の種類の述語の処理に索引を使用できます。ConstantOrParam
は定数値または動的パラメータを指し、range
は演算子>、<、>=または<=:を指します。
-
C1
=ConstantOrParam
AND
C2
=ConstantOrParam
-
C1
=ConstantOrParam
AND
C2
range
ConstantOrParam
-
C1
=ConstantOrParam
-
C1
range
ConstantOrParam
範囲索引は、等式述語および範囲述語の処理、ソート処理やグループ化処理に効果的です。範囲索引は、一意の値が多数ある索引列に使用します。範囲索引で指定する列の順序は関連しています。範囲索引を使用する問合せの述語内の式の順序は関連していません。問合せ処理時は、表で複数の範囲索引を定義している場合でも、表の各スキャンで範囲索引が1つだけ使用されます。
ハッシュ索引は等式述語の処理に効果的です。最適なパフォーマンスのためには、ハッシュ索引のサイズを適正にする必要があります。PAGES
パラメータを使用してハッシュ索引のサイズを指定します。指定したPAGES
の値が小さすぎると、多数のハッシュ衝突が発生し、ハッシュ索引にアクセスする文のパフォーマンスが低下します。ハッシュ索引で指定された列の順序は関連せず、範囲索引を使用する問合せの述語内の式の順序は関連しません。ハッシュ索引または範囲索引のいずれかを使用して特定の等式述語を処理する場合は、ハッシュ索引による検索は範囲索引のスキャンより高速なため、ハッシュ索引が使用されます。
文レベルまたはトランザクション・レベルのオプティマイザ・ヒントを設定することで、オプティマイザが使用する索引を変更できることがあります。文レベルのオプティマイザ・ヒントの詳細は、「文レベルのオプティマイザ・ヒント」を参照してください。トランザクション・レベルのオプティマイザ・ヒントの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttOptSetFlag、ttOptSetOrderまたはttOptUseIndexに関する項を参照してください。
例: TimesTen Scaleout
次の例は、グローバル索引を作成するための構文の要件を示しています。グローバル索引を作成するには、GLOBAL
キーワードを指定する必要があります。
グローバル索引の構文の説明
この例では、グローバル索引でサポートされる構文を説明します。
3つの列(c,b,a
)を含む表を作成して、これらの列の2つ(c,b)
に主キーを定義します。列(a,b)
のハッシュによって表を分散します。
(c,b)
に、グローバル一意範囲索引を作成します。 Command> CREATE TABLE mytab1 (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL, a TT_INTEGER NOT NULL,
PRIMARY KEY (c,b)) DISTRIBUTE BY HASH (a,b);
Command> CREATE GLOBAL UNIQUE INDEX mygix1 ON mytab1 (c,b);
Command> indexes mytab1;
Indexes on table SAMPLEUSER.MYTAB1:
MYGIX1: global unique range index on columns:
C
B
MYTAB1: unique range index on columns:
C
B
2 indexes found.
2 indexes found on 1 table.
INCLUDE
句を指定します。
Command> CREATE GLOBAL INDEX mygix2 ON MYTAB1(b) include (a);
Command> indexes mytab1
Indexes on table SAMPLEUSER.MYTAB1:
MYGIX1: global unique range index on columns:
C
B
MYTAB1: unique range index on columns:
C
B
MYGIX2: global non-unique range index on columns:
B
Included columns:
A
3 indexes found.
3 indexes found on 1 table.
b
のハッシュで索引を分散します。 Command> DROP INDEX mygix2;
Command> CREATE GLOBAL INDEX mygix2 ON MYTAB1(b) INCLUDE (a) DISTRIBUTE BY HASH(b);
Command> INDEXES mytab1
Indexes on table SAMPLEUSER.MYTAB1:
MYGIX1: global unique range index on columns:
C
B
MYTAB1: unique range index on columns:
C
B
MYGIX2: global non-unique range index on columns:
B
Included columns:
A
3 indexes found.
3 indexes found on 1 table.
グローバル・ハッシュ索引を作成します。
Command> CREATE GLOBAL HASH INDEX mygix3 ON mytab1(a) PAGES =200;
Command> indexes mytab1;
Indexes on table SAMPLEUSER.MYTAB1:
MYGIX1: global unique range index on columns:
C
B
MYTAB1: unique range index on columns:
C
B
MYGIX3: global non-unique hash index on columns:
A
MYGIX2: global non-unique range index on columns:
B
Included columns:
A
4 indexes found.
4 indexes found on 1 table.
グローバル索引の分散キーと同一の表の分散キー
この例では、分散キーが表の分散キーと同一のグローバル索引は作成できないことを示します。この例では、mytab1
表は、列(a,b)
のハッシュで分散されます。列(a,b)
を分散キーとして使用してグローバル索引を作成しようとすると、エラーが発生します。
Command> CREATE TABLE mytab1 (a TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL, c TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b); Command> CREATE GLOBAL INDEX gix1 ON mytab1(a,b,c) DISTRIBUTE BY HASH (a,b); 2253: Distribution key for global index cannot be same as that of the table or other global index. Consider creating a local index. The command failed.
グローバル索引によって作成される独自のマテリアライズド・ビューと独自のローカル索引
この例では、グローバル索引を作成するときに、TimesTen Scaleoutによって独自の内部マテリアライズド・ビューと独自のローカル索引が作成されることを示します。列(a,b)
のハッシュで分散されるmytab2
表を作成します。列(b,a)
のハッシュで分散される、一意でないグローバル範囲索引を作成します。ttIsql
indexes
コマンドを実行して、内部マテリアライズド・ビューにgix2
グローバル索引と内部ローカル索引が作成されたことを確認します。その後で、ttIsql
views
コマンドを実行して、グローバル索引の作成の結果として内部マテリアライズド・ビューも作成作成されていることを確認します。ttIsql
describe
コマンドを実行して、内部マテリアライズド・ビューを確認します。内部マテリアライズド・ビューまたは内部ローカル索引は、明示的に削除することはできません。
Command> CREATE TABLE mytab2 (a TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL, c TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b); Command> CREATE GLOBAL INDEX gix2 ON mytab2(a,b,c) DISTRIBUTE BY HASH (b,a); Command> indexes; Indexes on materialized view SAMPLEUSER.$GV9B55D3955D52: $GVI9B55D3955D52: non-unique range index on columns: A B C 1 index found. Indexes on table SAMPLEUSER.MYTAB2: GIX2: global non-unique range index on columns: A B C 1 index found. 2 indexes found on 2 tables. Command> views; SAMPLEUSER.$GV9B55D3955D52 1 view found. Command> describe SAMPLEUSER.$GV9B55D3955D52; Materialized view SAMPLEUSER.$GV9B55D3955D52: Global index: GIX2 (table: MYTAB2) Columns: A TT_INTEGER NOT NULL B TT_INTEGER NOT NULL C TT_INTEGER NOT NULL DISTRIBUTE BY HASH (B, A) 1 view found.
例: TimesTen Classic
表を作成し、col2
に一意のハッシュ索引を作成します。PAGES
句は指定しないでください。PAGES
を指定しない場合、ハッシュ表のサイズに現在の表のページ数が使用されます。INDEXES
を使用して、索引が作成されたことを確認します。表に行を挿入し、SHOWPLAN
を1に設定し、オプティマイザがハッシュ索引を使用していることを確認します。
Command> CREATE TABLE tab (col1 NUMBER PRIMARY KEY NOT NULL, col2 VARCHAR2 (30)); Command> CREATE UNIQUE HASH INDEX hash1 ON tab (col2); Command> INDEXES; Indexes on table TESTUSER.TAB: HASH1: unique hash index on columns: COL2 TAB: unique range index on columns: COL1 2 indexes found. 2 indexes found on 1 table. Command> INSERT INTO tab VALUES (10, 'ABC'); Command> SHOWPLAN 1; Command> SELECT * FROM tab where col2 = 'ABC'; Query Optimizer Plan: STEP: 1 LEVEL: 1 OPERATION: RowLkHashScan TBLNAME: TAB IXNAME: HASH1 INDEXED CONDITION: TAB.COL2 = 'ABC' NOT INDEXED: <NULL> < 10, ABC > 1 row found.
表を作成し、col1
に一意でないハッシュ索引を作成します。PAGES = CURRENT
を使用して現在の表のページ数を使用してハッシュ索引のサイズを指定します。INDEXES
を使用して、一意でないハッシュ索引が作成されることを確認します。
Command> CREATE TABLE tab2 (col1 NUMBER); Command> CREATE HASH INDEX hash_index ON tab2 (col1) PAGES = CURRENT; Command> INDEXES; Indexes on table TESTUSER.TAB2: HASH_INDEX: non-unique hash index on columns: COL1 1 index found. 1 index found on 1 table.
表を作成し、col3
に一意のハッシュ索引を作成します。PAGES = 100
を使用して、ハッシュ索引のサイズにページ数100を指定します。INDEXES
を使用して、一意のハッシュ索引が作成されることを確認します。
Command> CREATE TABLE tab3 (col1 NUMBER, col2 NUMBER, col3 TT_INTEGER); Command> CREATE UNIQUE HASH INDEX unique_hash1 on tab3 (col3) PAGES = 100; Command> INDEXES; Indexes on table TESTUSER.TAB3: UNIQUE_HASH1: unique hash index on columns: COL3 1 index found. 1 index found on 1 table.
HR
スキーマのregions
表により、region_id
に一意の索引が作成されます。regions
表に対してttIsql
INDEXES
コマンドを発行します。一意の範囲索引regions
が表示されます。
Command> INDEXES REGIONS; Indexes on table SAMPLEUSER.REGIONS: REGIONS: unique range index on columns: REGION_ID (referenced by foreign key index COUNTR_REG_FK on table SAMPLEUSER.COUNTRIES) 1 index found. 1 index found on 1 table.
regions
表に一意の索引i
を作成し、region_id
列に索引を作成してみます。警告メッセージが表示されます。
Command> CREATE UNIQUE INDEX i ON regions (region_id); Warning 2232: New index I is identical to existing index REGIONS; consider dropping index I
ttRedundantIndexCheck
をコールして、この索引に対する警告メッセージを表示します。
Command> CALL ttRedundantIndexCheck ('regions'); < Index SAMPLEUSER.REGIONS.I is identical to index SAMPLEUSER.REGIONS.REGIONS; consider dropping index SAMPLEUSER.REGIONS.I > 1 row found.
表redundancy
を作成し、列co11
およびcol2
を定義します。col1
およびcol2
に2つのユーザー索引を作成します。2つ目の索引r2
を作成しようとするとエラー・メッセージが表示されます。索引r1
は作成されます。索引r2
は作成されません。
Command> CREATE TABLE redundancy (col1 CHAR (30), col2 VARCHAR2 (30)); Command> CREATE INDEX r1 ON redundancy (col1, col2); Command> CREATE INDEX r2 ON redundancy (col1, col2); 2231: New index R2 would be identical to existing index R1 The command failed.
redundancy
表に対してttIsql
コマンドのINDEXES
を発行し、索引r1
のみが作成されていることを表示します。
Command> INDEXES redundancy; Indexes on table SAMPLEUSER.REDUNDANCY: R1: non-unique range index on columns: COL1 COL2 1 index found. 1 index found on 1 table.
この一意索引によって、部品の番号はすべて一意になります。
CREATE UNIQUE INDEX purchasing.partnumindex ON purchasing.parts (partnumber);
employees1
表に、german_index
という名前の言語索引を作成します。2つ以上の言語ソートが必要な場合は、2つ目の言語索引を作成します。
Command> CREATE TABLE employees1 (id CHARACTER (21), id2 character (21)); Command> CREATE INDEX german_index ON employees1 (NLSSORT(id, 'NLS_SORT=GERMAN')); Command> CREATE INDEX german_index2 ON employees1 (NLSSORT(id2, 'nls_sort=german_ci')); Command> indexes employees1; Indexes on table SAMPLEUSER.EMPLOYEES1: GERMAN_INDEX: non-unique range index on columns: NLSSORT(ID,'NLS_SORT=GERMAN') GERMAN_INDEX2: non-unique range index on columns: NLSSORT(ID2,'nls_sort=german_ci') 2 indexes found. 1 table found.
関連項目
CREATE MATERIALIZED VIEW
CREATE MATERIALIZED VIEW
文は、SelectQuery
句で指定された表に対するビューを作成します。ビューを作成するために使用された元の表は、ディテール表と呼ばれます。ビューは、ディテール表の変更に関して、同期でリフレッシュされます。
必要な権限
文を実行するユーザーには、CREATE MATERIALIZED VIEW
(所有者の場合)またはCREATE ANY MATERIALIZED VIEW
(非所有者の場合)権限が必要です。
- ディテール表の
SELECT
権限。 CREATE
TABLE
権限。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。DISTRIBUTE
BY
HASH
句を指定し、分散キーを定義する必要があります。DISTRIBUTE
BY
REFERENCE
句およびDUPLICATE
句はサポートされていません。
SQL構文: TimesTen Scaleout
CREATE MATERIALIZED VIEW [Owner.]ViewName
DISTRIBUTE BY HASH (ColumnName
[,...]) ASSelectQuery
[PRIMARY KEY (ColumnName
[,...])] [UNIQUE HASH ON (HashColumnName
[,...]) PAGES =PrimaryPages
]
SQL構文: TimesTen Classic
CREATE MATERIALIZED VIEW [Owner.]ViewName
ASSelectQuery
[PRIMARY KEY (ColumnName
[,...])] [UNIQUE HASH ON (HashColumnName [,...]) PAGES =PrimaryPages
]
パラメータ
パラメータ | 説明 |
---|---|
|
新しいビューに割り当てる名前。 |
|
TimesTen Scaleoutのみです。 ハッシュによってディテール表を分散する必要があります。
この句は、 |
|
ビューで使用される、ディテール表の列を選択します。 |
|
作成されるビューの主キー列の名前を指定します。主キーには最大32列を指定できます。ビュー表の結果列の名前は、一意である必要があります。表または所有者の要素を列名の定義に含めることはできません。 |
|
表のハッシュ索引。一意のハッシュ索引のみが作成されます。このパラメータは、等価条件に使用します。 |
|
ビューに定義された列をこの表のハッシュ・キーに含めます。ハッシュ索引に指定される列は、主キーの列と同じである必要があります。 |
|
表の想定ページ数に基づいてハッシュ索引のサイズを設定します。
ハッシュ索引の詳細は、「CREATE TABLE」を参照してください。 |
CREATE MATERIALIZED VIEWの説明および制限事項: TimesTen Scaleout
説明および制限を次に示します。
-
マテリアライズド・ビューを使用すると問合せの実行時間が改善することが期待される場合、SQLオプティマイザは、ベース表に対する問合せをリライトして使用可能なマテリアライズド・ビューを使用することがあります。
-
DISTRIBUTE
BY
HASH
句を指定する必要があり、これは、分散キーを使用して指定する必要があります(主キーを指定し、主キーを分散キーとして使用する場合であっても)。 -
AS
SelectQuery
句の前にDISTRIBUTE
BY
HASH
句を指定する必要があります。 -
DISTRIBUTE
BY
HASH
句のみ指定できます。DISTRIBUTE
BY
REFERENCE
句およびDUPLICATE
句はサポートされていません。 -
SelectQuery
は単一表SELECT
文に制限する必要があります。 -
SelectQuery
ではGROUP
BY
またはWHERE
句を指定できません。 -
SelectQuery
ではSQL関数を使用できません。 -
SelectQuery
では式を使用できません。 -
マテリアライズド・ビューのディテール表ではカスケード削除句を含む外部キーは使用できません。
-
分散キー列は、
SelectQuery
の投影リストに含まれている必要があります。 -
DDLはリライトされません。たとえば、ディテール表に一意の索引を作成した場合、(一意列に分散されている)マテリアライズド・ビューに対応する索引は作成されません。
説明: TimesTen ScaleoutおよびTimesTen Classic
問合せの定義について、次の制限事項および要件があります。
-
SELECT構文のリストの各式には、一意の名前が必要です。
-
非マテリアライズド・ビューを使用してマテリアライズド・ビューを定義しないでください。
-
マテリアライズド・ビュー問合せの選択リストの列に
CLOB
、BLOB
、またはNCLOB
データ型を定義しないでください。 -
ディテール表はキャッシュ・グループに属すことができず、ディテール表は圧縮を使用できません。
-
SELECT
FOR
UPDATE
.は使用しないでください。 -
システム表またはシステム・ビューを参照しないでください。
-
マテリアライズド・ビューでネストされた定義を使用しないでください。
-
動的パラメータを使用しないでください。
-
ROWNUM
を使用しないでください。 -
分析関数を使用しないでください。
-
GROUPING
SETS
、ROLLUP
、またはCUBE
を使用しないでください。 -
SYSDATE
ファンクションを使用しないでください。 -
SYSTEM_USER
ファンクション、USER
ファンクション、CURRENT_USER
ファンクション、またはSESSION_USER
ファンクションを使用しないでください。 -
NEXTVAL
またはCURRVAL
を使用しないでください。 -
OUTER JOINは使用できますが、選択リストは、外部結合に指定した各内部表に1つ以上のNULL値可能でない列を投影する必要があります。
-
WITH
subquery
句は使用しないでください。
次の制限事項(問合せの定義を除く)があります。
-
マテリアライズド・ビューの列の集計がある、ハッシュ・ベースの主キーを使用しないでください。
-
マテリアライズド・ビューは、TimesTenレプリケーションを使用して直接レプリケートできません。ディテール表はレプリケートできます。レプリケートの両側で同じマテリアライズド・ビューを定義する必要があります。TimesTenでは、該当するマテリアライズド・ビューが自動的に更新されます。
-
参照元または参照先の表がマテリアライズド・ビューの場合は、外部キーを定義できません。
問合せの定義に関する次の制限事項および要件があります。
-
ビューの定義には、選択リストのGROUP BYリストのすべての列が含まれる必要があります。
-
集約ビューには、選択リストの
COUNT (*)
またはCOUNT
(NULL値不可の列)が含まれる必要があります。 -
導出表または
JOIN
表を使用しないでください。 -
SELECT
DISTINCT
ファンクションまたは集計DISTINCTファンクションを使用しないでください。 -
集合演算子
UNION
、INTERSECT
またはMINUS
を使用しないでください。 -
NULL値可能な式の
SUM
を使用しないでください。 -
単純な列のみをGROUP BY列として使用してください。
-
GROUP BY列は自己結合表に属することができません。
-
次の句を使用しないでください。
-
HAVING
-
ORDER
BY
-
DISTINCT
-
FIRST
-
JOIN
-
-
TT_HASH
ファンクションを使用しないでください。 -
SUM
およびCOUNT
を使用できますが、SUM
およびCOUNT
を含む式は使用しないでください。SUM/COUNT
として処理されるAVG
を使用しないでください。 -
選択リストで
MIN
ファンクションまたはMAX
ファンクションを指定しないでください。 -
結合の場合
-
結合述語に
OR
を使用できません。 -
デカルト積の結合(結合述語のない結合)を指定しないでください。
-
外部結合では、各内部表を1つ以上の表に外部結合します。
-
その他の考慮事項は、次のとおりです。
-
マテリアライズド・ビューは読取り専用であり、直接更新できません。マテリアライズド・ビューの更新は、関連付けられたディテール表が変更された場合にのみ実行されます。このため、マテリアライズド・ビューに対して
DELETE
、UPDATE
またはINSERT
文を実行することはできません。 -
デフォルトでは、マテリアライズド・ビューで主キーを使用するために範囲索引が作成されます。かわりに
UNIQUE HASH
句を使用して、主キーに対してハッシュ索引を指定できます。-
アプリケーションでマテリアライズド・ビューの主キーに対して範囲問合せを実行する場合は、
UNIQUE HASH
句を省略して、マテリアライズド・ビューに対して範囲索引を選択してください。 -
主キーの完全一致検索のみをアプリケーションで実行する場合は、ハッシュ索引の方がレスポンス時間およびスループットが優れている場合があります。その場合は、
UNIQUE HASH
句を指定します。UNIQUE HASH
句の詳細は、「CREATE TABLE」を参照してください。
-
-
主キーで使用する索引の変更、またはハッシュ索引のサイズ変更を行うには、
ALTER TABLE
を使用できます。 -
ALTER TABLE
文でマテリアライズド・ビューの列の追加または削除を行うことはできません。マテリアライズド・ビューの構造を変更するには、ビューを削除してから再度作成します。 -
マテリアライズド・ビューの索引は、
CREATE INDEX
SQL文を使用して作成できます。
マテリアライズド・ビューの所有者には、ディテール表に対するSELECT
権限が必要です。SELECT
権限は、SELECT ANY TABLE
およびADMIN
システム権限によって暗黙的に指定されます。ディテール表に対するSELECT
権限またはそれ以上のレベルのシステム権限がマテリアライズド・ビューの所有者から削除されると、マテリアライズド・ビューは無効になります。
無効なマテリアライズド・ビューから選択すると、エラーを伴って失敗します。無効なマテリアライズド・ビューのディテール表を更新しても、そのマテリアライズド・ビューは更新されません。
無効なマテリアライズド・ビューを識別するには、ttIsql describe
コマンドを使用し、SYS.DBA_OBJECTS
、SYS.ALL_OBJECTS
またはSYS.USER_OBJECTS
システム表のSTATUS
列を調べます。『Oracle TimesTen In-Memory Databaseシステム表およびビュー・リファレンス』を参照してください。
削除された権限が回復されると、マテリアライズド・ビューを削除して再作成することで、無効なマテリアライズド・ビューを再度有効にすることができます。
詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』のマテリアライズド・ビューのオブジェクト権限に関する項を参照してください。
CREATE MATERIALIZED VIEWの例: TimesTen Scaleout
構文の例:
Command> CREATE MATERIALIZED VIEW mv DISTRIBUTE BY HASH (phone) AS SELECT phone FROM accounts; 1010 rows materialized.
例: TimesTen Classic
customer
表とbookorder
表の列からマテリアライズド・ビューを作成します。
CREATE MATERIALIZED VIEW custorder AS SELECT custno, custname, ordno, book FROM customer, bookorder WHERE customer.custno=bookorder.custno;
t1
表のx1
およびy1
列からマテリアライズド・ビューを作成します。
CREATE MATERIALIZED VIEW v1 AS SELECT x1, y1 FROM t1 PRIMARY KEY (x1) UNIQUE HASH ON (x1) PAGES=100;
t1
表とt2
表のx1
およびy1
列の外部結合からマテリアライズド・ビューを作成します。
CREATE MATERIALIZED VIEW v2 AS SELECT x1, y1 FROM t1, t2 WHERE x1=x2(+);
次の例では、表employees
から選択された列employee_id
およびemail
に基づいて、マテリアライズド・ビューempmatview2
を作成します。マテリアライズド・ビューの作成後、マテリアライズド・ビューempmatview2
の列mvemp_id
に索引を作成します。
CREATE MATERIALIZED VIEW empmatview2 AS SELECT employee_id mvemp_id, email mvemail FROM employees; 107 rows materialized. CREATE INDEX empmvindex ON empmatview2 (mvemp_id);
CREATE PACKAGE
CREATE PACKAGE
文は、データベースに一緒に格納される、関連するプロシージャやファンクション、その他のプログラム・オブジェクトをカプセル化したコレクションである、スタンドアロン・パッケージの仕様部を作成します。パッケージ仕様でこれらのオブジェクトを宣言します。パッケージ本体でこれらのオブジェクトを定義します。
必要な権限
CREATE PROCEDURE
(所有者の場合)またはCREATE ANY PROCEDURE
(非所有者の場合)。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
CREATE [OR REPLACE] PACKAGE [Owner.]PackageName
[InvokerRightsClause] [AccessibleByClause]
{IS|AS}
PlsqlPackageSpec
InvokerRightsClause::=
AUTHID {CURRENT_USER | DEFINER}
AccessibleByClause::=
ACCESSIBLE BY (accessor[,...])
accessor
::=
[UnitKind][Owner.]UnitName
InvokerRightsClause
またはAccessibleByClause
は任意の順序で指定できます。
パラメータ
パラメータ | 説明 |
---|---|
|
パッケージ仕様がすでに存在する場合に再作成するには、 |
|
パッケージの名前。 |
|
PL/SQLファンクションまたはプロシージャ内のSQL文が定義者権限で実行されるか実行者権限で実行されるかを指定できます。
詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』の定義者権限および実行者権限(AUTHID句)に関する項を参照してください。 |
|
この句は、パッケージを直接呼び出せる1つ以上のアクセッサ(PL/SQL単位)を指定する場合に使用します。パッケージにアクセスできるアクセッサのリストは、ホワイト・リストと呼ばれます。ホワイト・リストを使用すると、PL/SQLオブジェクトにセキュリティ・レイヤーを追加できます。特に、ホワイト・リストにあるオブジェクトのみにパッケージへのアクセスを制限できます。
構文: |
|
アクセッサは、 構文: |
|
|
|
|
|
|
|
パッケージ仕様を指定します。型定義、カーソル宣言、変数宣言、定数宣言、例外宣言およびPL/SQLサブプログラム宣言を含めることができます。 |
説明
-
AccessibleByClause
:-
AccessibleByClause
は、トップレベルのパッケージ定義で有効です。パッケージ内の個々のプロシージャまたはファンクションにAccessibleByClause
を指定することはできません。また、CREATE
PACKAGE
BODY
文でAccessibleByClause
は指定できません。 -
この句は、ヘルパー・パッケージへのアクセスを制限するために使用できます。たとえば、PL/SQLパッケージに特定の機能のAPIが定義されており、その機能が一連のヘルパー・プロシージャおよびファンクションを使用して実装されているとします。パッケージに定義されているAPIプロシージャやファンクションをコールできるようにのみアプリケーションを制限し、ヘルパー・プロシージャやファンクションを直接コールできないようにする必要があります。そのために、
ACCESSIBLE
BY
句を使用できます。 -
コンパイラは
ACCESSIBLE
BY
句の構文の妥当性をチェックしますが、アクセッサが存在することはチェックしません。このため、所有者のスキーマにまだ存在しているアクセッサを定義できます。 -
パッケージを呼び出すと、コンパイラはまず呼出しの通常のアクセス権チェックを実行します。いずれかのチェックに失敗すると、呼出し元がアクセッサであっても呼出しは失敗します。呼出し時の通常のアクセス権チェックがすべて成功し、このパッケージに
ACCESSIBLE
BY
句がない場合、呼出しは成功します。パッケージにACCESSIBLE
BY
句がある場合、呼出し元がアクセッサである場合にのみ呼出しは成功します。
-
-
パッケージを作成または置き換えた場合、パッケージに付与された権限は同じままです。オブジェクトを削除して再作成した場合、元のオブジェクトに付与されていたオブジェクト権限は削除されます。
-
レプリケートされた環境で、
CREATE PACKAGE
文はレプリケートされません。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』の既存のアクティブ・スタンバイ・ペアでの新規PL/SQLオブジェクトの作成に関する項および既存のクラシック・レプリケーション・スキームへのPL/SQLオブジェクトの追加に関する項を参照してください。
例
AccessibleByClauseの適切な使用方法の説明
この例は、AccessibleByClause
の正しい使用方法を示しています。この句は、CREATE
PACKAGE
文のトップレベルで指定されます。CallingProcプロシージャが存在する必要はないことに注意してください。
Command> CREATE OR REPLACE PACKAGE ProtectedPkg ACCESSIBLE BY (PROCEDURE CallingProc) AS PROCEDURE ProtectedProc; END; / Package created.
AccessibleByClauseの不適切な使用方法の説明
これらの例は、AccessibleByClause
の不適切な使用を示しています。最初の例では、パッケージ・プロシージャのAccessibleByClause
を使用しようとしてコンパイル・エラーが発生します。2番目の例では、CREATE
PACKAGE
BODY
文でAccessibleByClause
を使用しようとしてコンパイル・エラーになります。
この例では、パッケージ・プロシージャでACCESSIBLE
BY
句を使用します。
Command> CREATE OR REPLACE PACKAGE ProtectedPkg1 AS PROCEDURE ProtectedProc1 ACCESSIBLE BY (PROCEDURE CallingProc) END; / Warning: Package created with compilation errors. Command> SHOW ERRORS Errors for PACKAGE PROTECTEDPKG1: LINE/COL ERROR -------- ----------------------------------------------------------------- 0/0 PLS-00157: Only schema-level programs allow ACCESSIBLE BY
この例では、CREATE
PACKAGE
BODY
文でACCESSIBLE
BY
句を使用します。
Command> CREATE OR REPLACE PACKAGE ProtectedPkg3 ACCESSIBLE BY (PROCEDURE CallingProc3) AS PROCEDURE ProtectedProc3; END; / Package created. Command> CREATE OR REPLACE PACKAGE BODY ProtectedPkg3 ACCESSIBLE BY (PROCEDURE CallingProc3) AS PROCEDURE ProtectedProc3 AS BEGIN NULL; END; ; / Warning: Package body created with compilation errors. Command> SHOW ERRORS Errors for PACKAGE BODY PROTECTEDPKG3: LINE/COL ERROR -------- ----------------------------------------------------------------- 2/1 PLS-00103: Encountered the symbol "ACCESSIBLE" when expecting one of the following: is as compress compiled wrapped
APIのみをヘルパー・パッケージにアクセス可能にする方法
この例では、AccessibleByClause
の使用を説明する一連のステップを示します。例では、SampleAPI
パッケージおよびSampleHelper
パッケージを作成します。ACCESSIBLE
BY
句は、SampleAPI
パッケージのみがSampleHelper
パッケージにアクセスできるように、SampleHelper
で指定されています。
ステップ:
-
SampleHelper
パッケージを作成します。ACCESSIBLE
BY
句を指定し、SampleAPI
パッケージにSampleHelper
パッケージへのアクセス権を付与します。SampleAPI
パッケージは、ホワイト・リストにあります。Command> CREATE OR REPLACE PACKAGE SampleHelper ACCESSIBLE BY (SampleAPI) AS PROCEDURE SampleH1; PROCEDURE SampleH2; END; / Package created.
-
SampleHelper
パッケージ本体を作成します。Command> CREATE OR REPLACE PACKAGE BODY SampleHelper AS PROCEDURE SampleH1 AS BEGIN DBMS_OUTPUT.PUT_LINE('Sample helper procedure SampleH1'); END; PROCEDURE SampleH2 AS BEGIN DBMS_OUTPUT.PUT_LINE('Sample helper procedure SampleH2'); END; END; / Package body created.
-
SampleAPI
パッケージを作成します。Command> CREATE OR REPLACE PACKAGE SampleAPI AS PROCEDURE p1; PROCEDURE p2; END; / Package created.
-
SampleAPI
パッケージ本体を作成します。p1
プロシージャは、SampleHelper.SampleH1
プロシージャを参照します。p2
プロシージャは、SampleHelper.SampleH2
プロシージャを参照します。Command> CREATE OR REPLACE PACKAGE BODY SampleAPI AS PROCEDURE p1 AS BEGIN DBMS_OUTPUT.PUT_LINE('SampleAPI procedure p1'); SampleHelper.SampleH1; END; PROCEDURE p2 AS BEGIN DBMS_OUTPUT.PUT_LINE('SampleAPI procedure p2'); SampleHelper.SampleH2; END; END; / Package body created.
-
SampleAPI.p1
プロシージャおよびSampleAPI.p2
プロシージャをコールします。SampleAPI
パッケージはSampleHelper
パッケージのホワイト・リストにあり、実行は成功します。Command> SET SERVEROUTPUT ON Command> BEGIN SampleAPI.p1; SampleAPI.p2; END; / SampleAPI procedure p1 Sample helper procedure SampleH1 SampleAPI procedure p2 Sample helper procedure SampleH2 PL/SQL procedure successfully completed.
-
SampleHelper.SampleH1
プロシージャを直接コールします。アクセス権限が不十分なため、エラーが返されます。Command> BEGIN SampleHelper.SampleH1; END; / 8503: ORA-06550: line 2, column 3: PLS-00904: insufficient privilege to access object SAMPLEHELPER 8503: ORA-06550: line 2, column 3: PL/SQL: Statement ignored The command failed.
CREATE PACKAGE BODY
CREATE PACKAGE BODY
文は、スタンドアロン・パッケージの本体を作成します。パッケージとは、データベースに格納されている関連するプロシージャ、ファンクションおよびその他のプログラム・オブジェクトのカプセル化されたコレクションのことです。パッケージ仕様でこれらのオブジェクトを宣言します。パッケージ本体でこれらのオブジェクトを定義します。
必要な権限
CREATE PROCEDURE
(所有者の場合)またはCREATE ANY PROCEDURE
(非所有者の場合)。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
CREATE [OR REPLACE] PACKAGE BODY [Owner.]PackageBody {IS|AS} plsql_package_body
パラメータ
パラメータ | 説明 |
---|---|
|
パッケージ本体がすでに存在する場合に再作成するには、 |
|
パッケージ本体の名前。 |
|
|
|
PL/SQLサブプログラムで構成されるパッケージ本体を指定します。 |
説明
レプリケートされた環境で、CREATE PACKAGE BODY
文はレプリケートされません。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』の既存のアクティブ・スタンバイ・ペアでの新規PL/SQLオブジェクトの作成に関する項および既存のクラシック・レプリケーション・スキームへのPL/SQLオブジェクトの追加に関する項を参照してください。
パッケージ本体を作成または置き換えた場合、パッケージ本体に付与された権限は同じままです。オブジェクトを削除して再作成した場合、元のオブジェクトに付与されていたオブジェクト権限は削除されます。
CREATE PROCEDURE
CREATE PROCEDURE
文は、スタンドアロンのストアド・プロシージャを作成します。
必要な権限
CREATE PROCEDURE
(所有者の場合)またはCREATE ANY PROCEDURE
(非所有者の場合)。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
CREATE [OR REPLACE] PROCEDURE [Owner.]ProcedureName[(arguments [IN|OUT|IN OUT][NOCOPY] DataType [DEFAULT expr][,...])] [InvokerRightsClause][AccessibleByClause] [DETERMINISTIC] {IS|AS} plsql_procedure_body InvokerRightsClause::= AUTHID {CURRENT_USER|DEFINER} AccessibleByClause::= ACCESSIBLE BY(accessor[,...])
accessor
::= [UnitKind][Owner.]UnitName
InvokerRightsClause
、AccessibleByClause
またはDETERMINISTIC
は任意の順序で指定できます。
パラメータ
パラメータ | 説明 |
---|---|
|
プロシージャがすでに存在する場合に再作成するには、 |
|
プロシージャの名前。 |
|
引数またはパラメータの名前。プロシージャには0以上のパラメータを指定できます。パラメータを指定する場合は、パラメータのデータ型を指定する必要があります。データ型はPL/SQLデータ型である必要があります。 |
|
パラメータのモード。
|
|
可能なかぎり迅速にパラメータを渡すようにTimesTenに指示するには、 |
|
パラメータの |
|
PL/SQLファンクションまたはプロシージャ内のSQL文が定義者権限で実行されるか実行者権限で実行されるかを指定できます。
詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』の定義者権限および実行者権限(AUTHID句)に関する項を参照してください。 |
|
この句は、プロシージャを直接呼び出せる1つ以上のアクセッサ(PL/SQLユニット)を指定する場合に使用します。プロシージャにアクセスできるアクセッサのリストは、ホワイト・リストと呼ばれます。ホワイト・リストを使用すると、PL/SQLオブジェクトにセキュリティ・レイヤーを追加できます。特に、ホワイト・リストにあるオブジェクトのみにプロシージャへのアクセスを制限できます。
構文: |
|
アクセサは、 構文: |
|
|
|
|
|
パラメータに同じ値を指定してプロシージャをコールした場合に常に同じ結果値を返すように指定するには、 |
|
|
|
プロシージャの本体を指定します。 |
説明
-
AccessibleByClause
:-
コンパイラは
AccessibleByClause
の構文の妥当性をチェックしますが、アクセッサが存在することはチェックしません。このため、所有者のスキーマにまだ存在しているアクセッサを定義できます。 -
プロシージャを呼び出すと、コンパイラはまず呼出しの通常のアクセス権チェックを実行します。いずれかのチェックに失敗すると、呼出し元がアクセッサであっても呼出しは失敗します。呼出し時の通常のアクセス権チェックがすべて成功し、このプロシージャに
AccessibleByClause
がない場合、呼出しは成功します。プロシージャにAccessibleByClause
がある場合、呼出し元がアクセッサである場合にのみ呼出しは成功します。
-
-
プロシージャを作成または置き換えた場合、プロシージャに付与された権限は同じままです。オブジェクトを削除して再作成した場合、元のオブジェクトに付与されていたオブジェクト権限は削除されます。
-
PL/SQLプロシージャのネームスペースは、TimesTen組込みプロシージャとは異なります。PL/SQLプロシージャは、TimesTen組込みプロシージャと同じ名前で作成できます。
-
次の句はTimesTenではサポートされません。
-
call_spec
句 -
AS EXTERNAL
句
-
-
レプリケートされた環境で、
CREATE PROCEDURE
文はレプリケートされません。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』の既存のアクティブ・スタンバイ・ペアでの新規PL/SQLオブジェクトの作成に関する項および既存のクラシック・レプリケーション・スキームへのPL/SQLオブジェクトの追加に関する項を参照してください。
例
AccessibleByClauseの使用
この例では、ProtectedProc
プロシージャを作成し、ACCESSIBLE
BY
句を使用してCallingProc
プロシージャへのアクセスを制限します。CallingProc
プロシージャはまだ存在しません。次に、ProtectedProc
プロシージャをコールするCallingProc
プロシージャを作成します。CallingProc
プロシージャは、ACCESSIBLE
BY
句で指定されているため正常に作成されます。例では、ProtectedProc
プロシージャを直接コールしようとしてエラーが発生します。最終的にProtectedProc
プロシージャを参照するAnotherCallingProc
プロシージャを作成しようとしますが、AnotherCallingProc
プロシージャはホワイト・リストに存在しません。コンパイル・エラーが発生します。
この例を示すステップ:
-
ACCESSIBLE
BY
句を指定して、ProtectedProc
プロシージャを作成します。CallingProc
プロシージャは、ホワイト・リストにあります。まだ存在しません。Command> CREATE OR REPLACE PROCEDURE ProtectedProc ACCESSIBLE BY (CallingProc) AS BEGIN DBMS_OUTPUT.PUT_LINE ('ProtectedProc'); END; / Procedure created.
-
ProtectedProc
プロシージャを参照して、CallingProc
プロシージャを作成します。Command> CREATE OR REPLACE PROCEDURE CallingProc AS BEGIN DBMS_OUTPUT.PUT_LINE ('CallingProc'); ProtectedProc; END; / Procedure created.
-
CallingProc
プロシージャをコールします。プロシージャは正常に実行されます。Command> SET SERVEROUTPUT ON Command> exec CallingProc; CallingProc ProtectedProc PL/SQL procedure successfully completed.
-
ProtectedProc
プロシージャの直接のコールを試行します。アクセス権限が不十分なため、エラーがスローされます。Command> exec ProtectedProc; 8503: ORA-06550: line 1, column 7: PLS-00904: insufficient privilege to access object PROTECTEDPROC 8503: ORA-06550: line 1, column 7: PL/SQL: Statement ignored The command failed.
-
ProtectedProc
プロシージャを参照するAnotherCallingProc
プロシージャを作成します。AnotherCallingProc
がホワイト・リスト内にない(ProtectedProc
のACCESSIBLE
BY
句に含まれない)ため、コンパイル・エラーが発生します。Command> CREATE OR REPLACE PROCEDURE AnotherCallingProc AS BEGIN DBMS_OUTPUT.PUT_LINE ('AnotherCallingProc'); ProtectedProc; END; / Warning: Procedure created with compilation errors. Command> SHOW ERRORS Errors for PROCEDURE ANOTHERCALLINGPROC: LINE/COL ERROR -------- ----------------------------------------------------------------- 5/1 PL/SQL: Statement ignored 5/1 PLS-00904: insufficient privilege to access object PROTECTEDPROC
アクセサ句の使用
この例は、アクセッサ句を一連のステップで使用する方法を示しています。
-
SampleUser1
ユーザーとSampleUser2
ユーザーを作成し、両方のユーザーにADMIN
権限を付与します。Command> CREATE USER SampleUser1 IDENTIFIED BY SampleUser1; User created. Command> CREATE USER SampleUser2 IDENTIFIED BY SampleUser2; User created. Command> GRANT ADMIN TO SampleUser1, SampleUser2;
-
ACCESSIBLE
BY
句を指定して、SampleUser1.ProtectedProc
プロシージャを作成します。CallingProc
プロシージャは、所有者なしでホワイト・リスト内に指定されます。CallingProc
プロシージャの所有者は、ACCESSIBLE
BY
句を持つプロシージャの所有者と同じスキーマ内に存在すると想定されます。したがって、CallingProc
はSampleUser1
スキーマ内にあるとみなされます。Command> CREATE OR REPLACE PROCEDURE SampleUser1.ProtectedProc ACCESSIBLE BY (CallingProc) AS BEGIN DBMS_OUTPUT.PUT_LINE ('SampleUser1 ProtectedProc'); END; / Procedure created.
-
SampleUser1
として接続します。SampleUser1.ProtectedProc
プロシージャを参照して、CallingProc
プロシージャを作成します。Command> Connect adding "uid=SampleUser1;pwd=SampleUser1PW" as SampleUser1; Connection successful: DSN=database1;UID=SampleUser1;DataStore=/scratch/sampleuser1/database1; DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=AL32UTF8; PermSize=128; (Default setting AutoCommit=1) sampleuser1: Command> CREATE OR REPLACE PROCEDURE CallingProc AS BEGIN DBMS_OUTPUT.PUT_LINE ('SampleUser1 CallingProc'); ProtectedProc; END; / Procedure created.
-
SampleUser1
接続から、CallingProc
プロシージャをコールします。コールは成功します。sampleuser1: Command> SET SERVEROUTPUT ON sampleuser1: Command> exec CallingProc; SampleUser1 CallingProc SampleUser1 ProtectedProc PL/SQL procedure successfully completed.
-
SampleUser2
に接続します。SampleUser1.ProtectedProc
プロシージャを参照して、CallingProc
プロシージャを作成します。コンパイル・エラーが発生します。SampleUser1: Command> connect adding "uid=Sampleuser2;pwd=SampleUser2PW" as SampleUser2; Connection successful: DSN=database1;UID=Sampleuser2;DataStore=/scratch/sampleuser2/database1; DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=AL32UTF8; PermSize=128; (Default setting AutoCommit=1) sampleuser2: Command> CREATE OR REPLACE PROCEDURE CallingProc AS BEGIN DBMS_OUTPUT.PUT_LINE ('SampleUser2 CallingProc'); SampleUser1.ProtectedProc; END; / Warning: Procedure created with compilation errors. sampleuser2: Command> SHOW ERRORS Errors for PROCEDURE CALLINGPROC: LINE/COL ERROR -------- ----------------------------------------------------------------- 5/1 PL/SQL: Statement ignored 5/1 PLS-00904: insufficient privilege to access object PROTECTEDPROC
-
SampleUser1
接続に切り替えます。ProtectedProc
プロシージャを再作成します。sampleuser2: Command> use SampleUser1 sampleuser1: Command> CREATE OR REPLACE PROCEDURE ProtectedProc ACCESSIBLE BY (CallingProc, SampleUser2.CallingProc) AS BEGIN DBMS_OUTPUT.PUT_LINE ('SampleUser1 ProtectedProc'); END; / Procedure created.
-
SampleUser2
接続から、CallingProc
プロシージャをコールします。SampleUser2.CallingProc
はSampleUser1.ProtectedProc
プロシージャのホワイト・リストにあり、実行が成功します。sampleuser1: Command> use SampleUser2; sampleuser2: Command> SET SERVEROUTPUT ON sampleuser2: Command> exec CallingProc SampleUser2 CallingProc SampleUser1 ProtectedProc PL/SQL procedure successfully completed.
CREATE PROCEDURE文を使用した情報の取得
プロシージャquery_emp
を作成して、従業員に関する情報を取得します。employee_id
171
をプロシージャに渡し、2つのOUT
パラメータに対してlast_name
およびsalary
を取得します。
Command> CREATE OR REPLACE PROCEDURE query_emp (p_id IN employees.employee_id%TYPE, p_name OUT employees.last_name%TYPE, p_salary OUT employees.salary%TYPE) IS BEGIN SELECT last_name, salary INTO p_name, p_salary FROM employees WHERE employee_id = p_id; END query_emp; / Procedure created.
CREATE PROFILE
CREATE
PROFILE
文では、プロファイルを作成します。プロファイルとは、データベース・リソースに対する制限のセットです。ユーザーにプロファイルを割り当てると、そのユーザーはプロファイルで指定された制限を超えることができなくなります。
必要な権限
ADMIN
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
CREATE PROFILE profile LIMIT password_parameters password_parameters::= [FAILED_LOGIN_ATTEMPTS password_parameter_options] [PASSWORD_LIFE_TIME password_parameter_options] [PASSWORD_REUSE_TIME password_parameter_options] [PASSWORD_REUSE_MAX password_parameter_options] [PASSWORD_LOCK_TIME password_parameter_options] [PASSWORD_GRACE_TIME password_parameter_options] [{PASSWORD_COMPLEXITY_CHECKER|PASSWORD_VERIFY_FUNCTION} password_checker_options] password_parameter_options::= UNLIMITED|DEFAULT|constant password_checker_options::= function|NULL|DEFAULT function:: TT_VERIFY_FUNCTION|TT_STRONG_VERIFY_FUNCTION|TT_STIG_VERIFY_FUNCTION
パラメータ
パラメータ | 説明 |
---|---|
|
プロファイルの名前。 |
|
パスワード・パラメータは、パスワード・パラメータの名前とパスワード・パラメータの値(または制限)で構成されます。これには、パスワード複雑度チェッカ関数が含まれます。すべてのパラメータ(
|
|
ユーザーのアカウントがロックされるまでの、ユーザーによるデータベースへの接続試行の連続失敗回数を指定します。 |
|
ユーザーが認証に同じパスワードを使用できる日数を指定します。 |
|
これら2つのパラメータは、同時に使用する必要があります。
これらのパラメータを有効にするには、その両方に値を指定する必要があります。具体的には、次のようになります。
|
|
指定した回数連続して接続に失敗した後に、ユーザー・アカウントがロックされる日数を指定します。 |
|
猶予期間の開始後の日数を指定します。この間は、TimesTenが警告を示しますが、データベースへの接続は許可されます。猶予期間中にパスワードが変更されないと、そのパスワードは期限切れになります。このパラメータは、 |
|
パスワード・パラメータに制限がないことを示します。 |
|
このプロファイルのパスワード・パラメータに対する制限を省略することを示します。このプロファイルが割り当てられているユーザーは、このパスワード・パラメータの
|
|
|
|
パスワードに対するパスワード検証を実行するかどうかを示します。実行する場合は、検証に使用する関数を指定します。 function は、サポートされている3つのパスワード複雑度チェッカ関数のいずれかを示します。TimesTenにパスワード検証を実行するように指示するには、これらの関数のいずれかを指定します。有効な値は次のとおりです。
|
説明: PROFILE文
-
CREATE
PROFILE
文を使用して、パスワード・リソースのプロファイルを作成します。パスワード・パラメータとは、パスワード・リソースに対する制限のセットです。ユーザーにプロファイルを割り当てると、そのユーザーはプロファイルで指定された制限を超えることができなくなります。ユーザーにプロファイルを割り当てていないと、TimesTenによってDEFAULT
プロファイルが割り当てられます。パスワード管理とプロファイルの詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』のパスワード管理に関する項を参照してください。 -
ユーザーのパスワード・パラメータ制限を指定するには、次の手順を実行します。
-
CREATE
PROFILE
文を使用して、パスワード・パラメータの制限を定義するプロファイルを作成します。 -
CREATE
USER
文またはALTER
USER
文を使用して、ユーザーにプロファイルを割り当てます。
-
-
各パスワード・パラメータの制限を定義する、
DEFAULT
プロファイルがあります。このプロファイルは、これらのパラメータに最初にUNLIMITED
を定義します(パラメータに制限が設定されていないことを示します)。次の例外があります。-
FAILED_LOGIN_ATTEMPTS
:10
に設定されます。 -
PASSWORD_LOCK_TIME
:0.0034722222222222
日(5分、5/1440日)に設定されます。 -
PASSWORD_COMPLEXITY_CHECKER
:NULL
に設定されます。
これらの制限を変更するには、
ALTER
PROFILE
文を使用して、プロファイル名に"DEFAULT"
を指定します。(DEFAULT
は二重引用符で囲む必要があります)。詳細は、「ALTER PROFILE」を参照してください。 -
-
ユーザーにプロファイルが割り当てられていない場合、そのユーザーは
DEFAULT
プロファイルに定義されている制限を受けます。ユーザーにプロファイルが割り当てられていて、そのプロファイルでパスワード・パラメータの制限が指定されていない場合や、パスワード・パラメータにDEFAULT
が指定されている場合、そのユーザーはDEFAULT
プロファイルで定義されているパスワード・パラメータの制限を受けます。 -
インスタンス管理者には、システム・プロファイルが割り当てられます。インスタンス管理者のプロファイルは、変更することも削除することもできません。
パスワード複雑度チェッカの検証について
パスワード複雑度チェッカの検証により、ユーザーのパスワードはパスワードを推測しようとする侵入者を十分に阻止できる複雑なものになります。CREATE
PROFILE
文でパスワード複雑度チェッカ関数を指定し、このプロファイルをユーザーに割り当てると、ユーザーはパスワード複雑度チェッカ関数で定義されている要件を満たすパスワードを作成することが必要になります。そのような要件は、指定した特定のパスワード複雑度チェッカ関数によって異なります。
TimesTenには、パスワードの複雑度を管理するために、TT_VERIFY_FUNCTION
、TT_STRONG_VERIFY_FUNCTION
およびTT_STIG_VERIFY_FUNCTION
のパスワード複雑度チェッカ関数が用意されています。これらの関数は、SYS
スキーマに格納されています。
- 文字:大文字と小文字
- 数字:
0
から9
の数字 - 特殊: 文字でも数字でもない文字。
`~!@#$%^&*()_-+={}[]\/<>,.?':|(space)
ノート:
-
1つ以上の特殊文字を使用する場合は、パスワード全体を二重引用符(
"
)で囲む必要があります。例外は、#
と@
の特殊文字です。(#
または@
を含むパスワードは、二重引用符で囲む必要がありません)。 -
パスワードには、セミコロン(
;
)や二重引用符("
)を含めることはできません。 -
パスワード全体を二重引用符で囲まないかぎり、パスワードの先頭は文字にする必要があります。
-
パスワード複雑度チェッカの検証に独自の関数を定義することはできません。CREATE
USER
文またはALTER
USER
文でIDENTIFIED
BY
句を使用すると、パスワードの複雑度がチェックされます。
TT_VERIFY_FUNCTION
TT_VERIFY_FUNCTION
は、次のパスワード複雑度チェッカの検証を実行します。
- パスワードは次のようにします。
- 8文字以上にする必要があります。
- これらの8文字のうちに、それぞれ少なくとも1つの文字、1つの数字、1つの特殊文字を含める必要があります。
- パスワードに使用できないものを次に示します。
- ユーザー名またはユーザー名を逆にしたもの
- データベース名
Oracle
またはTimesTen
ノート:
比較では、大文字と小文字が区別されません。
TT_STRONG_VERIFY_FUNCTION
TT_STRONG_VERIFY_FUNCTION
は、次のパスワード複雑度チェッカの検証を実行します。
- 9文字以上にする必要があります。
- この9文字のうちに、それぞれ少なくとも2つの大文字、2つの小文字、2つの数字および2つの特殊文字を含める必要があります。
TT_STIG_VERIFY_FUNCTION
- 15文字以上にする必要があります。
- この15文字のうちに、それぞれ少なくとも1つの大文字、1つの小文字、1つの数字および1つの特殊文字を含める必要があります。
説明: パスワード複雑度チェッカの検証
TT_VERIFY_FUNCTION
、TT_STRONG_VERIFY_FUNCTION
およびTT_STIG_VERIFY_FUNCTION
に対するEXECUTE
権限が必要です。TimesTenは、これらの関数に対するEXECUTE
権限をPUBLIC
にデフォルトで付与します。SYSTEM
プロファイルとDEFAULT
プロファイルには、NULL
の値がデフォルトで割り当てられます。NULL
値は、これらのプロファイルにパスワード複雑度チェッカ関数が存在しないことを示します。そのため、パスワード複雑度チェッカの検証は実行されません。SYSTEM
プロファイルを変更して、パスワード複雑度チェッカ関数を指定することはできません。システム・ユーザーのパスワードは、パスワード複雑度チェッカの検証の対象にはなりません。ALTER
PROFILE
文を使用すると、パスワード複雑度チェッカ関数を指定するためにDEFAULT
プロファイルを変更できます。そうした関数は、PASSWORD_COMPLEXITY_CHECKER
(またはPASSWORD_VERIFY_FUNCTION
)句で指定します。- TimesTenの
TT_VERIFY_FUNCTION
関数、TT_STRONG_VERIFY_FUNCTION
関数およびTT_STIG_VERIFY_FUNCTION
関数は、Oracle DatabaseのORA12C_VERIFY_FUNCTION
関数、ORA12C_STRONG_VERIFY_FUNCTION
関数およびORA12C_STIG_VERIFY_FUNCTION
関数と同等のものです。 ttMigrate
ユーティリティを使用して以前のメジャー・リリース(18.1リリースなど)にダウングレードすると、データベース内の各プロファイルのPASSWORD_COMPLEXITY_CHECKER
の値はNULL
に設定されます。
パスワード複雑度チェッカ関数の制限
- パスワード複雑度チェッカ関数には、
SYS
スキーマを指定できません。たとえば:Command> CREATE PROFILE my_profile LIMIT PASSWORD_COMPLEXITY_CHECKER SYS.TT_VERIFY_FUNCTION; 15187: Cannot specify schema name for password complexity checker function The command failed.
- 独自のパスワード複雑度チェッカ関数を定義することはできません。
TT_VERIFY_FUNCTION
、TT_STRONG_VERIFY_FUNCTION
またはTT_STIG_VERIFY_FUNCTION
のパスワード複雑度チェッカ関数のみを使用してください。 - パスワード複雑度チェッカの検証は、新しく作成したパスワードにのみ実行されます。この新しいパスワードは、
CREATE
USER
文またはALTER
USER
文のIDENTIFIED
BY
句を使用して指定します。TimesTenは、古いパスワードと新しいパスワードの違いを確認しません。 - パスワードの指定時に、マルチバイト文字はサポートされません。TimesTenは、マルチバイト文字が含まれるパスワードを検証しません。
例
次の各例では、CREATE
PROFILE
文の様々な使用方法を示します。各例では、サポートされている句の使用方法も示します。
- パスワード複雑度チェッカの検証の例:
- その他の例:
PASSWORD_COMPLEXITY_CHECKERに対するTT_VERIFY_FUNCTIONの指定
この例では、最初にプロファイルを作成して、TT_VERIFY_FUNCTION
関数を指定します。その後で、dba_profiles
システム・ビューを問い合せて、このプロファイルにTT_VERIFY_FUNCTION
が割り当てられていることを確認します。このプロファイルが割り当てられたユーザーは、この関数のパスワード検証要件を満たすパスワードを指定する必要があります。
Command> CREATE PROFILE myprofile_pw1 LIMIT
PASSWORD_COMPLEXITY_CHECKER TT_VERIFY_FUNCTION;
Profile created.
Command> SELECT * FROM dba_profiles WHERE profile = 'MYPROFILE_PW1';
< MYPROFILE_PW1, FAILED_LOGIN_ATTEMPTS, PASSWORD, DEFAULT >
< MYPROFILE_PW1, PASSWORD_LIFE_TIME, PASSWORD, DEFAULT >
< MYPROFILE_PW1, PASSWORD_REUSE_TIME, PASSWORD, DEFAULT >
< MYPROFILE_PW1, PASSWORD_REUSE_MAX, PASSWORD, DEFAULT >
< MYPROFILE_PW1, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, TT_VERIFY_FUNCTION >
< MYPROFILE_PW1, PASSWORD_LOCK_TIME, PASSWORD, DEFAULT >
< MYPROFILE_PW1, PASSWORD_GRACE_TIME, PASSWORD, DEFAULT >
< MYPROFILE_PW1, TEMP_SPACE_PER_SESSION_MAX, MEMORY, DEFAULT >
8 rows found.
sampleuser_pw1
ユーザーを作成して、このユーザーにmyprofile_pw1
プロファイルを割り当てます。TT_VERIFY_FUNCTION
の要件を満たしているパスワードを指定します。TT_VERIFY_FUNCTION
関数の詳細は、「TT_VERIFY_FUNCTION」を参照してください。
Command> CREATE USER sampleuser_pw1
IDENTIFIED BY "A1!XXcg3" PROFILE myprofile_pw1;
User created.
sampleuser_pw2
を作成してみます。ユーザーにmyprofile_pw1
プロファイルを割り当てます。ユーザー名を逆にしたパスワードを大文字で指定します。CREATE
USER
文は失敗します。パスワードには、逆にしたユーザー名を含めることはできません。比較では、大文字と小文字が区別されない点に注意してください。
Command> CREATE USER sampleuser_pw2
IDENTIFIED BY "2WP_RESUELPMAS" PROFILE myprofile_pw1;
15186: Password complexity check for the specified password failed
15188: TT-20002: Password contains the username reversed
The command failed.
PASSWORD_COMPLEXITY_CHECKERに対するTT_STRONG_VERIFY_FUNCTIONの指定
この例では、myprofile_pw2
プロファイルを作成して、PASSWORD_COMPLEXITY_CHECKER
パスワード・パラメータにTT_STRONG_VERIFY_FUNCTION
を指定します。その後で、sampleuser_pw2
ユーザーを作成し、このユーザーにmyprofile_pw2
プロファイルを割り当てます。パスワードはTT_STRONG_VERIFY_FUNCTION
関数の要件を満たします。TT_STRONG_VERIFY_FUNCTION
関数の詳細は、「TT_STRONG_VERIFY_FUNCTION」を参照してください。
Command> CREATE PROFILE myprofile_pw2 LIMIT
PASSWORD_COMPLEXITY_CHECKER TT_STRONG_VERIFY_FUNCTION;
Profile created.
sampleuser_pw2
ユーザーを作成して、このユーザーにmyprofile_pw2
プロファイルを割り当てます。パスワードはTT_STRONG_VERIFY_FUNCTION
関数の要件を満たしています。ユーザーが正常に作成されます。
Command> CREATE USER sampleuser_pw2
IDENTIFIED BY "!ddFF6C2?" PROFILE myprofile_pw2;
User created.
PASSWORD_COMPLEXITY_CHECKERに対するTT_STIG_VERIFY_FUNCTIONの指定
この例では、myprofile_pw3
プロファイルを作成して、PASSWORD_COMPLEXITY_CHECKER
パスワード・パラメータにTT_STIG_VERIFY_FUNCTION
を指定します。その後で、sampleuser_pw3
ユーザーを作成し、このユーザーにmyprofile_pw3
プロファイルを割り当てます。パスワードはTT_STIG_VERIFY_FUNCTION
関数の要件を満たします。TT_STIG_VERIFY_FUNCTION
関数の詳細は、「TT_STIG_VERIFY_FUNCTION」を参照してください。
Command> CREATE PROFILE myprofile_pw3 LIMIT
PASSWORD_COMPLEXITY_CHECKER TT_STIG_VERIFY_FUNCTION;
Profile created.
sampleuser_pw3
ユーザーを作成して、このユーザーにmyprofile_pw3
プロファイルを割り当てます。パスワードはTT_STIG_VERIFY_FUNCTION
関数の要件を満たします。ユーザーが正常に作成されます。
Command> CREATE USER sampleuser_pw3
IDENTIFIED BY "!ddBBKKUYT165>m" PROFILE myprofile_pw3;
User created.
SYSTEMとDEFAULTのPASSWORD_COMPLEXITY_CHECKER値の変更
この例では、dba_profiles
システム・ビューを問い合せて、SYSTEM
プロファイルとDEFAULT
プロファイルのPASSWORD_COMPLEXITY_CHECKER
パスワード・パラメータの値を確認します。デフォルトでは、この値はNULL
です。
Command> SELECT * FROM dba_profiles WHERE
resource_name='PASSWORD_COMPLEXITY_CHECKER' AND
profile IN ('DEFAULT','SYSTEM');
< DEFAULT, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, NULL >
< SYSTEM, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, NULL >
2 rows found.
SYSTEM
プロファイルのPASSWORD_COMPLEXITY_CHECKER
パスワード・パラメータを変更してみます。このパスワード・パラメータは変更できないため、エラーが発生します。
Command> ALTER PROFILE SYSTEM LIMIT
PASSWORD_COMPLEXITY_CHECKER TT_STRONG_VERIFY_FUNCTION;
15176: Profile SYSTEM cannot be altered
The command failed.
DEFAULT
プロファイルのPASSWORD_COMPLEXITY_CHECKER
パスワード・パラメータを変更してみます。この変更は成功します。DEFAULT
プロファイルが割り当てられているユーザー(特定のプロファイルが割り当てられていないユーザー)には、TT_STRONG_VERIFY_FUNCTION
関数のパスワード検証要件を満たしているパスワードの指定が必要です。
Command> ALTER PROFILE "DEFAULT" LIMIT
PASSWORD_COMPLEXITY_CHECKER TT_STRONG_VERIFY_FUNCTION;
Profile altered
dba_profiles
ビューを問い合せて、DEFAULT
プロファイルにTT_STRONG_VERIFY_FUNCTION
が割り当てられていることを確認します。
Command> SELECT * FROM dba_profiles WHERE
resource_name='PASSWORD_COMPLEXITY_CHECKER' AND
profile = 'DEFAULT';
< DEFAULT, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, TT_STRONG_VERIFY_FUNCTION >
1 row found.
プロファイルの作成と無効なパスワード複雑度チェッカ関数の指定の試行
この例では、PASSWORD_COMPLEXITY_CHECKER
句に対して無効なパスワード複雑度チェッカ関数を指定しています。この関数がSYS
スキーマに存在していても、指定可能なパスワード複雑度チェッカ関数はサポートされている3つのいずれかのみであるため、エラーが発生します。
Command> CREATE PROFILE myprofile1 LIMIT
PASSWORD_COMPLEXITY_CHECKER TT_COMPLEXITY_CHECK;
8529: Invalid password complexity checker function TT_COMPLEXITY_CHECK
The command failed.
プロファイルの作成とパスワード・パラメータの制限の設定
この例では、profile1
プロファイルを作成して、パスワード・パラメータに様々な制限を設定します。その次に、dba_profiles
システム・ビューを問い合せて制限を確認します。
Command> CREATE PROFILE profile1 LIMIT FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LIFE_TIME 60 PASSWORD_REUSE_TIME 60 PASSWORD_REUSE_MAX 5 PASSWORD_LOCK_TIME 1 PASSWORD_GRACE_TIME 10; Profile created.
dba_profiles
システム・ビューを問い合せて制限を確認します。PASSWORD_COMPLEXITY_CHECKER
パスワード・パラメータがCREATE
PROFILE
文で指定されていないため、PASSWORD_COMPLEXITY_CHECKER
の値がDEFAULT
になっている点に注目してください(この値は、DEFAULT
プロファイルから得られた値です)。
Command> SELECT * FROM dba_profiles WHERE profile = 'PROFILE1' AND resource_type='PASSWORD'; < PROFILE1, FAILED_LOGIN_ATTEMPTS, PASSWORD, 5 > < PROFILE1, PASSWORD_LIFE_TIME, PASSWORD, 60 > < PROFILE1, PASSWORD_REUSE_TIME, PASSWORD, 60 > < PROFILE1, PASSWORD_REUSE_MAX, PASSWORD, 5 > < PROFILE1, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, DEFAULT > < PROFILE1, PASSWORD_LOCK_TIME, PASSWORD, 1 > < PROFILE1, PASSWORD_GRACE_TIME, PASSWORD, 10 > 7 rows found.
プロファイルの作成とFAILED_LOGIN_ATTEMPTSの指定
この例では、profile2
プロファイルを作成して、FAILED_LOGIN_ATTEMPTS
に1
の値を指定します。その次に、user2
ユーザーを作成して、user2
にprofile2
プロファイルを割り当てます。user2
ユーザーはデータベースに接続しようとしますが、無効なパスワードを指定します。接続に失敗します。その5分後に、user2
ユーザーはデータベースに再度接続しようとします。PASSWORD_LOCK_TIME
の値が0.0034722222222222
(5分)のため、接続に成功します(この値は、DEFAULT
プロファイルで指定されています)。
Command> CREATE PROFILE profile2 LIMIT FAILED_LOGIN_ATTEMPTS 1; Profile created. Command> CREATE USER user2 IDENTIFIED BY user2 PROFILE profile2; User created.
user2
にadmin
権限を付与します。
Command> GRANT ADMIN TO user2;
データベースに接続してみます。接続文字列で無効なパスワードを指定したため、接続に失敗します。
Command> connect adding "UID=user2;PWD=user3" as user2; 7001: User authentication failed The command failed.
接続文字列で正しいパスワードを指定して、再度接続してみます。次の理由で接続に失敗します。
-
前に接続しようとして1回失敗していること
-
5分間のパスワード・ロック時間が経過する前に、データベースに接続しようとしたこと
none: Command> use database1 database1: Command> connect adding "UID=user2;PWD=user2" as user2; 15179: the account is locked The command failed.
5分後に、データベースに再度接続してみます。接続が成功します。
none: Command> use database1 database1: Command> connect adding "UID=user2;PWD=user2" as user2; Connection successful: DSN=database1;UID=user2;DataStore=/scratch/database1; DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=AL32UTF8;PermSize=128; (Default setting AutoCommit=1)
DEFAULTプロファイルのパスワード・パラメータ値の調査
この例では、dba_profiles
システム・ビューを問い合せて、DEFAULT
プロファイルのパスワード・パラメータ値を確認します。
Command> SELECT * FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_type='PASSWORD'; < DEFAULT, FAILED_LOGIN_ATTEMPTS, PASSWORD, 10 > < DEFAULT, PASSWORD_LIFE_TIME, PASSWORD, UNLIMITED > < DEFAULT, PASSWORD_REUSE_TIME, PASSWORD, UNLIMITED > < DEFAULT, PASSWORD_REUSE_MAX, PASSWORD, UNLIMITED > < DEFAULT, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, NULL > < DEFAULT, PASSWORD_LOCK_TIME, PASSWORD, .0034 > < DEFAULT, PASSWORD_GRACE_TIME, PASSWORD, UNLIMITED > 7 rows found.
PASSWORD_LIFE_TIMEとPASSWORD_GRACE_TIMEの指定
この例では、profile4
プロファイルを作成して、PASSWORD_LIFE_TIME
パスワード・パラメータに0.0034722222222222
(5分)の値を指定し、PASSWORD_GRACE_TIME
パスワード・パラメータに0.01041667
(15分)の値を指定します。その次に、user4
ユーザーを作成して、user4
にprofile4
プロファイルを割り当てます。この例では、user4
として継続してデータベースへの接続を試行します。
Command> CREATE PROFILE profile4 LIMIT PASSWORD_LIFE_TIME 0.0034722222222222 PASSWORD_GRACE_TIME 0.01041667; Profile created.
dba_profiles
システム・ビューを問い合せて、パスワード・パラメータの値を確認します。
Command> SELECT * FROM dba_profiles WHERE profile = 'PROFILE4' AND resource_type='PASSWORD'; < PROFILE2, FAILED_LOGIN_ATTEMPTS, PASSWORD, DEFAULT > < PROFILE2, PASSWORD_LIFE_TIME, PASSWORD, .0034 > < PROFILE2, PASSWORD_REUSE_TIME, PASSWORD, DEFAULT > < PROFILE2, PASSWORD_REUSE_MAX, PASSWORD, DEFAULT > < PROFILE2, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, DEFAULT > < PROFILE2, PASSWORD_LOCK_TIME, PASSWORD, DEFAULT > < PROFILE2, PASSWORD_GRACE_TIME, PASSWORD, .0104 > 7 rows found.
user4
ユーザーを作成して、user4
にprofile4
プロファイルを割り当てます。user4
にCONNECT
権限を付与します。
Command> CREATE USER user4 IDENTIFIED BY user4 PROFILE profile4; User created. Command> GRANT CONNECT TO user4;
user4
としてデータベースに接続します。接続が成功します。
Command> connect adding "UID=user4;PWD=user4" as user4; Connection successful: DSN=access1;UID=user4;DataStore=/scratch/database1; DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=AL32UTF8;PermSize=128; (Default setting AutoCommit=1)
データベースからの切断5分後に、user4
としてデータベースに再接続します。接続は成功しますが、警告が発行されます。パスワードの有効期間は5分で、パスワードの猶予期間は15分です。
user4: Command> disconnect user4; Disconnecting from user4... none: Command> use database1 database1: Command> connect adding "UID=user4;PWD=user4" as user4; Warning 15182: Password will expire within 0.010417 days Connection successful: DSN=access1;UID=user4;DataStore=/scratch/database1; DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=AL32UTF8;PermSize=128; (Default setting AutoCommit=1)
データベースからの切断15分後に、user4
としてデータベースに再接続します。15分間のパスワード猶予期間が終了しているため、接続に失敗します。
user4: Command> disconnect user4; Disconnecting from user4... none: Command> use database1 database1: Command> connect adding "UID=user4;PWD=user4" as user4; 15180: the password has expired The command failed.
LIMITキーワードのみを指定したプロファイルの作成
この例では、profile5
プロファイルを作成して、LIMIT
キーワードのみを指定します。その次に、dba_profiles
システム・ビューを問い合せて、profile5
プロファイルのパスワード・パラメータ制限がすべてDEFAULT
の値に設定されていることを確認します。
Command> CREATE PROFILE profile5 LIMIT; Profile created. Command> SELECT * FROM dba_profiles WHERE profile = 'PROFILE5' AND resource_type='PASSWORD < PROFILE5, FAILED_LOGIN_ATTEMPTS, PASSWORD, DEFAULT > < PROFILE5, PASSWORD_LIFE_TIME, PASSWORD, DEFAULT > < PROFILE5, PASSWORD_REUSE_TIME, PASSWORD, DEFAULT > < PROFILE5, PASSWORD_REUSE_MAX, PASSWORD, DEFAULT > < PROFILE5, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, DEFAULT > < PROFILE5, PASSWORD_LOCK_TIME, PASSWORD, DEFAULT > < PROFILE5, PASSWORD_GRACE_TIME, PASSWORD, DEFAULT > 7 rows found.
PASSWORD_REUSE_TIMEに対するUNLIMITEDの指定
この例では、profile6
プロファイルを作成して、UNLIMITED
のPASSWORD_REUSE_TIME
を指定します。パスワードは再利用できません。
Command> CREATE PROFILE profile6 LIMIT PASSWORD_REUSE_MAX 2 PASSWORD_REUSE_TIME UNLIMITED; Profile created.
user6
ユーザーを作成して、user6
にprofile6
プロファイルを割り当てます。user6
のパスワードを2回変更します。user6
のパスワードを再利用してみます。これは、PASSWORD_REUSE_TIME
値がUNLIMITED
のために失敗します。
Command> CREATE USER user6 IDENTIFIED BY user6 PROFILE profile6; User created. Command> ALTER USER user6 IDENTIFIED BY user6_test1; User altered. Command> ALTER USER user6 IDENTIFIED BY user6_test2; User altered. Command> ALTER USER user6 IDENTIFIED BY user6; 15183: Password cannot be reused The command failed.
PASSWORD_REUSE_TIMEに対するDEFAULTの指定
この例では、PASSWORD_REUSE_TIME
パスワード・パラメータにDEFAULT
、PASSWORD_REUSE_MAX
パスワード・パラメータに3
の値を指定して、profile7
プロファイルを作成します。TimesTenにより、PASSWORD_REUSE_TIME
パスワード・パラメータに、DEFAULT
プロファイルの値が使用されます。
Command> CREATE PROFILE profile7 LIMIT PASSWORD_REUSE_TIME DEFAULT PASSWORD_REUSE_MAX 3; Profile created.
dba_profiles
システム・ビューを問い合せて、profile7
プロファイルのパスワード・パラメータの値を確認します。PASSWORD_REUSE_TIME
に対するDEFAULT
の値と、PASSWORD_REUSE_MAX
に対する3
の値に注目してください(太字で表示)。
Command> SELECT * FROM dba_profiles WHERE profile = 'PROFILE7' AND resource_type = 'PASSWORD'; < PROFILE7, FAILED_LOGIN_ATTEMPTS, PASSWORD, DEFAULT > < PROFILE7, PASSWORD_LIFE_TIME, PASSWORD, DEFAULT > < PROFILE7, PASSWORD_REUSE_TIME, PASSWORD, DEFAULT > < PROFILE7, PASSWORD_REUSE_MAX, PASSWORD, 3 > < PROFILE7, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, DEFAULT > < PROFILE7, PASSWORD_LOCK_TIME, PASSWORD, DEFAULT > < PROFILE7, PASSWORD_GRACE_TIME, PASSWORD, DEFAULT > 7 rows found.
dba_profiles
システム・ビューを問い合せて、DEFAULT
プロファイルのパスワード・パラメータの値を確認します。PASSWORD_REUSE_TIME
に対するUNLIMITED
の値に注目してください(太字で表示)。
Command> SELECT * FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_type = 'PASSWORD'; < DEFAULT, FAILED_LOGIN_ATTEMPTS, PASSWORD, 10 > < DEFAULT, PASSWORD_LIFE_TIME, PASSWORD, UNLIMITED > < DEFAULT, PASSWORD_REUSE_TIME, PASSWORD, UNLIMITED > < DEFAULT, PASSWORD_REUSE_MAX, PASSWORD, UNLIMITED > < DEFAULT, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, NULL > < DEFAULT, PASSWORD_LOCK_TIME, PASSWORD, .0034 > < DEFAULT, PASSWORD_GRACE_TIME, PASSWORD, UNLIMITED > 7 rows found.
user7
ユーザーを作成して、user7
にprofile7
プロファイルを割り当てます。user7
のパスワードを3回変更します。PASSWORD_REUSE_TIME
パラメータのUNLIMITED
の値が原因で、user7
のパスワードは再利用できません。
Command> CREATE USER user7 IDENTIFIED BY user7 PROFILE profile7; User created. Command> ALTER USER user7 IDENTIFIED BY user7_test1; User altered. Command> ALTER USER user7 IDENTIFIED BY user7_test2; User altered. Command> ALTER USER user7 IDENTIFIED BY user_test3; User altered. Command> ALTER USER user7 IDENTIFIED BY user7; 15183: Password cannot be reused The command failed.
PASSWORD_REUSE_TIMEとPASSWORD_REUSE_MAXの指定
この例では、PASSWORD_REUSE_TIME
パスワード・パラメータに0.0020833
(約2分)の値を指定し、PASSWORD_REUSE_MAX
パスワード・パラメータに2
の値を指定して、profile8
プロファイルを作成します。その次に、user8
ユーザーを作成して、user8
にprofile8
プロファイルを割り当てます。user8
パスワードを2分以内に2回変更します。その後、2分以内に、user8
の元のパスワード(user8_pwd
)を再利用します。ALTER
USER
操作が失敗します。パスワードを2
回変更しても、元のパスワードは0.00208333
日(約2分)後にのみ再利用できるようになります。2分後に、user8
の元のパスワード(user8_pwd
)を再利用します。ALTER
USER
操作が成功します。ユーザーのパスワードが2回変更されていて、2分以上経過しています。
Command> CREATE PROFILE profile8 LIMIT PASSWORD_REUSE_TIME 0.00208333 PASSWORD_REUSE_MAX 2; Profile created.
user8
ユーザーを作成して、user8
にprofile8
プロファイルを割り当てます。
Command> CREATE USER user8 IDENTIFIED BY user8_pwd PROFILE profile8; User created.
すぐにユーザーを変更して、パスワードを2回変更します。
Command> ALTER USER user8 IDENTIFIED BY user8_test1; User altered. Command> ALTER USER user8 IDENTIFIED BY user8_test2; User altered.
2分以内に、user8_pwd
の元のパスワード(太字で表示)を再利用してみます。元のパスワードは2分後にのみ再利用できるため、ALTER
USER
操作は失敗します。
Command> ALTER USER user8 IDENTIFIED BY user8_pwd;
15183: Password cannot be reused
The command failed.
2分後に、user8_pwd
の元のパスワード(太字で表示)を再利用してみます。ALTER
USER
操作が成功します。パスワードが2回変更されていて、2分経過しているため、元のパスワードが再利用できるようになります。
Command> ALTER USER user8 IDENTIFIED BY user8_pwd;
User altered.
CREATE REPLICATION
この文は、TimesTen Scaleoutではサポートされていません。
TimesTen Classicの場合:
CREATE REPLICATION
文は、次の処理を実行します。
-
関連するデータベースにクラシック・レプリケーション・スキームを定義します。
-
実行するデータベースのレプリケーション・システム表に、指定した構成を組み込みます。
-
通常は、1つ以上のレプリケーション要素の指定、および0(ゼロ)以上の
STORE
の指定が含まれています。
TimesTen SQLによるレプリケーションの構成では、クラシック・レプリケーションをプログラム的な方法で構成できます。この構成は、C、C++またはJavaコードに埋め込むことができます。レプリケーションをローカルで構成したり、クライアント/サーバーを使用してリモート・システムから構成できます。
また、サポートされているSQL文ではカバーされていない処理に対応する場合は、ttRepAdmin
ユーティリティを使用する必要があります。ttRepAdmin
を使用すると、レプリケーションの状態の変更、データベースの複製、レプリケーション構成の一覧表示およびレプリケーション状態の表示を実行できます。
必要な権限
ADMIN
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutではサポートされていません。
定義
レプリケーション要素は、TimesTenがデータベース間で同期を取るエンティティです。レプリケーション要素は、表全体またはデータベースです。データベースには、ほとんどのタイプの表および順序を含めることができます。指定した表および順序のみを含めるか、または指定した表および順序を除くすべての表を含めることができます。一時表またはビュー(マテリアライズドか非マテリアライズドかは関係ありません)を含めることはできません。
レプリケーション・スキームは、レプリケーション要素および要素のコピーを管理するデータベースのセットです。
クラシック・レプリケーションのSQL構成の詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のクラシック・レプリケーション・スキームの定義に関する項を参照してください。
SQL構文
CREATE REPLICATION [Owner.]ReplicationSchemeName { ELEMENT ElementName { DATASTORE | { TABLE [Owner.]TableName [CheckConflicts]} | SEQUENCE [Owner.]SequenceName} { MASTER | PROPAGATOR } FullStoreName [TRANSMIT { NONDURABLE | DURABLE }] { SUBSCRIBER FullStoreName [,...] [ReturnServiceAttribute] } [,...] } [...] [{INCLUDE | EXCLUDE} {TABLE [[Owner.]TableName[,...]] | SEQUENCE [[Owner.]SequenceName[,...]} [,...]] [ STORE FullStoreName [StoreAttribute [... ]]] [...] [ NetworkOperation[...]]
CheckConflicts
構文の詳細は、「CHECK CONFLICTS」を参照してください。
ReturnServiceAttribute
の構文を次に示します。
{ RETURN RECEIPT [BY REQUEST] | RETURN TWOSAFE [BY REQUEST] | NO RETURN }
StoreAttribute
の構文を次に示します。
DISABLE RETURN {SUBSCRIBER | ALL} NumFailures RETURN SERVICES {ON | OFF} WHEN [REPLICATION] STOPPED DURABLE COMMIT {ON | OFF} RESUME RETURN Milliseconds LOCAL COMMIT ACTION {NO ACTION | COMMIT} RETURN WAIT TIME Seconds COMPRESS TRAFFIC {ON | OFF} PORT PortNumber TIMEOUT Seconds FAILTHRESHOLD Value CONFLICT REPORTING SUSPEND AT Value CONFLICT REPORTING RESUME AT Value TABLE DEFINITION CHECKING {RELAXED|EXACT}
NetworkOperation
の構文は、次のとおりです。
ROUTE MASTER FullStoreName SUBSCRIBER FullStoreName { { MASTERIP MasterHost | SUBSCRIBERIP SubscriberHost } PRIORITY Priority } [...]
パラメータ
パラメータ | 説明 |
---|---|
|
新しいクラシック・レプリケーション・スキームに割り当てる名前です。クラシック・レプリケーション・スキームは、他のすべてのデータベース・オブジェクトとは別の一意の名前である必要があります。 |
|
双方向にレプリケートされたデータベースへの同時書込みで、レプリケーションの競合をチェックします。 |
|
レプリケートされた通信量を圧縮して、ネットワークの帯域幅の量を削減します。 |
|
競合解消のレポートを一時停止します。
この句は、表レベルのレプリケーションで有効です。 |
|
競合解消のレポートを再開します。
この句は、表レベルのレプリケーションで有効です。 |
|
データベース全体を要素として定義します。この種類の要素は、同一または異なるレプリケーション・スキームで |
|
|
|
|
|
|
|
TimesTenがデータベース間で同期を取るエンティティです。レプリケーション要素として、TimesTenでは、データベース全体(
詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のレプリケーション要素の定義に関する項を参照してください。 |
|
サブスクライバ・データベースのために累積できるログ・ファイルの数。この値を超えると、サブスクライバは 『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のトランザクション・ログ障害のしきい値の設定に関する項を参照してください。 |
|
次のいずれかとして指定されたデータベースです。
たとえば、データベースのパスが この名前は、DSNの記述の
|
|
タイムアウト・イベントのRETURN TWOSAFEトランザクションで実行されるデフォルトのアクションを指定します。 ノート: この属性は、
この設定は、 |
|
アプリケーションで特定の要素が更新されるデータベース。更新は |
|
RETURNサービスを使用しないように指定します。これがデフォルトです。 RETURNサービスの使用の詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のRETURNサービスの使用に関する項を参照してください。 |
|
データベースのレプリケーション・エージェントが接続をリスニングするTCP/IPポート番号です。指定しない場合は、レプリケーション・エージェントによってポート番号が自動的に割り当てられます。 |
|
レプリケートされた更新を受け取って他のデータベースに渡すデータベース。 |
|
|
|
RETURN RECEIPTサービスを有効にし、これによって、マスター・データベースに対してトランザクションをコミットするアプリケーションは、すべてのサブスクライバがトランザクションを受信するまでブロックされます。
|
|
レプリケーションが無効になっている場合のRETURNサービスのオンまたはオフを設定します。
|
|
RETURN TWOSAFEサービスを有効にし、これによって、マスター・データベースに対してトランザクションをコミットするアプリケーションは、すべてのサブスクライバがトランザクションをコミットするまでブロックされます。 ノート: このサービスは、要素が
|
|
RETURNサービスの応答を待機する秒数を指定します。デフォルト値は10秒です。値が0(ゼロ)の場合は、タイムアウトがないことを意味します。 |
|
|
|
指定されたデータベースの属性を定義します。属性には、 |
|
|
|
|
|
レプリケーション・エージェントがリモート・レプリケーション・エージェントからの応答を待機する最大時間(秒)。デフォルトは120秒です。 ノート: リモート・レプリケーション・エージェントからの応答の遅延の原因となる大規模なトランザクションの場合、エージェントは、トランザクションのサイズに基づいて、タイムアウトをスケーリングします。 |
|
コミットされたトランザクション群をサブスクライバに転送する前に、マスターのログをファイル・システムにフラッシュするかどうかを指定します。
ノート: ノート: アクティブ・スタンバイ・ペアに対して 詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のDATASTORE要素に対する送信永続性の設定に関する項を参照してください。 |
|
サブスクライバで実行される表定義チェックの種類を指定します。
デフォルトは ノート: |
|
複数回指定できます。
|
|
句は複数回指定できます。 |
|
1から99の整数で表される変数。IPアドレスの優先順位を示します。整数値が小さいほど、優先度は高くなります。同じ優先度を持つアドレスが複数指定されている場合は、エラーが返されます。ピア接続の確立に使用する複数のIPアドレスの順序を制御します。
|
CHECK CONFLICTS
構文
CHECK CONFLICTS
の構文は、次のとおりです。
{NO CHECK | CHECK CONFLICTS BY ROW TIMESTAMP COLUMN ColumnName [ UPDATE BY { SYSTEM | USER } ] [ ON EXCEPTION { ROLLBACK [ WORK ] | NO ACTION } ] [ {REPORT TO 'FileName' [ FORMAT { XML | STANDARD } ] | NO REPORT } ] }
ノート:
CHECK CONFLICT
句は、TABLE
型の要素に対してのみ使用できます。
パラメータ
CREATE REPLICATION
または
ALTER REPLICATION文のCHECK CONFLICTS
句には、次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
すべての更新競合と一意性競合の検出を指定します。競合は DELETE処理と |
|
レプリケートされた表の列を使用してタイムスタンプを比較します。表は
|
|
指定された要素に対する競合解消を行わないように指定します。 |
|
タイムスタンプ値をTimesTen( |
|
検出された競合の解消方法を指定します。
デフォルトは |
|
タイムスタンプ比較に失敗した更新を記録するファイルを指定します。 |
|
オプションで、要素の競合レポートの形式を指定します。デフォルトの形式は |
|
失敗したタイムスタンプの比較を記録しないように指定します。 |
説明
-
同じホスト上のすべてのデータベース名は、各TimesTenインスタンスの各クラシック・レプリケーション・スキームについて一意である必要があります。
-
レプリケーション要素の更新(通常のアプリケーション・トランザクションによる)は、
MASTER
データベースを使用してのみ可能です。PROPAGATOR
およびSUBSCRIBER
データベースは読取り専用です。 -
複数のデータベースで同じ表を更新できるクラシック・レプリケーション・スキームを定義する場合は、行を更新する際に競合を回避する方法の推奨事項について、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のレプリケーションの競合解消に関する項を参照してください。
-
SELF
は、関連するデータベースがすべてローカルであるクラシック・レプリケーション・スキーム用です。本番環境(スクリプトで各データベースのホスト名を省略しないで記述すると、関連する各データベースで使用できる)では、分散クラシック・レプリケーション・スキームに対してSELF
を使用しないでください。 -
指定した
STORE
の各属性は一度だけ指定するか、または何も指定しません。 -
単一のクラシック・レプリケーション・スキームのデータベースの
PORT
を指定すると、すべてのクラシック・レプリケーション・スキームに対して指定されます。その他すべての接続属性は、コマンドで指定したクラシック・レプリケーション・スキームによって異なります。 -
レプリケーション・スキームでは、
DataStoreName
は、常にTimesTenデータベースのチェックポイント・ファイル名の接頭辞になります。チェックポイント処理によってファイル・システムに保存される、接尾辞.ds0
と.ds1
のファイルがチェックポイント・ファイルです。 -
デフォルト値
NOT INLINE VARCHAR
が指定されている行がレプリケートされる場合、受信者側のノードのデフォルト値が送信者側のノードのデフォルト値と異なる場合にのみ、受信者はデフォルト値を指すかわりに、各行に対してこの値のコピーを作成します。 -
レプリケートされた表でタイムスタンプ比較を使用するには、NULL値可能な
BINARY(8)
型の列を指定して、タイムスタンプ値を保持する必要があります。タイムスタンプ列は、表の作成時に定義します。ALTER TABLE
文でタイムスタンプ列を追加することはできません。また、タイムスタンプ列を主キーまたは索引に含めることはできません。 -
XMLのレポート形式を指定した場合、2つのXMLドキュメントが生成されます。
-
FileName
.xml
: このファイルには、レポート用のDTDおよびレポートのルート・ノードが含まれます。このファイルには、ドキュメント定義とINCLUDEディレクティブが含まれます。 -
FileName
.include
: このファイルはFileName
.xml
に含まれており、実際の競合がすべて含まれます。 -
FileName
.include
ファイルは切捨て可能です。FileName
.xml
ファイルは切り捨てないでください。 -
各競合の例を含むXML書式の詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のXMLファイルへの競合のレポートに関する項を参照してください。
-
-
要素のレポート形式を指定した後でその要素を削除しても、対応するレポート・ファイルは削除されません。
-
競合解消のレポートを一時停止する最高水位標のしきい値を指定するには、
CONFLICT REPORTING SUSPEND AT
句を使用します。 -
競合解消のレポートを再開する最低水位標のしきい値を指定するには、
CONFLICT REPORTING RESUME AT
句を使用します。競合の割合が最低水位標のしきい値を下回ると、競合解消のレポートが再開されます。 -
レプリケーション・エージェントによって競合のレポートが一時停止されている状態または一時停止されていない状態は、ローカル・レプリケーション・エージェントとピア・エージェントが停止および再起動された後は維持されません。
-
キャッシュ・グループをレプリケートする場合に
CREATE REPLICATION
文を使用しないでください。アクティブ・スタンバイ・ペアのみがキャッシュ・グループをレプリケートできます。CREATE ACTIVE STANDBY PAIR
文を参照してください。
例
repl.tab
の内容をmasterds
から2つのサブスクライバsubscriber1ds
およびsubscriber2ds
にレプリケートします。
CREATE REPLICATION repl.twosubscribers ELEMENT e TABLE repl.tab MASTER masterds ON "server1" SUBSCRIBER subscriber1ds ON "server2", subscriber2ds ON "server3";
masterds
データベース全体をサブスクライバsubscriber1ds
にレプリケートします。FAILTHRESHOLD
を指定すると、subscriber1ds
が失敗したとみなされる前に、最大10のログ・ファイルをmasterds
に蓄積します。
CREATE REPLICATION repl.wholestore ELEMENT e DATASTORE MASTER masterds ON "server1" SUBSCRIBER subscriber1ds ON "server2" STORE masterds FAILTHRESHOLD 10;
westds
およびeastds
データベース全体を双方向にレプリケートして、RETURN TWOSAFE
サービスを有効にします。
CREATE REPLICATION repl.biwholestore ELEMENT e1 DATASTORE MASTER westds ON "westcoast" SUBSCRIBER eastds ON "eastcoast" RETURN TWOSAFE ELEMENT e2 DATASTORE MASTER eastds ON "eastcoast" SUBSCRIBER westds ON "westcoast" RETURN TWOSAFE;
subscriber1ds
サブスクライバへの選択トランザクション更新に対して、RETURN RECEIPTサービスを有効にします。
CREATE REPLICATION repl.twosubscribers ELEMENT e TABLE repl.tab MASTER masterds ON "server1" SUBSCRIBER subscriber1ds ON "server2" RETURN RECEIPT BY REQUEST SUBSCRIBER subscriber2ds ON "server3";
customerswest
表の内容をwest
データベースから、customerseast
表の内容をeast
データベースから、ROUNDUP
データベースにレプリケートします。すべてのトランザクションに対してRETURN RECEIPTサービスを有効にします。
CREATE REPLICATION r ELEMENT west TABLE customerswest MASTER west ON "serverwest" SUBSCRIBER roundup ON "serverroundup" RETURN RECEIPT ELEMENT east TABLE customerseast MASTER east ON "servereast" SUBSCRIBER roundup ON "serverroundup" RETURN RECEIPT;
repl.tab
表の内容をcentralds
データベースからpropds
データベースにレプリケートし、これにより、backup1ds
およびbackup2ds
データベースに変更が伝播されます。
CREATE REPLICATION repl.propagator ELEMENT a TABLE repl.tab MASTER centralds ON "finance" SUBSCRIBER proprds ON "nethandler" ELEMENT b TABLE repl.tab PROPAGATOR proprds ON "nethandler" SUBSCRIBER backup1ds ON "backupsystem1" bakcup2ds ON "backupsystem2";
eastds
とwestds
データベースの間で、repl.accounts
表の内容を双方向でレプリケートします。各データベースは、repl.accounts
表に対してマスターおよびサブスクライバの両方になります。
repl.accounts
表がeastds
とwestds
データベースのいずれかで更新されるため、ここにはタイムスタンプ列(tstamp
)が含まれます。CHECK CONFLICTS
句により、2つのデータベース間で発生した更新競合を検出するための自動タイムスタンプ比較が開始されます。比較が失敗すると、古いタイムスタンプを持つ更新が含まれるトランザクションの全体がロールバック(破棄)されます。
CREATE REPLICATION repl.r1 ELEMENT elem_accounts_1 TABLE repl.accounts CHECK CONFLICTS BY ROW TIMESTAMP COLUMN tstamp UPDATE BY SYSTEM ON EXCEPTION ROLLBACK MASTER westds ON "westcoast" SUBSCRIBER eastds ON "eastcoast" ELEMENT elem_accounts_2 TABLE repl.accounts CHECK CONFLICTS BY ROW TIMESTAMP COLUMN tstamp UPDATE BY SYSTEM ON EXCEPTION ROLLBACK MASTER eastds ON "eastcoast" SUBSCRIBER westds ON "westcoast";
RETURN TWOSAFEサービスを使用し、activeds
でTCP/IPポート40000、backupds
でTCP/IPポート40001を使用して、repl.accounts
表の内容をactiveds
データベースからbackupds
データベースにレプリケートします。activeds
でのトランザクションはできるかぎりコミットする必要があるため、レプリケーションを構成し、LOCAL COMMIT
ACTION
を使用してレプリケーション・タイムアウトの後でもトランザクションがコミットされるようにし、レプリケーションの停止時はRETURN TWOSAFEサービスが無効になるようにします。backupds
データベースへの接続が割り込まれた場合にアプリケーションでの大幅な遅延を回避するために、5個のトランザクションがタイムアウトした後にRETURNサービスが無効になるように構成しますが、さらにbackupds
データベースのレプリケーション・エージェントが100ミリ秒未満で応答したときはRETURNサービスを再度有効にするように構成します。最後に、データベース間の帯域幅は制限されるため、activeds
データベースからレプリケートされるときにデータが圧縮されるようにレプリケーションを構成します。
CREATE REPLICATION repl.r ELEMENT elem_accounts_1 TABLE repl.accounts MASTER activeds ON "active" SUBSCRIBER backupds ON "backup" RETURN TWOSAFE ELEMENT elem_accounts_2 TABLE repl.accounts MASTER activeds ON "active" SUBSCRIBER backupds ON "backup" RETURN TWOSAFE STORE activeds ON "active" PORT 40000 LOCAL COMMIT ACTION COMMIT RETURN SERVICES OFF WHEN REPLICATION STOPPED DISABLE RETURN SUBSCRIBER 5 RESUME RETURN 100 COMPRESS TRAFFIC ON STORE backupds ON "backup" PORT 40001;
表レベルのレプリケーションで競合のレポートを一時停止する句と競合のレポートを再開する句の例を示します。これらの句は、データベース・レプリケーションではなく、表レベルのレプリケーションに対して使用します。repschemes
コマンドを発行して、レプリケーション・スキームが作成されていることを表示します。
Command> CREATE TABLE repl.accounts (tstamp BINARY (8) NOT NULL PRIMARY KEY, tstamp1 BINARY (8)); Command> CREATE REPLICATION repl.r2 ELEMENT elem_accounts_1 TABLE repl.accounts CHECK CONFLICTS BY ROW TIMESTAMP COLUMN tstamp1 UPDATE BY SYSTEM ON EXCEPTION ROLLBACK WORK MASTER westds ON "west1" SUBSCRIBER eastds ON "east1" ELEMENT elem_accounts_2 TABLE repl.accounts CHECK CONFLICTS BY ROW TIMESTAMP COLUMN tstamp1 UPDATE BY SYSTEM ON EXCEPTION ROLLBACK WORK MASTER eastds ON "east1" SUBSCRIBER westds ON "west1" STORE westds CONFLICT REPORTING SUSPEND AT 20 CONFLICT REPORTING RESUME AT 10; Command> REPSCHEMES; Replication Scheme REPL.R2: Element: ELEM_ACCOUNTS_1 Type: Table REPL.ACCOUNTS Conflict Check Column: TSTAMP1 Conflict Exception Action: Rollback Work Conflict Timestamp Update: System Conflict Report File: (none) Master Store: WESTDS on WEST1 Transmit Durable Subscriber Store: EASTDS on EAST1 Element: ELEM_ACCOUNTS_2 Type: Table REPL.ACCOUNTS Conflict Check Column: TSTAMP1 Conflict Exception Action: Rollback Work Conflict Timestamp Update: System Conflict Report File: (none) Master Store: EASTDS on EAST1 Transmit Durable Subscriber Store: WESTDS on WEST1 Store: EASTDS on EAST1 Port: (auto) Log Fail Threshold: (none) Retry Timeout: 120 seconds Compress Traffic: Disabled Store: WESTDS on WEST1 Port: (auto) Log Fail Threshold: (none) Retry Timeout: 120 seconds Compress Traffic: Disabled Conflict Reporting Suspend: 20 Conflict Reporting Resume: 10 1 replication scheme found.
2つのMASTERIP
句とSUBSCRIBERIP
句を使用したNetworkOperation
句の例を示します。
CREATE REPLICATION r ELEMENT e DATASTORE MASTER rep1 SUBSCRIBER rep2 RETURN RECEIPT MASTERIP "1.1.1.1" PRIORITY 1 SUBSCRIBERIP "2.2.2.2" PRIORITY 1 MASTERIP "3.3.3.3" PRIORITY 2 SUBSCRIBERIP "4.4.4.4" PRIORITY 2;
NetworkOperation
句の例。送信側にはデフォルトのインタフェースを使用しますが、受信側には特定のネットワークを使用します。
CREATE REPLICATION r ELEMENT e DATASTORE MASTER rep1 SUBSCRIBER rep2 ROUTE MASTER rep1 ON "machine1" SUBSCRIBER rep2 ON "machine2" SUBSCRIBERIP "rep2nic2" PRIORITY 1;
複数のサブスクライバを使用するNetworkOperation
句の使用例を示します。
CREATE REPLICATION r ELEMENT e DATASTORE MASTER rep1 SUBSCRIBER rep2,rep3 ROUTE MASTER rep1 ON "machine1" SUBSCRIBER rep2 ON "machine2" MASTERIP "1.1.1.1" PRIORITY 1 SUBSCRIBERIP "2.2.2.2" PRIORITY 1 ROUTE MASTER Rep1 ON "machine1" SUBSCRIBER Rep3 ON "machine2" MASTERIP "3.3.3.3" PRIORITY 2 SUBSCRIBERIP "4.4.4.4";
CREATE SEQUENCE
CREATE SEQUENCE
文は、この後、複数のユーザーが一意の整数を生成するために使用できる新しい順序番号ジェネレータを作成します。CREATE SEQUENCE
文を使用して、順序の初期値を定義し、増分値、最大値または最小値を定義し、最小または最大に達した後も順序番号を生成し続けるかどうかを決定します。
必要な権限
CREATE SEQUENCE
(所有者の場合)またはCREATE ANY SEQUENCE
(非所有者の場合)。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。BATCH
句は、TimesTen Scaleoutのみでサポートされています。
SQL構文
CREATE SEQUENCE [Owner.]SequenceName [INCREMENT BY IncrementValue] [MINVALUE MinimumValue] [MAXVALUE MaximumValue] [CYCLE] [CACHE CacheValue] [START WITH StartValue] [BATCH BatchValue]
パラメータ
パラメータ | 説明 |
---|---|
|
順序番号ジェネレータの名前です。 |
|
連続する数値の増分値です。この値は正または負の整数値です。0は指定できません。値が正の場合は昇順になります。負の場合は降順になります。デフォルト値は1です。降順では、範囲は |
|
順序の最小値を指定します。デフォルトの最小値は1です。 |
|
昇順の場合は最大値、降順の場合は開始値です。デフォルトの最大値は(263) -1であり、これは |
|
順序番号ジェネレータが最大値または最小値に達した後、数値の生成を続行するかどうかを指定します。デフォルトでは、順序はサイクルしません。昇順で数値が最大値に達すると、順序は始めに戻り、最小値から値を生成し続けます。降順で最小値に達すると、順序値は最大値に戻ります。 |
|
|
|
生成する最初の順序番号を指定します。この句を使用して、その最小値よりも大きい値から昇順順序を開始、あるいはその最大値よりも小さい値から降順順序を開始します。 |
|
TimesTen Scaleoutのみで有効です。グリッドの各要素に格納される一意の順序値の範囲を構成します。デフォルト値は1000万です。 |
説明
-
CREATE SEQUENCE
文のすべてのパラメータは整数値である必要があります。 -
パラメータに値を指定しない場合、TimesTenでは、1から開始し、1ずつ増加し、デフォルトの最大値を持ちサイクルしない昇順がデフォルトで作成されます。
-
ビューまたはマテリアライズド・ビューと同じ名前の順序は作成しないでください。
-
CYCLE
属性による順序はレプリケートできません(TimesTen Classic)。 -
アクティブ・スタンバイ・ペアのレプリケートされた環境があるTimesTen Classicで、
DDL_REPLICATION_LEVEL
が3以上の場合にアクティブ・データベースでCREATE SEQUENCE
を実行すると、順序はレプリケーション・スキームのすべてのデータベースにレプリケートされます。順序をレプリケーション・スキームに含めるには、DDL_REPLICATION_ACTION
をINCLUDE
に設定します。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のアクティブ・スタンバイ・ペアでのDDL変更に関する項を参照してください。
TimesTen Scaleoutでの使用
-
CREATE
SEQUENCE
文では、グローバル・オブジェクトが作成されます。順序を作成した後、順序値がデータベースのいずれかの要素から取得されます。 -
順序値は一意ですが、この値は要素をまたいで単調な順番では返されない可能性があります。1つの要素内では、順序値の順番は単調です。ただし、時間の経過に伴い、要素をまたいでは順序値は単調に返されません。ただし、1つの要素内ではプロパティが単調になることが保証されます。
-
バッチ値は、要素に格納された一意の順序値の範囲です。各要素に独自のバッチがあります。ローカル・バッチが消費されると、要素は新しいバッチを取得します。順序を所有し、バッチ順序ブロックを他の要素に割り当てる1つの要素があります。
-
BATCH
句の場合:-
この句を使用して、グリッドの各要素に格納される順序値の範囲を指定します。
-
デフォルトは1000万です。
-
BatchValue
はCacheValue
以上になる必要があります。 -
BatchValue
の最大値は、プラットフォームの符号付き整数の最大値に依存します。
-
-
レプリカ・セット内の各要素には独自のバッチがあります。
-
要素のバッチ順序値はリカバリ可能です。キャッシュ値はリカバリできません。
詳細と例は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』の順序の使用方法に関する項を参照してください。
TimesTen ScaleoutでのCURRVALおよびNEXTVALの使用方法
SQL文でSEQUENCE
値を参照するには、CURRVAL
とNEXTVAL
を使用します。
-
CURRVAL
は、現在のセッションでNEXTVAL
がコールされていればその最新の値を返し、コールされていなければエラーを返します。 -
NEXTVAL
は、指定された増分で順序の現在値を増加させ、アクセスされた行ごとに値を返します。
複数のNEXTVAL
参照を持つ1つのSQL文を実行する場合、TimesTenでは順序を一度だけ増加させ、すべてのNEXTVAL
に対して同じ値が返されます。SQL文にNEXTVAL
とCURRVAL
の両方が含まれている場合は、NEXTVAL
が最初に実行されます。CURRVAL
とNEXTVAL
は、そのSQL文では同じ値を持ちます。
NEXTVAL
およびCURRVAL
は、次の場合に使用できます。
-
SELECT
文のSelectList
(ただし、副問合せのSelectList
は除く) -
INSERT...SELECT
文のSelectList
-
UPDATE
文のSET
句
グリッドでのCURRVAL
およびNEXTVAL
の使用方法の詳細および例は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』の順序の使用方法に関する項を参照してください。
TimesTen ClassicでのCURRVALおよびNEXTVALの使用方法
SQL文でSEQUENCE
値を参照するには、CURRVAL
とNEXTVAL
を使用します。
-
CURRVAL
は、現在のセッションでNEXTVAL
がコールされていればその最新の値を返し、コールされていなければエラーを返します。 -
NEXTVAL
は、指定された増分で順序の現在値を増加させ、アクセスされた行ごとに値を返します。
順序の現在値は、接続ごとに異なります。同じデータベースに2つの同時接続がある場合、各接続は同じ順序について、最後のNEXTVAL
参照により設定された独自のCURRVAL
を取得します。最大値に達した場合、CREATE SEQUENCE
のCYCLE
オプションの値によって、SEQUENCE
はサイクルする(開始値に戻る)か、エラー文を生成します。リカバリでは、順序はロールバックされません。順序の値の範囲に幅を持たせることができますが、その場合でも各順序値は一意です。
複数のNEXTVAL
参照を持つ1つのSQL文を実行する場合、TimesTenでは順序を一度だけ増加させ、すべてのNEXTVAL
に対して同じ値が返されます。SQL文にNEXTVAL
とCURRVAL
の両方が含まれている場合は、NEXTVAL
が最初に実行されます。CURRVAL
とNEXTVAL
は、そのSQL文では同じ値を持ちます。
ノート:
NEXTVAL
は、アクティブ・スタンバイ・ペアのスタンバイ・ノードへの問合せでは使用できません。
NEXTVAL
およびCURRVAL
は、次の場合に使用できます。
-
SELECT
文のSelectList
(ただし、副問合せのSelectList
は除く) -
INSERT...SELECT
文のSelectList
-
UPDATE
文のSET
句
例: TimesTen Scaleout
詳細な例は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』の順序の使用方法に関する項を参照してください。
構文の例:
Command> CREATE SEQUENCE mysequence BATCH 100; Command> describe mysequence; Sequence SAMPLEUSER.MYSEQUENCE: Minimum Value: 1 Maximum Value: 9223372036854775807 Current Value: 1 Increment: 1 Cache: 20 Cycle: Off Batch: 100 1 sequence found.
例: TimesTen Classic
順序を作成します。
CREATE SEQUENCE mysequence INCREMENT BY 1 MINVALUE 2 MAXVALUE 1000;
この例では、tab1
は表内に1行のデータを持ち、CYCLE
が使用されているとします。
CREATE SEQUENCE s1 MINVALUE 2 MAXVALUE 4 CYCLE; SELECT s1.NEXTVAL FROM tab1; /* Returns the value of 2; */ SELECT s1.NEXTVAL FROM tab1; /* Returns the value of 3; */ SELECT s1.NEXTVAL FROM tab1; /* Returns the value of 4; */
最大値に達した後、最小値から昇順でサイクルを開始します。
SELECT s1.NEXTVAL FROM tab1; /* Returns the value of 2; */
順序を作成して順序番号を生成するには、次の文を使用します。
CREATE SEQUENCE seq INCREMENT BY 1; INSERT INTO student VALUES (seq.NEXTVAL, 'Sally');
UPDATE SET
句で順序を使用するには、次の文を使用します。
UPDATE student SET studentno = seq.NEXTVAL WHERE name = 'Sally';
問合せで順序を使用するには、次の文を使用します。
SELECT seq.CURRVAL FROM student;
CREATE SYNONYM
CREATE SYNONYM
文は、データベース・オブジェクトのパブリック・シノニムまたはプライベート・シノニムを作成します。シノニムは、データベース・オブジェクトの別名です。オブジェクトは、表、ビュー、シノニム、順序、PL/SQLストアド・プロシージャ、PL/SQLファンクション、PL/SQLパッケージ、マテリアライズド・ビューまたはキャッシュ・グループです。
プライベート・シノニムは、特定のユーザーが所有し、そのユーザーのスキーマ内に存在します。プライベート・シノニムに所有者以外のユーザーがアクセスできるのは、基礎となるオブジェクトに対する適切な権限がユーザーにあり、シノニム名とともにスキーマを指定する場合のみです。
パブリック・シノニムは、基礎となるオブジェクトに対する適切な権限がユーザーにあるかぎり、すべてのユーザーがアクセスできます。
CREATE SYNONYM
はDDL文です。
シノニムは、次のSQL文で使用できます。
-
DML文:
SELECT
、DELETE
、INSERT
、UPDATE
、MERGE
-
一部のDDL文:
GRANT
、REVOKE
、CREATE TABLE ... AS SELECT
、CREATE VIEW ... AS SELECT
、CREATE INDEX
、DROP INDEX
-
一部のキャッシュ・グループ文:
LOAD CACHE GROUP
、UNLOAD CACHE GROUP
、REFRESH CACHE GROUP
、FLUSH CACHE GROUP
必要な権限
プライベート・シノニムを作成するには、CREATE SYNONYM
(所有者の場合)またはCREATE ANY SYNONYM
(非所有者の場合)。
パブリック・シノニムを作成するには、CREATE PUBLIC SYNONYM
。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
CREATE [OR REPLACE] [PUBLIC] SYNONYM [Owner1.]synonym FOR [Owner2.]object
パラメータ
パラメータ | 説明 |
---|---|
|
シノニムがすでに存在する場合に再作成するには、 |
|
オブジェクトの先頭にスキーマ名が指定されていない場合のみ、オブジェクトへの参照を変換するときに、TimesTenでパブリック・シノニムが使用されます。 |
|
シノニムの所有者を指定します。 シノニムの名前を30バイト以内で指定します。 |
|
オブジェクトが配置される所有者を指定します。シノニムを作成する対象のオブジェクト名を指定します。 |
説明
-
スキーマ・オブジェクトは、そのシノニムの作成時に存在している必要はありません。
-
TimesTen組込みプロシージャと同じ名前のパブリック・シノニムは作成しないでください。
-
シノニムを使用するには、シノニムを使用する前に、シノニムによって別名が付けられるオブジェクトのユーザーに適切な権限が付与されている必要があります。
-
プライベート・シノニムの名前は、プライベート・シノニムと同じスキーマにある表、ビュー、順序、PL/SQLパッケージ、ファンクション、プロシージャおよびキャッシュ・グループと同じにすることはできません。
-
パブリック・シノニムの名前は、プライベート・シノニムやオブジェクト名と同じにすることができます。
-
問合せがOracle Databaseで実行される必要があるように
PassThrough
属性が設定されている場合は、その問合せは変更されずにOracle Databaseに送信されます。問合せがキャッシュ・グループの表に対してシノニムを使用する場合、問合せが成功するためには、同じ名前のシノニムが対応するOracle Database表に定義されている必要があります。 -
オブジェクト名が、シノニムを使用できるDML文およびDDL文で使用される場合、オブジェクト名は次のように解決されます。
-
現在のスキーマ内で一致を検索します。一致が見つからない場合は、次に進みます。
-
パブリック・シノニム名との一致を検索します。一致が見つからない場合は、次に進みます。
-
SYSスキーマ内で一致を検索します。一致が見つからない場合は、次に進みます。
-
オブジェクトは存在しません。
TimesTenでは、一部のオブジェクトのパブリック・シノニムが
SYS
スキーマ内に作成されます。パブリック・シノニムの名前はオブジェクト名と同じです。そのため、オブジェクト名解決のステップ2と3を入れ替えても、検索結果は変わりません。 -
-
アクティブ・スタンバイ・ペアのレプリケートされた環境で、
DDL_REPLICATION_LEVEL
が2以上の場合にアクティブ・データベースでCREATE SYNONYM
を実行すると、シノニムはレプリケーション・スキームのすべてのデータベースにレプリケートされます。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のアクティブ・スタンバイ・ペアでのDDL変更に関する項を参照してください。
例
ユーザーttuser
として、jobs
表のシノニムを作成します。シノニムを使用して情報を取得できることを確認します。SYS.USER_SYNONYMS
システム・ビューの内容を表示します。
Command> CREATE SYNONYM synjobs FOR jobs; Synonym created. Command> SELECT FIRST 2 * FROM jobs; < AC_ACCOUNT, Public Accountant, 4200, 9000 > < AC_MGR, Accounting Manager, 8200, 16000 > 2 rows found. Command> SELECT FIRST 2 * FROM synjobs; < AC_ACCOUNT, Public Accountant, 4200, 9000 > < AC_MGR, Accounting Manager, 8200, 16000 > 2 rows found. Command> SELECT * FROM sys.user_synonyms; < SYNJOBS, TTUSER, JOBS, <NULL> > 1 row found.
employees
表のパブリック・シノニムを作成します。
Command> CREATE PUBLIC SYNONYM pubemp FOR employees; Synonym created.
pubemp
がパブリック・シノニムとしてSYS.ALL_SYNONYMS
システム・ビューに表示されることを確認します。
Command> SELECT * FROM sys.all_synonyms; < PUBLIC, TABLES, SYS, TABLES, <NULL> > ... < TTUSER, SYNJOBS, TTUSER, JOBS, <NULL> > < PUBLIC, PUBEMP, TTUSER, EMPLOYEES, <NULL> > 57 rows found.
terry
スキーマのtab
表のシノニムを作成します。シノニムを記述します。
Command> CREATE SYNONYM syntab FOR terry.tab; Synonym created. Command> DESCRIBE syntab; Synonym TTUSER.SYNTAB: For Table TERRY.TAB Columns: COL1 VARCHAR2 (10) INLINE COL2 VARCHAR2 (10) INLINE 1 Synonyms found.
OR REPLACE
句を使用して、employees
表の別名となるように、synjobs
シノニムを再定義します。synjobs
と記述します。
Command> CREATE OR REPLACE synjobs FOR employees; Synonym created. Command> DESCRIBE synjobs; Synonym TTUSER.SYNJOBS: For Table TTUSER.EMPLOYEES Columns: *EMPLOYEE_ID NUMBER (6) NOT NULL FIRST_NAME VARCHAR2 (20) INLINE LAST_NAME VARCHAR2 (25) INLINE NOT NULL EMAIL VARCHAR2 (25) INLINE UNIQUE NOT NULL PHONE_NUMBER VARCHAR2 (20) INLINE HIRE_DATE DATE NOT NULL JOB_ID VARCHAR2 (10) INLINE NOT NULL SALARY NUMBER (8,2) COMMISSION_PCT NUMBER (2,2) MANAGER_ID NUMBER (6) DEPARTMENT_ID NUMBER (4) 1 Synonyms found.
関連項目
CREATE TABLE
CREATE TABLE
文は、表を定義します。
CREATE
TABLE
文は、TimesTen ScaleoutおよびTimesTen Classicでサポートされています。ただし、構文とセマンティクスでは違いがあります。わかりやすくするために、サポートされている構文、パラメータ、説明(セマンティクス)およびTimesTen ScaleoutとTimesTen Classicの例は、TimesTen Scaleoutでの使用方法とTimesTen Classicでの使用方法に分けられています。使用方法に繰返しがありますが、構文からパラメータへ進み、セマンティクスから各使用方法の例に進むことができるように、このような方法で示されています。
必要な権限セクションを確認してから、次を確認してください。
必要な権限
CREATE TABLE
(所有者の場合)またはCREATE ANY TABLE
(非所有者の場合)。
作成された表の所有者には、REFERENCE
句によって参照される表に対するREFERENCES
権限が必要です。
TimesTen Classicの場合:
-
DDL_REPLICATION_LEVEL=2
以上およびDDL_REPLICATION_ACTION
=INCLUDE
のときに、アクティブ・スタンバイ・ペア間で新しい表をレプリケートする場合は、ADMIN
権限が必要です。 -
これらの属性によって、
CREATE TABLE
では暗黙的にALTER ACTIVE STANDBY PAIR
...INCLUDE TABLE
文が実行されます。詳細は、「ALTER SESSION」を参照してください。
この項を確認した後、次を参照してください。
CREATE TABLE: TimesTen Scaleoutでの使用方法
この文は、TimesTen Scaleoutでサポートされています。列ベースの圧縮およびエージングはサポートされていません。グローバル一時表では、索引使用句と分散句はサポートされていません。
次を参照してください。
CREATE TABLE: TimesTen Classicでの使用方法
次を参照してください。
CREATE TABLEのSQL構文: TimesTen Scaleout
永続表の構文は、次のとおりです。
CREATE TABLE [Owner.]TableName ( ColumnDefinition [,...] [PRIMARY KEY (ColumnName [,...]) [UsingIndexClause1]]| [[CONSTRAINT ForeignKeyName] FOREIGN KEY ([ColumnName] [,...]) REFERENCES RefTableName [(ColumnName [,...])] [ON DELETE CASCADE]] [...] ) [UNIQUE HASH ON (HashColumnName [,...]) PAGES = PrimaryPages] [DistributionClause] [AS SelectQuery]
次に、UsingIndexClause1
の構文を示します。ノート: CreateIndexStmt
は、TimesTenのCREATE
INDEX
文です。詳細は、「CREATE INDEX」を参照してください。一意索引は主キーの要件であるため、その索引を作成する必要があります。
UsingIndexClause1::= USING INDEX {GLOBAL | LOCAL}| USING INDEX (CreateIndexStmt)
DistributionClause
の構文は、次のとおりです。DistributionClause::= DISTRIBUTE BY HASH [(ColumnName [,...])] | DISTRIBUTE BY REFERENCE [(ForeignKeyConstraint)] | DUPLICATE
ノート:
PRIMARY
KEY
を、ColumnDefinition
句とPRIMARY
KEY
句の両方で指定することはできません。UsingIndexClause1
句を指定する場合は、PRIMARY
KEY
を指定する必要があり、PRIMARY
KEY
はColumnDefinition
句の後に指定する必要があります。UsingIndexClause1
句は、ColumnDefinition
句の一部としては指定できません。
グローバル一時表の構文:
UsingIndexClause1
とDistributionClause
は、グローバル一時表ではサポートされていません。構文は次のとおりです。
CREATE GLOBAL TEMPORARY TABLE [Owner.]TableName ( {{ColumnDefinition} [,...] [PRIMARY KEY (ColumnName [,...])] | [[CONSTRAINT ForeignKeyName] FOREIGN KEY ([ColumnName] [,...]) REFERENCES RefTableName [(ColumnName [,...])] [ON DELETE CASCADE]] [...] } ) [UNIQUE HASH ON (HashColumnName [,...]) PAGES = PrimaryPages] [ON COMMIT { DELETE | PRESERVE } ROWS ]
CREATE TABLEのパラメータ: TimesTen Scaleout
パラメータ | 説明 |
---|---|
|
|
|
|
|
|
[UsingIndexClause1] |
UsingIndexClause1 はオプションです。説明は、この表の次の2行に示します。CREATE TABLE の定義には、2つのUSING INDEX 句を指定できません。この句を使用すると、PRIMARY KEY に対するグローバル索引またはローカル索引を定義できます。
|
USING INDEX {GLOBAL|LOCAL} |
[UsingIndexClause1] 句の一部。指定することで、主キーにグローバル索引またはローカル索引を作成するかどうかを示します。
|
USING INDEX (CreateIndexStmt) |
[UsingIndexClause1] 句の一部。このUSING INDEX 句が指定されている場合、(CreateIndexStmt) 句は、TimesTenのCREATE INDEX 文に従って索引を定義することを示します。カッコ( ) が必要です。主キーの要件に応じて、一意索引を作成する必要があります。
|
|
オプションのユーザー定義の名前を外部キーに指定します。ユーザーが指定しない場合は、システムによってデフォルトの名前が指定されます。 |
|
新しい表と 最初のリストの列は、新しい表の列であり、参照元列と呼ばれます。2番目のリストの列は、参照先の表の列であり、参照先列と呼ばれます。これら2つのリストは、長さ、精度、スケールを含めてデータ型が一致している必要があります。参照先の表には、参照先列に対する主キーまたは一意索引がすでに存在している必要があります。 参照先列の列名リストはオプションです。省略した場合、 外部キーを宣言することにより、参照元列に範囲索引が作成されます。参照先の表またはその参照先の索引は、参照元表を削除しないかぎり削除できません。 外部キー制約によって、新しい表の各行と参照先の表の行は、参照元列の内容と参照先列の内容が同じになるように一致させる必要があります。 TimesTenでは、SQL-92 外部キーはグローバル一時表で定義できますが、グローバル一時表の参照のみを行うことができます。親表が 外部キーは、アクティブな親表を参照できません。アクティブな親表とは、接続に対してマテリアライズされたインスタンスを持つ表のことです。
|
|
|
|
表のハッシュ索引。 |
|
表に定義された列をこの表のハッシュ・キーに含めます。ハッシュ索引に指定される列は、主キーの列と同じである必要があります。
|
|
表の想定ページ数に基づいてハッシュ索引のサイズを設定します。
|
|
グローバル一時表を作成するトランザクションがコミットされるときに、行を削除するか、または保存するかを指定するオプションの文です。この文が指定されていない場合は、一時表の行が削除されます。 |
|
指定すると、 データ型およびデータ型の長さは、
|
|
TimesTen Scaleoutのみでサポートされています。3つのオプションがあります。
句を指定しない場合、デフォルトは
分散キー列は更新できません。 |
|
作成する表をグローバル一時表にします。一時表は永続表と類似していますが、接続で参照された場合にのみ効率的にマテリアライズされます。 グローバル一時表定義は永続的であり、すべての接続に対して表示されますが、表インスタンスは各接続に対してローカルです。表インスタンスは、表を参照するコマンドが接続に対してコンパイルされる場合に作成され、接続が切断されると削除されます。同じ一時表のすべてのインスタンスの名前は同じですが、表名と追加の接続IDに基づいて識別されます。グローバル一時表は、一時領域に割り当てられます。 グローバル一時表の内容は接続間で共有できません。各接続では、その接続の表の内容のみが表示され、一時表を参照するコンパイルされたコマンドは接続間で共有されません。 一時表の操作でログ・レコードが生成されます。生成されるログの量は、永続表用よりも少なくなります。
ローカルの一時表は、サポートされていません。 グローバル一時表にアクセスするには、オブジェクト権限は必要ありません。 グローバル一時表には |
|
表の列の名前。 主キー定義で名前が使用されている場合、名前は作成する表の主キーを形成します。主キーには最大16列を指定できます。外部キーの場合、
|
列定義: TimesTen Scaleout
SQL構文
ENABLE
キーワードは、CREATE
TABLE
文で列を定義する場合にのみ使用できます。
構文は次のとおりです。
ColumnName ColumnDataType [DEFAULT DefaultVal] [[NOT] INLINE] [PRIMARY KEY | UNIQUE | NULL [UNIQUE] | NOT NULL [ENABLE] [PRIMARY KEY | UNIQUE] ]
列定義のパラメータ
列定義には、次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
新しい表の列に割り当てる名前です。表の2つの列に同じ名前を指定することはできません。1つの表の列数は最大で1000です。
|
|
列に格納できるデータ型です。長さを指定する必要があるデータ型もあります。指定できるデータ型の詳細は、「データ型」を参照してください。
|
|
デフォルト値がユーザーのいずれかである場合、列のデータ型は
|
|
デフォルトでは、宣言された列の長さが128バイトより大きい可変長の列は表外に保存されます。宣言された列の長さが128バイト以下の可変長の列は、表内に保存されます。
|
|
列に
|
|
列に
|
|
列に設定される一意制約です。この列に同じ値を持つ行を、表内に複数保持することはできません。一意性を実現するために、TimesTenでは一意の範囲索引が作成されます。つまり、一意制約を持つ列は、制約を持たない列よりも多くのメモリーと時間を実行時に使用する可能性があります。
|
|
列に設定される一意の
|
CREATE TABLEのUSING INDEX句の説明: TimesTen Scaleout
CREATE
TABLE
の定義には、PRIMARY KEY
句の後に追加の句を指定するオプションがあります。この句を使用すると、主キー制約に対するグローバル索引またはローカル索引を指定できます。
-
USING
INDEX {GLOBAL | LOCAL}
句は、主キー制約に対するグローバル索引またはローカル索引を指定できるようにする1つのオプションです。GLOBAL
またはLOCAL
のキーワードを指定する必要があります。ハッシュ索引を定義する場合は、USING
INDEX {GLOBAL | LOCAL}
句の後にオプションでUSE
HASH
INDEX
句を指定できます。 USING INDEX (CreateIndexStmt)
句は、グローバル索引またはローカル索引を指定する別のオプションです。(CreateIndexStmt)
句は、TimesTenのCREATE
INDEX
文に従って索引を定義することを示します。カッコ( )
が必要です。主キー制約の要件に応じて、一意索引を作成する必要があります。CREATE
INDEX
文を使用してハッシュ索引を作成する場合は、CREATE
INDEX
文の詳細について、「CREATE INDEX」を参照してください。
ノート:
CREATE
TABLE
の定義では、USING
INDEX {GLOBAL | LOCAL}
とUSING INDEX (CreateIndexStmt)
の両方を使用することはできません。どちらかの句を指定するか、どちらの句も指定しないでください。
PAGES=
句があります。次のオプションを検討してください。
-
USING
INDEX...CreateIndexStmt
句を指定してHASH
索引を作成する場合は、PAGES=
句を指定するオプションがあります。PAGES=
句を指定しない場合、TimesTenは、デフォルトとしてPAGES=CURRENT
を使用してハッシュ索引のサイズを設定します。(CREATE
INDEX
文の詳細は、「CREATE INDEX」を参照してください)。 -
UNIQUE
HASH
ON
句(CREATE
TABLE
定義の一部)を指定する場合は、ハッシュ索引のサイズを設定するためのPAGES=
句を指定する必要があります。 -
USING
INDEX...CreateIndexStmt
とUNIQUE
HASH
ON
句の両方(CREATE
TABLE
定義の一部)を指定すると、TimesTenは、UNIQUE HASH ON...PAGES=
句で指定された値を使用してハッシュ索引のサイズを設定します。また、TimesTenは警告も発行します。この警告では、ハッシュ索引に対して異なるページ数の指定があることと、UNIQUE HASH ON...PAGES=
句で指定された値を使用していることが示されます。
PAGES=
句はCreateIndexStmt
句(PAGES=200
)とUNIQUE
HASH
ON
句(PAGES=400
)の両方で指定されています。TimesTenは警告を発行して、ハッシュ索引のサイズ設定にPAGES=400
を使用します。Command> CREATE TABLE mytab (col1 TT_INTEGER, col2 TT_INTEGER, PRIMARY KEY (col1, col2)
USING INDEX (CREATE GLOBAL UNIQUE HASH INDEX myindex on mytab (col1,col2) PAGES=200))
UNIQUE HASH ON (col1,col2) PAGES=400 DISTRIBUTE BY HASH (col1);
Warning 2252: Different number of pages specified for hash index MYINDEX in table and index definition.
Index created with pages = 400
-
USING
INDEX
句は、表に対する外部キー制約には使用できません。 -
USING
INDEX
句は、ビューには使用できません。
グローバル索引とローカル索引およびそれらのTimesTen Scaleoutでの使用の詳細は、「CREATE INDEX」を参照してください。
CREATE TABLEの追加情報: TimesTen Scaleout
-
TimesTen Scaleoutは、3つの分散スキームのいずれかによってデータを分散します。
-
ハッシュ: TimesTen Scaleoutは、主キー列または
DISTRIBUTED
BY
HASH
句で指定された1つ以上の列のハッシュに基づいてデータを分散します。指定した行がレプリカ・セットに格納されます。行はレプリカ・セット間で均一に分散されます。大部分の表に適しているため、ハッシュはデフォルトの分散スキームです。 -
参照: TimesTen Scaleoutは外部キーで識別される親表の場所に基づいて子表のデータを分散します。子表の指定した行が親表と同じレプリカ・セットに存在します。この分散スキームは、1つのレプリカ・セット内の関連データを分散することで、結合を最適化します。ハッシュまたは参照によって親表を分散できます。ハッシュによって分散された場合、親はルート表と呼ばれます。子(外部)キー列を
NOT
NULL
として定義する必要があります。 -
複製: TimesTen Scaleoutは、データの同一のコピーをデータベースのすべての要素に分散します。すべての行がすべての要素に存在します。この分散スキームは、各データ・インスタンスに同一のデータを格納することで、読取りのパフォーマンスを最適化します。この分散スキームは、比較的小さい、頻繁に読み取られる、変更頻度の低い表に適しています。
詳細は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』の表に対する分散スキームの定義に関する項および表の分散スキームの定義に関する項を参照してください。
-
-
ハッシュ分散スキームを使用する表の場合:
-
指定された場合、分散キーが使用されます。
-
分散キーが指定されない場合は、主キーが使用されます。
-
主キーまたは分散キーがない場合は、非表示列が使用されます。データはランダムかつ均等に分散されます。
表に主キーが定義されている場合は、分散キーを指定する必要がありますが、主キーはデータを分散する最適な方法ではありません。主キーがなく、一意の列がある場合、この一意の列にデータを分散できます。主キーがなく、一意の列がない場合は、分散キーを指定しないでください。TimesTen Scaleoutは、非表示列にデータを分散します。
-
-
参照による分散スキームの場合:
-
DISTRIBUTE
BY
REFERENCE
句では、1つの外部キー制約のみを参照できます。子表に複数の外部キー制約がある場合がありますが、参照分散を決定するために1つのみを使用できます。 -
参照先外部キー制約が複数ある場合は、制約句で指定する必要があります。
-
参照分散句内の外部キー制約は、主キーまたは親表の一意キーを参照する必要があります。親表がルートである場合、参照先キーは分散キーである必要があります。
-
親表の非分散キー列への外部キー関係を作成できますが、この外部キー関係に基づいて参照によって分散することはできません。
-
DISTRIBUTE
BY
REFERENCE
句で使用されている外部キー列は更新できません。
-
- 表にデータをロードしようとしている場合は、索引のない表の作成を検討してください。索引は、データのロード後に作成できます。これにより、表へのデータのロードにかかる時間が短縮されます。例外は、外部キーと参照表を使用している場合です。
-
CREATE
TABLE
...AS
SELECT
文を使用して、元表の定義に基づいて新しい表を作成できます。主キー制約は新しい表に引き継がれないため、新しい表に主キー制約を定義しない場合、データの分散方法が変更されることに注意してください。詳細は、「CREATE TABLE...AS SELECTの使用」を参照してください。
-
列を同じ値に更新しないかぎり、分散キー列を更新できません。
-
主キーに保存されるすべての列は、
NOT NULL
である必要があります。 -
ColumnDefinition
で指定されたPRIMARY KEY
は、1つの列に対してのみ指定できます。 -
PRIMARY
KEY
を、ColumnDefinition
句とPRIMARY
KEY
句の両方で指定することはできません。 -
主キーおよび外部キー制約において、制約列リストでの列名の重複は許可されません。
-
主キー列は、列を同じ値に更新する以外の更新はできません。
-
インライン列ではなくアウトライン列を定義する際にパフォーマンスに関して考慮する事項があります。
-
TimesTenは、アウトライン列を使用してデータを連続して格納しないため、データへのアクセスは遅くなります。
-
TimesTenは、より多くのロギング操作を生成するため、データの移入が遅くなります。
-
TimesTenは、より多くの再利用操作およびロギング操作を実行するため、データの削除が遅くなります。
-
列を保存するとオーバーヘッドが少なくなります。
-
-
子表の外部キー制約で
ON DELETE CASCADE
を指定している場合、ユーザーは、子表のDELETE
権限を明示的に必要とせずに、DELETE
権限を持つ親表から行を削除できます。 -
ON DELETE CASCADE
トリガー・アクションを変更するには、外部キー制約を削除して再定義してください。 -
キャッシュ表を参照する外部キーを持つ表は作成できません。
-
UNIQUE
列制約およびデフォルトの列の値は、マテリアライズド・ビューではサポートされていません。 -
表の主キーで使用する索引を変更するには、
ALTER TABLE
文を使用します。 -
AS
SelectQuery
句を指定する場合:-
データ型およびデータ型の長さは、
SelectQuery
から導出されます。作成する表の列にデータ型を指定しないでください。 -
SelectQuery
で列を含む式ではなく列が選択された場合、TimesTenでは、新しい表の列に対して、選択された表の対応する列に明示的に作成されていたNOT NULL
制約を定義します。 -
選択された表の列(主キーなど)でTimesTenにより暗黙的に作成されていた
NOT NULL
制約は、新しい表に引き継がれます。選択した表のNOT NULL
制約を無効にするには、新しい列をNULL
として定義します。たとえば:CREATE TABLE newtable (newcol NULL) AS SELECT (col) FROM tab;
-
NOT INLINE
/INLINE
属性は新しい表に引き継がれます。 -
一意キー、外部キー、索引および列のデフォルト値は、新しい表に引き継がれません。
-
SelectQuery
のすべての式が式ではなく列である場合は、作成する表から列を省略できます。この場合、列の名前はSelectQuery
の列と同じです。SelectQuery
に単純な列参照ではなく式が含まれている場合は、列の別名を指定するか、またはCREATE TABLE
文で列に名前を付けます。 -
作成する表に対して外部キーを指定しないでください。
-
SelectQuery
でSELECT FOR UPDATE
を指定しないでください。 -
AS
SelectQuery
句を使用する場合、ORDER BY
句はサポートされません。 -
SelectQuery
に集合演算子UNION
、MINUS
およびINTERSECT
を含めることはできません。
-
-
デフォルトでは、主キーを実現するために、範囲索引が作成されます。主キーに対してハッシュ索引を指定するには、
UNIQUE HASH
句を使用してください。-
アプリケーションで表の主キーを使用して範囲問合せを実行する場合は、
UNIQUE HASH
句を省略して、その表に対して範囲索引を選択してください。 -
主キーの完全一致検索のみをアプリケーションで実行する場合は、ハッシュ索引の方がレスポンス時間およびスループットが優れている場合があります。その場合は、
UNIQUE HASH
句を指定します。
-
-
ハッシュ索引は、表が存在している間、
ALTER TABLE
文を使用してハッシュ索引がサイズ変更されるまで、または索引が削除されて再作成されるまで変更されない固定のサイズで作成されます。小さいハッシュ索引ほどハッシュの衝突が増えます。大きいハッシュ索引ほど衝突が少なくなりますが、メモリを消費しやすくなります。ハッシュ・キー比較は高速な操作であるため、少数のハッシュ衝突がTimesTenにパフォーマンスの問題を発生させることはありません。ハッシュ索引のサイズが適性に設定されていることを確認するには、
SET
PAGES
句のRowPages
パラメータの値により、アプリケーションで表の想定サイズを示す必要があります。この値は、表の想定行数を256で除算して計算します。たとえば、表に256,000行ある場合は、RowPagesに1000を指定します(256000/256=1000)。 -
ハッシュ・キーには、最大16列を指定できます。
-
ON DELETE CASCADE
は、マテリアライズド・ビューのディテール表でサポートされています。子表に対して定義されたマテリアライズド・ビューがある場合、親表からの削除によって子表でカスケード削除が行われます。つまり、親表での削除により、マテリアライズド・ビューも変更されます。 -
DELETE
文によって報告される行の総数には、ON DELETE CASCADE
アクションの結果、子表から削除された行は含まれません。 -
ON DELETE CASCADE
: 親表から子表へのパスが異なる場合があるため、次のルールが適用されます。-
親表から子表へのすべてのパスを、deleteパスかdo not deleteパスのいずれかに統一します。deleteパスのすべての子表で
ON DELETE CASCADE
を指定します。 -
このルールは、1つの親表から複数の子表へ、または複数の親表から1つの子表へのパスには適用されません。
-
-
ON DELETE CASCADE
には、次の規則も適用されます。-
ある表にdeleteパスでアクセスする場合、その表のすべての子表にもdeleteパスでアクセスします。
-
-
グローバル一時表のデータは現在の接続専用となり、ユーザー間で保護する必要はありません。このため、グローバル一時表にオブジェクト権限は必要ありません。
例: TimesTen Scaleoutのグローバル索引とローカル索引
次に示す例は、CREATE
TABLE...PRIMARY KEY
でグローバル索引を使用するための様々な構文の使用を示しています。
USING
INDEX
GLOBAL
句を使用して、グローバル範囲索引を作成します。主キーの要件と同様に、この索引は一意にする必要があります。Command> CREATE TABLE mytab (c TT_INTEGER, b TT_INTEGER, a TT_INTEGER,
PRIMARY KEY (c,b) USING INDEX GLOBAL) DISTRIBUTE BY HASH (a,b);
Command> indexes mytab;
Indexes on table SAMPLEUSER.MYTAB:
MYTAB: global unique range index on columns:
C
B
1 index found.
1 index found on 1 table
Command> DROP TABLE mytab;
主キーを指定する表を作成します。USING
INDEX
LOCAL
句を使用して、ローカル範囲索引を作成します。主キーの要件と同様に、この索引は一意にする必要があります。
Command> CREATE TABLE mytab (c TT_INTEGER, b TT_INTEGER, a TT_INTEGER,
PRIMARY KEY (c,b) USING INDEX LOCAL DISTRIBUTE BY HASH (a,b);
Command> indexes mytab;
Indexes on table SAMPLEUSER.MYTAB:
MYTAB: unique range index on columns:
C
B
1 index found.
1 index found on 1 table.
Command> DROP TABLE mytab;
主キーを指定する表を作成します。USING
INDEX
(CreateIndexStmt)
句を使用して、グローバル範囲索引を作成します。(CreateIndexStmt)
句は、TimesTenのCREATE
INDEX
文に従って索引を定義することを示します。カッコ( )
が必要です。索引の作成時には、UNIQUE
キーワードを指定する必要があります。これは主キーの要件です。この文の詳細は、「CREATE INDEX」を参照してください。
Command> CREATE TABLE mytab (c TT_INTEGER, b TT_INTEGER, a TT_INTEGER,
PRIMARY KEY (c,b) USING INDEX (CREATE GLOBAL UNIQUE INDEX GlobalUniqueIdx ON mytab (c,b))) DISTRIBUTE BY HASH (a,b);
Command> indexes mytab;
Indexes on table SAMPLEUSER.MYTAB:
GLOBALUNIQUEIDX: global unique range index on columns:
C
B
1 index found.
1 index found on 1 table.
Command> DROP TABLE mytab;
主キーを指定する表を作成します。USING
INDEX
(CreateIndexStmt)
句を使用して、グローバル範囲索引を作成します。(CreateIndexStmt)
句は、TimesTenのCREATE
INDEX
文に従って索引を定義することを示します。カッコ( )
が必要です。CREATE
INDEX
定義では、索引定義に追加の列を含めるためのINCLUDE
句を指定します。索引の作成時には、UNIQUE
キーワードを指定する必要があります。これは主キーの要件です。この文の詳細は、「CREATE INDEX」を参照してください。
Command> CREATE TABLE mytab (c TT_INTEGER, b TT_INTEGER, a TT_INTEGER,
PRIMARY KEY (c,b) USING INDEX (CREATE GLOBAL UNIQUE INDEX GlobalUniqueIdx
ON mytab (c,b) INCLUDE (a))) DISTRIBUTE BY HASH (a,b);
Command> indexes mytab;
Indexes on table SAMPLEUSER.MYTAB:
GLOBALUNIQUEIDX: global unique range index on columns:
C
B
Included columns:
A
1 index found.
1 index found on 1 table.
Command> DROP TABLE mytab;
主キーを指定する表を作成します。USING
INDEX
(CreateIndexStmt)
句を使用して、グローバル一意ハッシュ索引を作成します。(CreateIndexStmt)
句は、TimesTenのCREATE
INDEX
文に従って索引を定義することを示します。カッコ( )
が必要です。索引の作成時には、UNIQUE
キーワードを指定する必要があります。これは主キーの要件です。この文の詳細は、「CREATE INDEX」を参照してください。
Command> CREATE TABLE mytab (c TT_INTEGER, b TT_INTEGER, a TT_INTEGER,
PRIMARY KEY (c,b) USING INDEX (CREATE GLOBAL UNIQUE HASH INDEX GlobalUniqueIdx
ON mytab (c,b))) DISTRIBUTE BY HASH (a,b);
Command> indexes mytab;
Indexes on table SAMPLEUSER.MYTAB:
GLOBALUNIQUEIDX: global unique hash index on columns:
C
B
1 index found.
1 index found on 1 table.
Command> DROP TABLE mytab;
その他の例: TimesTen Scaleout
これらの例では、重複、ハッシュおよび参照分散スキームを使用して表を作成する方法を示します。
これらの例では、DISTRIBUTE
BY
REFERENCE
分散スキームを使用して表を作成する方法を示します。
「CREATE TABLE...AS SELECTの使用」には、TimesTen ScaleoutでのCREATE
TABLE
...AS SELECT
の使用方法が示されています。
account_type表の作成
この例では、ttIsql
を実行してaccount_type
表を作成し、複製分散スキームを使用してデータを分散します。この表には少数の行が含まれ、複製分散スキームを使用して読取りを最適化します。表内のデータのコピーはデータベースのすべての要素に分散されます。
Command> CREATE TABLE account_type ( type CHAR(1) NOT NULL PRIMARY KEY, description VARCHAR2(100) NOT NULL) DUPLICATE;
account_status表の作成
この例では、ttIsql
を実行してaccount_status
表を作成し、複製分散スキームを使用します。表のサイズは小さく、分散スキームを使用して読取りを最適化します。表内のデータのコピーはデータベースのすべての要素に分散されます。
Command> CREATE TABLE account_status(status NUMBER(2) NOT NULL PRIMARY KEY, description VARCHAR2(100) NOT NULL) DUPLICATE;
顧客表の作成
この例では、ttIsql
を実行してcustomers
表を作成し、ハッシュによって表を分散します。表内のデータは、cust_id
列(主キー)のハッシュに基づいて各要素に分散されます。
Command> CREATE TABLE customers(cust_id NUMBER(10,0) NOT NULL PRIMARY KEY, first_name VARCHAR2(30) NOT NULL,last_name VARCHAR2(30) NOT NULL, addr1 VARCHAR2(64),addr2 VARCHAR2(64), zipcode VARCHAR2(5), member_since DATE NOT NULL) DISTRIBUTE BY HASH;
アカウント表の作成
この例では、ttIsql
を実行してaccounts
表を作成し、3つの主キー/外部キー関係を定義します。accounts
表は参照によって分散され、データはfk_customer
外部キー制約に基づいて分散されます。このスキームは、(fk_customer
外部キー制約の) customers.cust_id
親列の対応する値の場所に基づいてaccounts
表のデータを分散することで、結合のパフォーマンスを最適化します。子表の行は、親表と同じレプリカ・セットに存在します。結合が主キーまたは外部キーで実行される場合、データは1つの要素に格納されるため、TimesTen Scaleoutは様々な要素にアクセスする必要がありません。
Command> CREATE TABLE accounts(account_id NUMBER(10,0) NOT NULL PRIMARY KEY, phone VARCHAR2(15) NOT NULL,account_type CHAR(1) NOT NULL, status NUMBER(2) NOT NULL,current_balance NUMBER(10,2) NOT NULL, prev_balance NUMBER(10,2) NOT NULL,date_created DATE NOT NULL, cust_id NUMBER(10,0) NOT NULL, CONSTRAINT fk_customer FOREIGN KEY (cust_id) REFERENCES customers(cust_id),CONSTRAINT fk_acct_type FOREIGN KEY (account_type) REFERENCES account_type(type), CONSTRAINT fk_acct_status FOREIGN KEY (status) REFERENCES account_status(status) ) DISTRIBUTE BY REFERENCE (fk_customer);
トランザクション表の作成
この例では、ttIsql
を実行してtransactions
表を作成します。transactions
表は参照によって分散され、データはfk_accounts
外部キー制約に基づいて分散されます。このスキームは、(fk_accounts
外部キー制約の) accounts.account_id
親列の対応する値の場所に基づいてtransaction表のデータを分散することで、結合のパフォーマンスを最適化します。子表の行は、親表と同じレプリカ・セットに存在します。結合が主キーまたは外部キーで実行される場合、データは1つの要素に格納されるため、TimesTen Scaleoutは様々な要素にアクセスする必要がありません。
accounts
親表も参照によって分散されます。これは、参照分散階層による2レベルの分散を定義します。
Command> CREATE TABLE transactions(transaction_id NUMBER(10,0) NOT NULL, account_id NUMBER(10,0) NOT NULL , transaction_ts TIMESTAMP NOT NULL, description VARCHAR2(60), optype CHAR(1) NOT NULL, amount NUMBER(6,2) NOT NULL, PRIMARY KEY (account_id, transaction_id, transaction_ts), CONSTRAINT fk_accounts FOREIGN KEY (account_id) REFERENCES accounts(account_id) ) DISTRIBUTE BY REFERENCE (fk_accounts);
表の表示
この例では、ttIsql
tables
コマンドを実行して、データベースの表を表示します。
Command> tables; SAMPLEUSER.ACCOUNTS SAMPLEUSER.ACCOUNT_STATUS SAMPLEUSER.ACCOUNT_TYPE SAMPLEUSER.CUSTOMERS SAMPLEUSER.TRANSACTIONS 5 tables found.
accounts表の定義の表示
この例では、ttIsql
describe
コマンドを実行して、accounts
表の定義を表示します。
Command> describe accounts; Table SAMPLEUSER.ACCOUNTS: Columns: *ACCOUNT_ID NUMBER (10) NOT NULL PHONE VARCHAR2 (15) INLINE NOT NULL ACCOUNT_TYPE CHAR (1) NOT NULL STATUS NUMBER (2) NOT NULL CURRENT_BALANCE NUMBER (10,2) NOT NULL PREV_BALANCE NUMBER (10,2) NOT NULL DATE_CREATED DATE NOT NULL CUST_ID NUMBER (10) NOT NULL DISTRIBUTE BY REFERENCE (FK_CUSTOMER) 1 table found. (primary key columns are indicated with *)
1つの外部キーを含むDISTRIBUTE BY REFERENCE
この例は、DISTRIBUTE
BY
REFERENCE
句で外部キー制約を指定する必要がないことを示しています。1つの外部キーのみがあります。
最初にOrders
表を作成し、ハッシュによって分散します。
Command> CREATE TABLE Orders (OrderId TT_INTEGER NOT NULL PRIMARY KEY, OrderDate DATE NOT NULL, discount BINARY_FLOAT) DISTRIBUTE BY HASH;
1つの外部キー制約を含むOrderDetails
表を作成します。分散句で制約を指定する必要はありません。
Command> CREATE TABLE OrderDetails (OrderId TT_INTEGER NOT NULL, PartId TT_INTEGER NOT NULL, Quantity TT_INTEGER NOT NULL, FOREIGN KEY (OrderId) REFERENCES Orders (OrderId)) DISTRIBUTE BY REFERENCE;
ttIsql
describe
コマンドを実行して、表を表示します。
Command> describe Orders; Table SAMPLEUSER.ORDERS: Columns: *ORDERID TT_INTEGER NOT NULL ORDERDATE DATE NOT NULL DISCOUNT BINARY_FLOAT DISTRIBUTE BY HASH (ORDERID) 1 table found. (primary key columns are indicated with *) Command> describe OrderDetails; Table SAMPLEUSER.ORDERDETAILS: Columns: ORDERID TT_INTEGER NOT NULL PARTID TT_INTEGER NOT NULL QUANTITY TT_INTEGER NOT NULL DISTRIBUTE BY REFERENCE 1 table found. (primary key columns are indicated with *)
複数の外部キーを含む表
この例は、表に複数の外部キー制約が含まれている場合、参照として使用される外部キー制約をDISTRIBUTE
BY
REFERENCE
句で指定する必要があることを示しています。customers2
表は親となり、ハッシュによって分散されます。OrderDetails2
表には2つの外部キー制約が含まれており、この表は参照によってc1_1
制約で分散されます。この制約をDISTRIBUTED
BY
REFERENCE
句に含める必要があります。
Command> CREATE TABLE customers2 (CustomerId TT_INTEGER NOT NULL PRIMARY KEY, LastOrderDate DATE NOT NULL,PromotionDiscount BINARY_FLOAT) DISTRIBUTE BY HASH; Command> CREATE TABLE OrderDetails2 (OrderId TT_INTEGER NOT NULL, CustomerId TT_INTEGER NOT NULL, Quantity TT_INTEGER NOT NULL, CONSTRAINT c1_1 FOREIGN KEY (OrderId) REFERENCES Orders (OrderId), CONSTRAINT c2_2 FOREIGN KEY (CustomerId) REFERENCES Customers2 (CustomerId)) DISTRIBUTE BY REFERENCE (c1_1);
親表の分散キーに基づかない外部キー関係
この例は、OrderId
主キーおよびCouponId
一意キーを持つorders2
親表を作成します。この表は、ハッシュによって分散されます。分散キーが指定されていないため、データはハッシュによってOrderId
主キーで分散されます。coupons
子表はCouponId
一意キーに外部キー関係を確立します。このキーはorders2
親表の分散キーではないため、TimesTen Scaleoutはエラーをスローします。
Command> CREATE TABLE Orders2 (OrderId TT_INTEGER NOT NULL PRIMARY KEY, CouponId TT_INTEGER NOT NULL UNIQUE, OrderDate DATE NOT NULL, discount BINARY_FLOAT) DISTRIBUTE BY HASH; Command> CREATE TABLE Coupons (CouponId TT_INTEGER NOT NULL, discount BINARY_FLOAT, CONSTRAINT CouponC1 FOREIGN KEY (CouponId) REFERENCES Orders2 (CouponId) ) DISTRIBUTE BY REFERENCE (CouponC1); 1067: The Parent keys for a distribute by reference table with hash distributed parent must include the distribution keys of the parent. The command failed.
第1レベルおよび第2レベルの子外部キー関係の使用
この例では、Coupons2
親表を作成し、ハッシュによってデータを分散します。Orders3
子表は第1レベルの外部キー関係として作成され、親表(Coupons2
)はルート表です。OrderDetails3
子表は第2レベルの外部キー関係として作成され、親表(Orders3
)は参照表です。
Command> CREATE TABLE Coupons2 (CouponId TT_INTEGER NOT NULL PRIMARY KEY, discount BINARY_FLOAT) DISTRIBUTE BY HASH; Command> CREATE TABLE Orders3 (OrderId TT_INTEGER NOT NULL PRIMARY KEY, CouponId TT_INTEGER NOT NULL, OrderDate DATE NOT NULL, discount BINARY_FLOAT, CONSTRAINT c1_coupons FOREIGN KEY (CouponId) REFERENCES Coupons2 (CouponId)) DISTRIBUTE BY REFERENCE (c1_coupons); Command> CREATE TABLE OrderDetails3 (OrderId TT_INTEGER NOT NULL, PartId TT_INTEGER NOT NULL, quantity TT_INTEGER NOT NULL, CONSTRAINT c1_orders FOREIGN KEY (OrderId) REFERENCES Orders3 (OrderId)) DISTRIBUTE BY REFERENCE (C1_orders);
CREATE TABLE...AS SELECTの使用
この例では、customers
表に基づいてNewCustomers
表を作成します。主キー制約を定義することで、同じ分散スキームを保持し、データが主キーに基づいて分散されるようにします。
Command> CREATE TABLE NewCustomers(cust_id PRIMARY KEY, first_name, last_name, addr1, addr2, zipcode, member_since) AS SELECT * FROM customers; 0 rows inserted. Command> describe NewCustomers; Table SAMPLEUSER.NEWCUSTOMERS: Columns: *CUST_ID NUMBER (10) NOT NULL FIRST_NAME VARCHAR2 (30) INLINE NOT NULL LAST_NAME VARCHAR2 (30) INLINE NOT NULL ADDR1 VARCHAR2 (64) INLINE ADDR2 VARCHAR2 (64) INLINE ZIPCODE VARCHAR2 (5) INLINE MEMBER_SINCE DATE NOT NULL DISTRIBUTE BY HASH (CUST_ID) 1 table found. (primary key columns are indicated with *)
ttIsql
describe
を実行して、元のcustomers
表を表示します。
Command> describe Customers; Table SAMPLEUSER.CUSTOMERS: Columns: *CUST_ID NUMBER (10) NOT NULL FIRST_NAME VARCHAR2 (30) INLINE NOT NULL LAST_NAME VARCHAR2 (30) INLINE NOT NULL ADDR1 VARCHAR2 (64) INLINE ADDR2 VARCHAR2 (64) INLINE ZIPCODE VARCHAR2 (5) INLINE MEMBER_SINCE DATE NOT NULL DISTRIBUTE BY HASH (CUST_ID) 1 table found. (primary key columns are indicated with *)
CREATE TABLEのSQL構文: TimesTen Classic
PRIMARY
KEY
を、ColumnDefinition
句とPRIMARY
KEY
句の両方で指定することはできません。
永続表の構文は、次のとおりです。
CREATE TABLE [Owner.]TableName ( {{ColumnDefinition} [,...] [PRIMARY KEY (ColumnName [,...]) | [[CONSTRAINT ForeignKeyName] FOREIGN KEY ([ColumnName] [,...]) REFERENCES RefTableName [(ColumnName [,...])] [ON DELETE CASCADE]] [...] } ) [ColumnBasedCompression] [UNIQUE HASH ON (HashColumnName [,...]) PAGES = PrimaryPages] [AGING {LRU| USE ColumnName LIFETIME Num1 {SECOND[S] | MINUTE[S] | HOUR[S] |DAY[S]} [CYCLE Num2 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]}] }[ON|OFF] ] [AS SelectQuery]
グローバル一時表の構文は、次のとおりです。
CREATE GLOBAL TEMPORARY TABLE [Owner.]TableName ( {{ColumnDefinition} [,...] [PRIMARY KEY (ColumnName [,...]) | [[CONSTRAINT ForeignKeyName] FOREIGN KEY ([ColumnName] [,...]) REFERENCES RefTableName [(ColumnName [,...])] [ON DELETE CASCADE]] [...] } ) [UNIQUE HASH ON (HashColumnName [,...]) PAGES = PrimaryPages] [ON COMMIT { DELETE | PRESERVE } ROWS]
CREATE TABLEのパラメータ: TimesTen Classic
パラメータ | 説明 |
---|---|
|
新しい表に割り当てる名前です。2つの表に同じ所有者名と表名を指定することはできません。 所有者名を指定していない場合は、ログイン名が新しい表の所有者名になります。TimesTenの表の所有者は、ユーザーIDの設定またはログイン名によって決まります。Oracle Database表の所有者名は、TimesTen表の所有者名と常に一致させる必要があります。 名前を定義するためのルールについては、「基本名」を参照してください。 |
|
作成する表をグローバル一時表にします。一時表は永続表と類似していますが、接続で参照された場合にのみ効率的にマテリアライズされます。 グローバル一時表定義は永続的であり、すべての接続に対して表示されますが、表インスタンスは各接続に対してローカルです。表インスタンスは、表を参照するコマンドが接続に対してコンパイルされる場合に作成され、接続が切断されると削除されます。同じ一時表のすべてのインスタンスの名前は同じですが、表名と追加の接続IDに基づいて識別されます。グローバル一時表は、一時領域に割り当てられます。 グローバル一時表の内容は接続間で共有できません。各接続では、その接続の表の内容のみが表示され、一時表を参照するコンパイルされたコマンドは接続間で共有されません。
キャッシュ・グループ表は、一時表として定義できません。 一時表の変更は、XLAで追跡できません。 一時表の操作でログ・レコードが生成されます。生成されるログの量は、永続表用よりも少なくなります。 TRUNCATE TABLEは、グローバル一時表でサポートされていません。 ローカルの一時表は、サポートされていません。 グローバル一時表にアクセスするには、オブジェクト権限は必要ありません。 グローバル一時表には |
|
表の個々の列です。各表には、列が少なくとも1つ必要です。
|
|
表の列の名前。 主キー定義で名前が使用されている場合、名前は作成する表の主キーを形成します。主キーには最大16列を指定できます。外部キーの場合、
|
|
|
|
オプションのユーザー定義の名前を外部キーに指定します。ユーザーが指定しない場合は、システムによってデフォルトの名前が指定されます。 |
|
新しい表と 最初のリストの列は、新しい表の列であり、参照元列と呼ばれます。2番目のリストの列は、参照先の表の列であり、参照先列と呼ばれます。これら2つのリストは、長さ、精度、スケールを含めてデータ型が一致している必要があります。参照先の表には、参照先列に対する主キーまたは一意索引がすでに存在している必要があります。 参照先列の列名リストはオプションです。省略した場合、 外部キーを宣言することにより、参照元列に範囲索引が作成されます。参照先の表またはその参照先の索引は、参照元表を削除しないかぎり削除できません。 外部キー制約によって、新しい表の各行と参照先の表の行は、参照元列の内容と参照先列の内容が同じになるように一致させる必要があります。 TimesTenでは、SQL-92 外部キーはグローバル一時表で定義できますが、グローバル一時表の参照のみを行うことができます。親表が 外部キーは、アクティブな親表を参照できません。アクティブな親表とは、接続に対してマテリアライズされたインスタンスを持つ表のことです。
|
|
|
|
データをより効率的に格納する、列レベルでの圧縮を定義します。列での重複する値の冗長な格納を削除し、全表スキャンを実行するSQL問合せのパフォーマンスを向上させます。詳細は、「表の列ベースの圧縮(TimesTen Classic)」を参照してください。 |
|
|
|
表のハッシュ索引。このパラメータは、等価条件に使用します。 |
|
表に定義された列をこの表のハッシュ・キーに含めます。ハッシュ索引に指定される列は、主キーの列と同じである必要があります。
|
|
表の想定ページ数に基づいてハッシュ索引のサイズを設定します。
|
|
グローバル一時表を作成するトランザクションがコミットされるときに、行を削除するか、または保存するかを指定するオプションの文です。この文が指定されていない場合は、一時表の行が削除されます。 |
|
指定する場合、表のLRUエージング・ポリシーを定義します。LRUエージング・ポリシーでは、エージングのタイプ(LRU)、エージング状態( エージング状態を LRU属性は、組込みプロシージャの |
|
指定する場合、表の時間ベースのエージング・ポリシーを定義します。時間ベースのエージング・ポリシーでは、エージングのタイプ(時間ベース)、エージング状態( エージング状態を 時間ベースのエージング属性はSQLレベルで定義され、 時間ベース・エージングに使用する列の名前として エージングに使用される列の値は、アプリケーションによって更新されます。この列の値が不明な行がある場合、その行がエージ・アウトされないようにするには、列に大きなデフォルト値を定義します(この列は
AS 時間ベースのエージングの詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の表へのエージングの実装に関する項を参照してください。 |
|
時間の単位の概念がサポートされています。時間の単位に |
|
エージング状態が |
|
指定すると、 データ型およびデータ型の長さは、
|
列定義: TimesTen Classic
SQL構文
ENABLE
キーワードは、CREATE
TABLE
文で列を定義する場合にのみ使用できます。
LOB以外のすべてのデータ型について、構文は次のとおりです。
ColumnName ColumnDataType [DEFAULT DefaultVal] [[NOT] INLINE] [PRIMARY KEY | UNIQUE | NULL [UNIQUE] | NOT NULL [ENABLE] [PRIMARY KEY | UNIQUE] ]
LOBデータ型の場合、LOB列に主キーまたは一意制約を作成できません。また、LOBデータ型は表外に格納されるため、INLINE
属性を指定できません。
LOBデータ型は、TimesTen Scaleoutではサポートされていません。
すべてのLOBデータ型について、構文は次のとおりです。
ColumnName ColumnDataType [DEFAULT DefaultVal] [[NOT] NULL [ENABLE]] | [[NOT] NULL [ENABLE]] [DEFAULT DefaultVal]
パラメータ
列定義には、次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
新しい表の列に割り当てる名前です。表の2つの列に同じ名前を指定することはできません。1つの表の列数は最大で1000です。
|
|
列に格納できるデータ型です。長さを指定する必要があるデータ型もあります。指定できるデータ型の詳細は、「データ型」を参照してください。
|
|
デフォルト値がユーザーのいずれかである場合、列のデータ型は
|
|
デフォルトでは、宣言された列の長さが128バイトより大きい可変長の列は表外に保存されます。宣言された列の長さが128バイト以下の可変長の列は、表内に保存されます。
|
|
列に
|
|
列に
|
|
列に設定される一意制約です。この列に同じ値を持つ行を、表内に複数保持することはできません。一意性を実現するために、TimesTenでは一意の範囲索引が作成されます。つまり、一意制約を持つ列は、制約を持たない列よりも多くのメモリーと時間を実行時に使用する可能性があります。
|
|
列に設定される一意の
|
CREATE TABLEの説明: TimesTen Classic
- 表にデータをロードしようとしている場合は、索引のない表の作成を検討してください。索引は、データのロード後に作成できます。これにより、表へのデータのロードにかかる時間が短縮されます。
-
主キーに保存されるすべての列は、
NOT NULL
である必要があります。 -
ColumnDefinition
で指定されたPRIMARY KEY
は、1つの列に対してのみ指定できます。 -
PRIMARY
KEY
を、ColumnDefinition
句とPRIMARY
KEY
句の両方で指定することはできません。 -
主キーおよび外部キー制約において、制約列リストでの列名の重複は許可されません。
-
主キー列は、列を同じ値に更新する以外の更新はできません。
-
インライン列ではなくアウトライン列を定義する際にパフォーマンスに関して考慮する事項があります。
-
TimesTenは、アウトライン列を使用してデータを連続して格納しないため、データへのアクセスは遅くなります。
-
TimesTenは、より多くのロギング操作を生成するため、データの移入が遅くなります。
-
TimesTenは、より多くの再利用操作およびロギング操作を実行するため、データの削除が遅くなります。
-
列を保存するとオーバーヘッドが少なくなります。
-
-
子表の外部キー制約で
ON DELETE CASCADE
を指定している場合、ユーザーは、子表のDELETE
権限を明示的に必要とせずに、DELETE
権限を持つ親表から行を削除できます。 -
ON DELETE CASCADE
トリガー・アクションを変更するには、外部キー制約を削除して再定義してください。 -
キャッシュ表を参照する外部キーを持つ表は作成できません。
-
UNIQUE
列制約およびデフォルトの列の値は、マテリアライズド・ビューではサポートされていません。 -
表の主キーで使用する索引を変更するには、
ALTER TABLE
文を使用します。 -
AS
SelectQuery
句を指定する場合:-
データ型およびデータ型の長さは、
SelectQuery
から導出されます。作成する表の列にデータ型を指定しないでください。 -
SelectQuery
で列を含む式ではなく列が選択された場合、TimesTenでは、新しい表の列に対して、選択された表の対応する列に明示的に作成されていたNOT NULL
制約を定義します。 -
選択された表の列(主キーなど)でTimesTenにより暗黙的に作成されていた
NOT NULL
制約は、新しい表に引き継がれます。選択した表のNOT NULL
制約を無効にするには、新しい列をNULL
として定義します。たとえば:CREATE TABLE newtable (newcol NULL) AS SELECT (col) FROM tab;
-
NOT INLINE
/INLINE
属性は新しい表に引き継がれます。 -
一意キー、外部キー、索引および列のデフォルト値は、新しい表に引き継がれません。
-
SelectQuery
のすべての式が式ではなく列である場合は、作成する表から列を省略できます。この場合、列の名前はSelectQuery
の列と同じです。SelectQuery
に単純な列参照ではなく式が含まれている場合は、列の別名を指定するか、またはCREATE TABLE
文で列に名前を付けます。 -
作成する表に対して外部キーを指定しないでください。
-
SelectQuery
でSELECT FOR UPDATE
を指定しないでください。 -
AS
SelectQuery
句を使用する場合、ORDER BY
句はサポートされません。 -
SelectQuery
に集合演算子UNION
、MINUS
およびINTERSECT
を含めることはできません。 -
レプリケートされた環境では、次のことに注意してください。
グローバル一時表を含む新しい表の作成時に表をアクティブ・スタンバイ・ペアに含めるには、アクティブ・データベースで
CREATE TABLE
文を実行する前に、DDL_REPLICATION_LEVEL
を2以上に設定し、DDL_REPLICATION_ACTION
をINCLUDE
に設定します。この構成では、表はアクティブ・スタンバイ・ペアに含まれ、レプリケーション・スキームのすべてのデータベースにレプリケートされます。DDL_REPLICATION_ACTION
をEXCLUDE
に設定した場合、新しい表は、アクティブ・スタンバイ・ペアに含まれませんが、レプリケーション・スキームのすべてのデータベースにレプリケートされます。表はレプリケーション・スキームの一部にはならないため、その表で発行されたDMLはレプリケートされません。表に対してDMLレプリケーションを有効にするには、ALTER ACTIVE STANDBY PAIR ... INCLUDE TABLE
文を実行して、表を含める必要があります。この場合、ALTER ACTIVE STANDBY PAIR ... INCLUDE TABLE
を実行すると表の内容は切り捨てられるため、この文を実行する前に、表は空であり、すべてのデータベースに存在している必要があります。詳細は、「ALTER SESSION」を参照してください。
-
-
デフォルトでは、主キーを実現するために、範囲索引が作成されます。主キーに対してハッシュ索引を指定するには、
UNIQUE HASH
句を使用してください。-
アプリケーションで表の主キーを使用して範囲問合せを実行する場合は、
UNIQUE HASH
句を省略して、その表に対して範囲索引を選択してください。 -
主キーの完全一致検索のみをアプリケーションで実行する場合は、ハッシュ索引の方がレスポンス時間およびスループットが優れている場合があります。その場合は、
UNIQUE HASH
句を指定します。
-
-
ハッシュ索引は、表が存在している間、
ALTER TABLE
文を使用してハッシュ索引がサイズ変更されるまで、または索引が削除されて再作成されるまで変更されない固定のサイズで作成されます。小さいハッシュ索引ほどハッシュの衝突が増えます。大きいハッシュ索引ほど衝突が少なくなりますが、メモリを消費しやすくなります。ハッシュ・キー比較は高速な操作であるため、少数のハッシュ衝突がTimesTenにパフォーマンスの問題を発生させることはありません。ハッシュ索引のサイズが適性に設定されていることを確認するには、
SET
PAGES
句のRowPages
パラメータの値により、アプリケーションで表の想定サイズを示す必要があります。この値は、表の想定行数を256で除算して計算します。たとえば、表に256,000行ある場合は、RowPagesに1000を指定します(256000/256=1000)。 -
ハッシュ・キーには、最大16列を指定できます。
-
ON DELETE CASCADE
は、マテリアライズド・ビューのディテール表でサポートされています。子表に対して定義されたマテリアライズド・ビューがある場合、親表からの削除によって子表でカスケード削除が行われます。つまり、親表での削除により、マテリアライズド・ビューも変更されます。 -
DELETE
文によって報告される行の総数には、ON DELETE CASCADE
アクションの結果、子表から削除された行は含まれません。 -
ON DELETE CASCADE
: 親表から子表へのパスが異なる場合があるため、次のルールが適用されます。-
親表から子表へのすべてのパスを、deleteパスかdo not deleteパスのいずれかに統一します。deleteパスのすべての子表で
ON DELETE CASCADE
を指定します。 -
このルールは、1つの親表から複数の子表へ、または複数の親表から1つの子表へのパスには適用されません。
-
-
ON DELETE CASCADE
には、次の規則も適用されます。-
ある表にdeleteパスでアクセスする場合、その表のすべての子表にもdeleteパスでアクセスします。
-
-
レプリケーションを含む
ON DELETE CASCADE
: 次の制限が適用されます。-
ON DELETE CASCADE
で指定された外部キーは、レプリケートされた表のマスターとサブスクライバの間で一致している必要があります。これは実行時に確認されます。エラーが発生すると、RECEIVERスレッドは処理を停止します。 -
カスケード削除のツリーに含まれる表をレプリケートする場合は、ツリーに含まれるすべての表をレプリケートする必要があります。この制限は、レプリケーション・スキームを作成したとき、またはレプリケーション表のいずれかに
ON DELETE CASCADE
付きの外部キーを追加したときにチェックされます。エラーが検出されると、処理は中断します。外部キー制約を変更する前に、まずレプリケーション・スキームを削除することが必要になる場合があります。 -
レプリケートされた表で外部キーの追加や削除を行う前に、レプリケーション・エージェントを停止する必要があります。
-
-
グローバル一時表のデータは現在の接続専用となり、ユーザー間で保護する必要はありません。このため、グローバル一時表にオブジェクト権限は必要ありません。
-
表のエージング・ポリシーを定義した後に、エージング・ポリシーをLRUから時間ベースに、または時間ベースからLRUに変更できません。最初にエージングを削除し、表を変更して新しいエージング・ポリシーを追加する必要があります。
-
エージング・ポリシーは、エージング状態を変更するように定義する必要があります。
-
時間ベースのエージング・ポリシーの場合、エージング列を追加または変更できません。これは、
NOT NULL
列を追加または変更できないためです。 -
1つのシステムでLRUエージングと時間ベースのエージングの両方を組み合せて使用できます。LRUエージングのみを使用する場合、エージング・スレッドはデータベース全体に指定されたサイクルに基づいて起動します。一方、時間ベースのエージングのみを使用する場合、エージング・スレッドは最適な頻度に基づいて起動します。この頻度は、すべての表の
CYCLE
句に指定された値によって決定されます。LRUエージングと時間ベースのエージングの両方を使用する場合は、両方のタイプを組み合せて考慮した上でスレッドが起動します。 -
LRUエージングでは、行がアクセスされているかまたは参照されているかどうかを、次のルールで判断します。
-
SELECT
文の結果セットを構築するために使用された行。 -
INSERT ... SELECT
文の結果セットを構築するために使用された行。 -
更新または削除対象の行。
-
-
コマンドで参照される表に対してLRUエージングの削除や追加を行うと、コンパイルされたコマンドは無効と指定され、再コンパイルが必要になります。
-
エージング状態にかかわらずエージング処理をすぐにスケジュールするには、
ttAgingScheduleNow
プロシージャをコールします。 -
エージングの制限:
-
LRUエージングと時間ベースのエージングは、マテリアライズド・ビューのディテール表ではサポートされていません。
-
LRUエージングと時間ベースのエージングは、グローバル一時表ではサポートされていません。
-
時間ベースのエージングに使用されている列は削除できません。
-
エージング・ポリシーとエージング状態は、すべてのレプリケーション・サイトで同じである必要があります。
-
外部キーによって関連付けられている表には、同じエージング・ポリシーを設定する必要があります。
-
LRUエージングでは、子行がエージングの対象でない場合、この子行とその親行は削除されません。
ON DELETE CASCADE
の設定は無視されます。 -
時間ベースのエージングでは、親行がエージングの対象である場合、すべての子行が削除されます。
ON DELETE CASCADE
は、設定の有無にかかわらず無視されます。
-
表の列ベースの圧縮(TimesTen Classic)
データをより効率的に格納する列レベルで表を圧縮できます。これは、列での重複する値の冗長な格納を削除し、全表スキャンを実行するSQL問合せのパフォーマンスを向上させます。
表の圧縮される1つ以上の列(圧縮列グループと呼ばれる)を定義できます。各表に1つ以上の圧縮列グループを定義できます。
各圧縮列グループに対して、圧縮列グループのすべての個別値の列を含むディクショナリ表が作成されます。圧縮列グループには、ディクショナリ表の適切な値の行へのポインタが含まれます。このポインタの幅は、ディクショナリ表に対して定義した最大エントリ数に応じて、1、2または4バイトです。そのため、圧縮されている列グループ内の列の幅の合計が、1、2または4バイトのポインタの幅より広い場合、およびこれらの列値に多くの重複する値が存在する場合は、表で使用される領域を削減しました。
図6-1に、ディクショナリ表の適切な行を指している、表の圧縮列グループを示します。
ディクショナリ表には、各個別値へのポインタの列があります。ユーザーが圧縮列グループの個別エントリの最大数を構成すると、圧縮列グループのサイズが次のように設定されます。
-
エントリの最大数が255(28-1)の場合は1バイト。最大数が1から255の場合、ディクショナリのサイズは255(28-1)に設定され、圧縮列グループのポインタ列は1バイトになります。
-
エントリの最大数が65,535(216-1)の場合は2バイト。最大数が256から65,535の場合、ディクショナリのサイズは65,535(216-1)に設定され、圧縮列グループのポインタ列は2バイトになります。
-
エントリの最大数が4,294,967,295(232-1)の場合は4バイト。最大数が65,536から4,294,967,295の場合、ディクショナリのサイズは4,294,967,295(232-1)に設定され、圧縮列グループのポインタ列は4バイトになります。これがデフォルトです。
構文: 列ベースの圧縮(TimesTen Classic)
ColumnBasedCompression
の構文は、次のとおりです。
[COMPRESS (CompressColumns [,...])]
CompressColumns
の構文は次のとおりです。
{ColumnDefinition | (ColumnDefinition [,...])} BY DICTIONARY [MAXVALUES = CompressMax]
パラメータ
ColumnBasedCompression
構文には、次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
圧縮が有効な表について圧縮列グループを定義します。表の1つ以上の列を含めることができます。ただし、1つの列は1つの圧縮列グループにのみ含めることができます。 圧縮列グループで複数の列を指定する場合、 各圧縮列グループは、最大16列に制限されます。 |
|
各圧縮列グループの圧縮ディクショナリを定義します。 |
|
ディクショナリ表の場合、
MAXVALUES句を省略した場合の最大サイズのデフォルトは2 |
説明: 列ベースの圧縮(TimesTen Classic)
-
圧縮列グループは、表の作成時に追加するか、
ALTER TABLE
文を使用して後で追加できます。ALTER TABLE
文を使用して、圧縮列グループを削除できますが、グループ全体を削除する必要があります。 -
表のすべての列および個別の圧縮列グループに存在する列に索引を作成できます。ただし、一意の列または単一列主キーに単一列圧縮グループを作成することはできません。すべての索引または主キーが同じ圧縮グループに存在する場合も、一意の索引または主キーを作成することはできません。
-
LOB列は圧縮できません。
-
レプリケートされた表、キャッシュ・グループ表またはグローバル一時表の列では、圧縮はサポートされません。
CREATE TABLE AS SELECT
文を使用し、その文でその表に対して列ベースの圧縮を定義すると、表を作成できません。 -
圧縮が有効な表では、マテリアライズド・ビューを作成できません。
-
列ベースの圧縮は、TimesTen Scaleoutではサポートされていません。
例: TimesTen Classic
範囲索引がpartnumber
に対して作成されます(主キーであるため)。
Command> CREATE TABLE price (partnumber INTEGER NOT NULL PRIMARY KEY, vendornumber INTEGER NOT NULL, vendpartnum CHAR(20) NOT NULL, unitprice DECIMAL(10,2), deliverydays SMALLINT, discountqty SMALLINT); Command> INDEXES price; Indexes on table SAMPLEUSER.PRICE: PRICE: unique range index on columns: PARTNUMBER 1 index found. 1 index found on 1 table.
ハッシュ索引は、主キーであるclubname
列に作成されます。
CREATE TABLE recreation.clubs (clubname CHAR(15) NOT NULL PRIMARY KEY, clubphone SMALLINT, activity CHAR(18)) UNIQUE HASH ON (clubname) PAGES = 30;
範囲索引は、membername
およびclub
の2つの列で作成されます(ともに主キーであるため)。
Command> CREATE TABLE recreation.members (membername CHAR(20) NOT NULL, club CHAR(15) NOT NULL, memberphone SMALLINT, PRIMARY KEY (membername, club)); Command> INDEXES recreation.members; Indexes on table RECREATION.MEMBERS: MEMBERS: unique range index on columns: MEMBERNAME CLUB 1 index found on 1 table.
recreation.events
表にはハッシュ索引は作成されません。
CREATE TABLE recreation.events (sponsorclub CHAR(15), event CHAR(30), coordinator CHAR(20), results VARBINARY(10000));
ハッシュ索引は、vendornumber
列に作成されます。
CREATE TABLE purchasing.vendors (vendornumber INTEGER NOT NULL PRIMARY KEY, vendorname CHAR(30) NOT NULL, contactname CHAR(30), phonenumber CHAR(15), vendorstreet CHAR(30) NOT NULL, vendorcity CHAR(20) NOT NULL, vendorstate CHAR(2) NOT NULL, vendorzipcode CHAR(10) NOT NULL, vendorremarks VARCHAR(60)) UNIQUE HASH ON (vendornumber) PAGES = 101;
ハッシュ索引は、membername
列およびclub
列で作成されます(ともに主キーであるため)。
CREATE TABLE recreation.members (membername CHAR(20) NOT NULL, club CHAR(15) NOT NULL, memberphone SMALLINT, PRIMARY KEY (membername, club)) UNIQUE HASH ON (membername, club) PAGES = 100;
ハッシュ索引は、firstname
列およびlastname
列に作成されます(ともにauthors
表の主キーであるため)。外部キーは、authors
表の主キーを参照するbooks
表のauthorfirstname
とauthorlastname
列に作成されます。
CREATE TABLE authors (firstname VARCHAR(255) NOT NULL, lastname VARCHAR(255) NOT NULL, description VARCHAR(2000), PRIMARY KEY (firstname, lastname)) UNIQUE HASH ON (firstname, lastname) PAGES=20; CREATE TABLE books (title VARCHAR(100), authorfirstname VARCHAR(255), authorlastname VARCHAR(255), price DECIMAL(5,2), FOREIGN KEY (authorfirstname, authorlastname) REFERENCES authors(firstname, lastname));
次の文では、VARCHAR
列のデフォルト文字を上書きし、1つのVARCHAR (10)
列がNOT INLINE
で、1つのVARCHAR (144)
がINLINE
である表が作成されます。
CREATE TABLE t1 (c1 VARCHAR(10) NOT INLINE NOT NULL, c2 VARCHAR(144) INLINE NOT NULL);
次の文では、本のタイトルのUNIQUE
列を持つ表が作成されます。
CREATE TABLE books (title VARCHAR(100) UNIQUE, authorfirstname VARCHAR(255), authorlastname VARCHAR(255), price DECIMAL(5,2), FOREIGN KEY (authorfirstname, authorlastname) REFERENCES authors(firstname, lastname));
次の文では、列x1
のデフォルト値が1で、列d
のデフォルト値がSYSDATE
である表が作成されます。
CREATE TABLE t1 (x1 INT DEFAULT 1, d TIMESTAMP DEFAULT SYSDATE);
この例では、rangex
表を作成し、主キーとしてcol1
を定義します。デフォルトで範囲索引が作成されます。
Command> CREATE TABLE rangex (col1 TT_INTEGER PRIMARY KEY); Command> INDEXES rangex; Indexes on table SAMPLEUSER.RANGEX: RANGEX: unique range index on columns: COL1 1 index found 1 index found on 1 table.
次の文は、HR
スキーマの親表および子表におけるON DELETE CASCADE
句の使用を示しています。外部キーを持つ表は、ON DELETE CASCADE
が有効になるように変更されています。
ALTER TABLE countries ADD CONSTRAINT countr_reg_fk FOREIGN KEY (region_id) REFERENCES regions(region_id) ON DELETE CASCADE; ALTER TABLE locations ADD CONSTRAINT loc_c_id_fk FOREIGN KEY (country_id) REFERENCES countries(country_id) ON DELETE CASCADE; ALTER TABLE departments ADD CONSTRAINT dept_loc_fk FOREIGN KEY (location_id) REFERENCES locations (location_id) ON DELETE CASCADE; ALTER TABLE employees ADD CONSTRAINT emp_dept_fk FOREIGN KEY (department_id) REFERENCES departments ON DELETE CASCADE; ALTER TABLE employees ADD CONSTRAINT emp_job_fk FOREIGN KEY (job_id) REFERENCES jobs (job_id); ALTER TABLE job_history ADD CONSTRAINT jhist_job_fk FOREIGN KEY (job_id) REFERENCES jobs; ALTER TABLE job_history ADD CONSTRAINT jhist_emp_fk FOREIGN KEY (employee_id) REFERENCES employees ON DELETE CASCADE; ALTER TABLE job_history ADD CONSTRAINT jhist_dept_fk FOREIGN KEY (department_id) REFERENCES departments ON DELETE CASCADE; ;
この例は、エージングにおいて、時間の単位がどのように機能するかを示しています。
存続時間が3 Daysの場合(単位はDay):
-
(SYSDATE -
ColumnValue
) <= 3
の場合、エージ・アウトされません。 -
(SYSDATE -
ColumnValue
) > 3
の場合、行はエージ・アウトの対象になります。 -
(SYSDATE -
ColumnValue
) = 3 days, 22 hours
の場合、存続期間を3 Daysに指定すると、行はエージ・アウトされません。存続期間が72 Hoursと指定されていた場合は、行はエージ・アウトされます。
この例では、LRUエージングを使用して表を作成します。エージング状態は、デフォルトでON
になっています。
CREATE TABLE agingdemo (agingid NUMBER NOT NULL PRIMARY KEY, name VARCHAR2 (20) ) AGING LRU; Command> DESCRIBE agingdemo; Table USER.AGINGDEMO: Columns: *AGINGID NUMBER NOT NULL NAME VARCHAR2 (20) INLINE AGING LRU ON 1 table found. (primary key columns are indicated with *)
この例では、時間ベースのエージングを使用する表を作成します。存続期間は3 Daysです。サイクルは指定されていないため、デフォルトで5分です。エージング状態はOFF
です。
CREATE TABLE agingdemo2 (agingid NUMBER NOT NULL PRIMARY KEY, name VARCHAR2 (20), agingcolumn TIMESTAMP NOT NULL ) AGING USE agingcolumn LIFETIME 3 DAYS OFF; Command> DESCRIBE agingdemo2; Table USER.AGINGDEMO2: Columns: *AGINGID NUMBER NOT NULL NAME VARCHAR2 (20) INLINE AGINGCOLUMN TIMESTAMP (6) NOT NULL Aging use AGINGCOLUMN lifetime 3 days cycle 5 minutes off 1 table found. (primary key columns are indicated with *)
この例では、エラー・メッセージが生成されます。これは、エージング・ポリシーを一度作成すると、変更できないことを示しています。エージングを削除して、再定義する必要があります。
CREATE TABLE agingdemo2 (agingid NUMBER NOT NULL PRIMARY KEY, name VARCHAR2 (20), agingcolumn TIMESTAMP NOT NULL ) AGING USE agingcolumn LIFETIME 3 DAYS OFF; ALTER TABLE agingdemo2 ADD AGING LRU; 2980: Cannot add aging policy to a table with an existing aging policy. Have to drop the old aging first The command failed. DROP aging on the table and redefine with LRU aging. ALTER TABLE agingdemo2 DROP AGING; ALTER TABLE agingdemo2 ADD AGING LRU; Command> DESCRIBE agingdemo2; Table USER.AGINGDEMO2: Columns: *AGINGID NUMBER NOT NULL NAME VARCHAR2 (20) INLINE AGINGCOLUMN TIMESTAMP (6) NOT NULL Aging lru on 1 table found. (primary key columns are indicated with *)
時間ベースのエージングを指定して表を作成してみます。TT_DATE
データ型と3時間のLIFETIME
を指定してエージング列を定義します。LIFETIME
単位はDAYS
で指定する必要があるため、エラーが生成されます。
Command> CREATE TABLE aging1 (col1 TT_INTEGER PRIMARY KEY, col2 TT_DATE NOT NULL) AGING USE col2 LIFETIME 3 HOURS; 2977: Only DAY lifetime unit is allowed with a TT_DATE column The command failed.
AS
SelectQuery
句を使用して、表emp
を作成します。employees
表から、employee_id
が100から105までのlast_name
を選択します。emp
に6行が挿入されたことが示されます。返される必要のある行を確認するために、最初にSELECT
文を発行します。
Command> SELECT last_name FROM employees WHERE employee_id BETWEEN 100 AND 105; < King > < Kochhar > < De Haan > < Hunold > < Ernst > < Austin > 6 rows found. Command> CREATE TABLE emp AS SELECT last_name FROM employees WHERE employee_id BETWEEN 100 AND 105; 6 rows inserted. Command> SELECT * FROM emp; < King > < Kochhar > < De Haan > < Hunold > < Ernst > < Austin > 6 rows found.
AS
SelectQuery
を使用して、表totalsal
を作成します。salary
を合計して、結果をtotalsalary
に挿入します。SelectQuery
式の別名s
を定義します。
Command> CREATE TABLE totalsal AS SELECT SUM (salary) s FROM employees; 1 row inserted. Command> SELECT * FROM totalsal; < 691400 > 1 row found.
AS
SelectQuery
を使用して、commission_pct
列で定義された表を作成します。デフォルト値を.3に設定します。最初に、commission_pct
列がNUMBER (2,2)
型であることを示すためにemployees
表にDESCRIBEを実行します。c_pct
表のcommission_pct
列は、employees
表のcommission_pct
列からNUMBER (2,2)
型を継承します。
Command> DESCRIBE employees; Table SAMPLEUSER.EMPLOYEES: Columns: *EMPLOYEE_ID NUMBER (6) NOT NULL FIRST_NAME VARCHAR2 (20) INLINE LAST_NAME VARCHAR2 (25) INLINE NOT NULL EMAIL VARCHAR2 (25) INLINE UNIQUE NOT NULL PHONE_NUMBER VARCHAR2 (20) INLINE HIRE_DATE DATE NOT NULL JOB_ID VARCHAR2 (10) INLINE NOT NULL SALARY NUMBER (8,2) COMMISSION_PCT NUMBER (2,2) MANAGER_ID NUMBER (6) DEPARTMENT_ID NUMBER (4) 1 table found. (primary key columns are indicated with *) Command> CREATE TABLE c_pct (commission_pct DEFAULT .3) AS SELECT commission_pct FROM employees; 107 rows inserted. Command> DESCRIBE c_pct; Table SAMPLEUSER.C_PCT: Columns: COMMISSION_PCT NUMBER (2,2) DEFAULT .3 1 table found. (primary key columns are indicated with *)
次の例では、job_id
が圧縮されたemployees
表を作成します。
Command> CREATE TABLE EMPLOYEES (EMPLOYEE_ID NUMBER (6) PRIMARY KEY, FIRST_NAME VARCHAR2(20), LAST_NAME VARCHAR2(25) NOT NULL, EMAIL VARCHAR2(25) NOT NULL, PHONE_NUMBER VARCHAR2(20), HIRE_DATE DATE NOT NULL, JOB_ID VARCHAR2(10) NOT NULL, SALARY NUMBER (8,2), COMMISSION_PCT NUMBER (2,2), MANAGER_ID NUMBER(6), DEPARTMENT_ID NUMBER(4)) COMPRESS (JOB_ID BY DICTIONARY); Command> DESCRIBE EMPLOYEES; Table MYSCHEMA.EMPLOYEES: Columns: *EMPLOYEE_ID NUMBER (6) NOT NULL FIRST_NAME VARCHAR2 (20) INLINE LAST_NAME VARCHAR2 (25) INLINE NOT NULL EMAIL VARCHAR2 (25) INLINE NOT NULL PHONE_NUMBER VARCHAR2 (20) INLINE HIRE_DATE DATE NOT NULL JOB_ID VARCHAR2 (10) INLINE NOT NULL SALARY NUMBER (8,2) COMMISSION_PCT NUMBER (2,2) MANAGER_ID NUMBER (6) DEPARTMENT_ID NUMBER (4) COMPRESS ( JOB_ID BY DICTIONARY ) 1 table found. (primary key columns are indicated with *)
次の例では、ディクショナリ表に3つのサイズがあることを示します。エントリの最大数に指定した値は、次のサイズに丸められます。たとえば、役職IDの最大数として400を指定すると、最大で65535エントリのディクショナリ表が作成されます。デフォルトのサイズである232-1は、DESCRIBE
の出力に表示されません。
Command> CREATE TABLE employees (employee_id NUMBER(6) PRIMARY KEY, first_name VARCHAR2(20), last_name VARCHAR2(25), email VARCHAR2(25) NOT NULL, job_id VARCHAR2(10) NOT NULL, manager_id NUMBER(6), department_id NUMBER(4)) COMPRESS (last_name BY DICTIONARY MAXVALUES=70000, job_id BY DICTIONARY MAXVALUES=400, department_id BY DICTIONARY MAXVALUES=100); Command> DESCRIBE employees; Table MYSCHEMA.EMPLOYEES: Columns: *EMPLOYEE_ID NUMBER (6) NOT NULL FIRST_NAME VARCHAR2 (20) INLINE LAST_NAME VARCHAR2 (25) INLINE EMAILS VARCHAR2 (25) INLINE NOT NULL JOB_ID VARCHAR2 (10) INLINE NOT NULL MANAGER_ID NUMBER (6) DEPARTMENT_ID NUMBER (4) COMPRESS ( LAST_NAME BY DICTIONARY, JOB_ID BY DICTIONARY MAXVALUES=65535, DEPARTMENT_ID BY DICTIONARY MAXVALUES=255 ) 1 table found. (primary key columns are indicated with *)
CREATE USER
CREATE USER
文は、TimesTenデータベースでユーザーを作成します。
必要な権限
ADMIN
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
CREATE USER user IDENTIFIED BY {password | "password"} [PROFILE profile] [ACCOUNT {LOCK|UNLOCK}] [PASSWORD EXPIRE]
または
CREATE USER user IDENTIFIED EXTERNALLY [PROFILE profile] [ACCOUNT {LOCK|UNLOCK}]
パラメータ
パラメータ | 説明 |
---|---|
|
ユーザーの名前。 |
|
内部ユーザーの識別句。内部ユーザーのパスワードを指定する必要があります。 指定できるパスワードは、ユーザーに割り当てられたプロファイルによって異なります。具体的には、 |
|
外部ユーザー(オペレーティング・システム・ユーザー)を識別します。外部ユーザーとしてデータベース操作を実行するには、外部ユーザー名がオペレーティング・システムまたはネットワークで認証されたユーザー名と一致する必要があります。ユーザーはログイン時にオペレーティング・システムで認証されているため、TimesTenではパスワードが要求されません。 |
|
|
|
|
|
|
説明
-
データベース・ユーザーには、内部ユーザーまたは外部ユーザーを指定できます。
-
内部ユーザーは、TimesTenデータベース用に定義されるユーザーです。
-
外部ユーザーは、オペレーティング・システムで定義されています。外部ユーザーにTimesTenパスワードを割り当てることはできません。
-
- パスワードの要件:
- 30文字を超えることはできません。
- 大文字と小文字が区別されます。
- 先頭に文字を使用する必要があります。パスワードを二重引用符で囲まないかぎり、パスワードの先頭を数字または特殊文字にすることはできません。
- 特殊文字を使用する場合は、パスワードを二重引用符で囲む必要があります。例外は、
#
と@
の特殊文字です。#
または@
の特殊文字を含むパスワードは、二重引用符で囲む必要がありません。 - セミコロン(
;
)や二重引用符("
)を含めることはできません。
-
ユーザーを作成すると、ユーザーには
PUBLIC
に付与されている権限が付与され、その他の権限は付与されません。 -
PROFILE
句は、ユーザーにプロファイルを割り当てる場合に使用します。内部ユーザーにプロファイルを割り当てた場合、そのユーザーはプロファイルで指定された制限を超えることはできません。内部ユーザーにプロファイルを割り当てない場合は、そのユーザーにDEFAULT
プロファイルが割り当てられます。詳細は、「CREATE PROFILE」を参照してください。 -
ACCOUNT
LOCK
またはACCOUNT
UNLOCK
は、ユーザー・アカウントをロックまたはロック解除する場合に使用します。 -
PASSWORD
EXPIRE
句は、データベースに接続する前に、ユーザーのパスワードを期限切れにして、パスワードの変更を強制するために使用します。 -
接続がTLSで暗号化されている場合は、クライアント/サーバー接続でユーザーを作成できます。詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』のTimesTen Client/ServerのTransport Layer Securityに関する項を参照してください。
-
TimesTenでは、ユーザー
brad
はユーザー"brad"
と同じになります。いずれの場合も、ユーザーの名前はBRAD
と作成されます。 -
ユーザー名は、
TT_CHAR
データ型です。 -
この文はレプリケートされます。
例
ユーザーの作成およびパスワード検証の確認
この例では、user_pw1
ユーザーを作成しますが、user1_pw
ユーザーにはプロファイルを割り当てません。このユーザーは、DEFAULT
プロファイルの制限の対象になります。DEFAULT
プロファイルでは、PASSWORD_COMPLEXITY_CHECKER
パスワード・パラメータがNULL
に設定されています。そのため、このユーザーのパスワードにはパスワード検証が実行されません。その後で、DEFAULT
プロファイルを変更して、PASSWORD_COMPLEXITY_CHECKER
の値をTT_VERIFY_FUNCTION
に変更します。user1_p1
ユーザーは、それまでと同じように元のパスワードを使用してデータベースに接続できます。パスワード検証は、新しく作成したユーザーにのみ実行されます。
Command> CREATE USER user_pw1 IDENTIFIED BY user1_pw1;
User created.
dba_profiles
システム・ビューを問い合せることで、DEFAULT
プロファイルのパスワード・パラメータの制限を確認します。PASSWORD_COMPLEXITY_CHECKER
パスワード・パラメータの値は、NULL
になっています。Command> SELECT * FROM dba_profiles WHERE profile = 'DEFAULT';
< DEFAULT, FAILED_LOGIN_ATTEMPTS, PASSWORD, 10 >
< DEFAULT, PASSWORD_LIFE_TIME, PASSWORD, UNLIMITED >
< DEFAULT, PASSWORD_REUSE_TIME, PASSWORD, UNLIMITED >
< DEFAULT, PASSWORD_REUSE_MAX, PASSWORD, UNLIMITED >
< DEFAULT, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, NULL >
< DEFAULT, PASSWORD_LOCK_TIME, PASSWORD, .0034 >
< DEFAULT, PASSWORD_GRACE_TIME, PASSWORD, UNLIMITED >
< DEFAULT, TEMP_SPACE_PER_SESSION_MAX, MEMORY, UNLIMITED >
8 rows found.
DEFAULT
プロファイルを変更して、PASSWORD_COMPLEXITY_CHECKER
パラメータの値をTT_VERIFY_FUNCTION
に変更します。user_pw1
ユーザーとして、データベースに接続してみます。パスワード検証は新しく作成したパスワードにのみ実行されるため、接続は成功します。 Command> ALTER PROFILE "DEFAULT" LIMIT
PASSWORD_COMPLEXITY_CHECKER TT_VERIFY_FUNCTION;
Profile altered.
Command> connect adding "UID=user_pw1;PWD=user_pw1" as user1;
Connection successful: DSN=access1;UID=user_pw1;
DataStore=/scratch/user1/mydatabase1;DatabaseCharacterSet=AL32UTF8;
ConnectionCharacterSet=AL32UTF8;PermSize=128;
(Default setting AutoCommit=1)
user_pw2
ユーザーを作成して、パスワードにuser_pw2
を指定します。CREATE
USER
文は失敗します。user_pw2
のパスワードは新しく作成したパスワードであるため、パスワード検証が実行されます。TT_VERIFY_FUNCTION
関数の要件を満たしているパスワードを指定して、user_pw2
ユーザーを再度作成します。CREATE
USER
文は正常に実行され、ユーザーが作成されます。TT_VERIFY_FUNCTION
関数の詳細は、「TT_VERIFY_FUNCTION」を参照してください。Command> CREATE USER user_pw2 IDENTIFIED BY user_pw2;
15186: Password complexity check for the specified password failed
15188: TT-20002: Password contains the username
The command failed.
Command> CREATE USER user_pw2 IDENTIFIED BY abc75#n4;
User created.
TT_STRONG_VERIFY_FUNCTIONのパスワード要件があるユーザーの作成
TT_STRONG_VERIFY_FUNCTION
関数のパスワード検証要件について説明します。profile_pw3
プロファイルを作成して、PASSWORD_COMPLEXITY_CHECKER
パスワード・パラメータにTT_STRONG_VERIFY_FUNCTION
の値を指定します。user_pw3
ユーザーを作成して、このユーザーにprofile_pw3
プロファイルを割り当てます。異なるパスワードを試してみて、パスワードがTT_STRONG_VERIFY_FUNCTION
関数の要件を満たしていることを確認します。パスワードが要件を満たしている場合は、CREATE
USER
文が成功して、ユーザーが作成されます。TT_STRONG_VERIFY_FUNCTION
関数の詳細は、「TT_STRONG_VERIFY_FUNCTION」を参照してください。Command> CREATE PROFILE profile_pw3 LIMIT
PASSWORD_COMPLEXITY_CHECKER TT_STRONG_VERIFY_FUNCTION;
Profile created.
user_pw3
ユーザーを作成して、様々なパスワードを試してみます。特殊文字(#
と@
を除く)は、二重引用符で囲む必要があることに注意してください。Command> CREATE USER user_pw3 IDENTIFIED BY abcABC1#
PROFILE profile_pw3;
15186: Password complexity check for the specified password failed
15188: TT-20001: Password length less than 9
The command failed.
Command> CREATE USER user_pw3 IDENTIFIED BY abcABCD1#
PROFILE profile_pw3;
15186: Password complexity check for the specified password failed
15188: TT-20001: Password must contain at least 2 digit(s)
The command failed.
Command> CREATE USER user_pw3 IDENTIFIED BY abcABCD11#
PROFILE profile_pw3;
15186: Password complexity check for the specified password failed
15188: TT-20001: Password must contain at least 2 special character(s)
The command failed.
Command> CREATE USER user_pw3 IDENTIFIED BY "!abcABCD11#"
PROFILE profile_pw3;
User created.
プロファイルを割り当てるユーザーの作成
この例では、user1
ユーザーを作成して、そのユーザーにprofile1
プロファイルを割り当てます。
Command> CREATE USER user1 IDENTIFIED BY user1 PROFILE profile1; User created.
プロファイルを割り当てないユーザーの作成
この例では、user2
ユーザーを作成して、プロファイルを割り当てません。user2
ユーザーには、DEFAULT
プロファイルのパスワード・パラメータの値が割り当てられます。
Command> CREATE USER user2 identified by user2; User created.
dba_users
システム・ビューを問い合せて、user2
ユーザーにDEFAULT
プロファイルが割り当てられていることを確認します。
Command> SELECT profile FROM dba_users WHERE username='USER2'; < DEFAULT > 1 row found.
ユーザーの作成とユーザー・アカウントのロック
この例では、user3
ユーザーを作成して、user3
アカウントをロックします。user3
アカウントは、user3
ユーザーがデータベースに接続する前に、ADMIN
権限を持つユーザーがロック解除しておく必要があります。
Command> CREATE USER user3 IDENTIFIED BY user3 ACCOUNT LOCK; User created.
user3
にCONNECT
権限を付与します。
Command> GRANT CONNECT TO user3;
user3
として、データベースに接続してみます。user3
アカウントはロックされているため、接続に失敗します。
Command> connect adding "UID=user3;PWD=user3" as user3; 15179: the account is locked The command failed.
インスタンス管理者としてデータベースに再接続し、ALTER
USER
文を使用してuser3
アカウントのロックを解除します。
none: Command> use database1 database1: Command> ALTER USER user3 ACCOUNT UNLOCK; User altered.
データベースに、user3
ユーザーとして接続してみます。接続が成功します。
database1: Command> connect adding "UID=user3;PWD=user3" as user3; Connection successful: DSN=database1;UID=user3;DataStore=/scratch/database1; DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=AL32UTF8;PermSize=128; (Default setting AutoCommit=1)
ユーザー・アカウントのロックとパスワードの変更の強制
この例では、user4
ユーザーを作成します。user4
ユーザーには、profile1
プロファイルを割り当てます。user4
アカウントをロックして、user4
ユーザーがデータベースに接続する前にuser4
のパスワードの変更が必要になるようにします。
Command> CREATE USER user4 identified by user4 PROFILE profile1 ACCOUNT LOCK PASSWORD EXPIRE; User created.
user4
として、データベースに接続してみます。user4
アカウントをロックして、user4
ユーザーがデータベースに接続する前にパスワードの変更が必要になるようにします。
Command> connect adding "UID=user4;PWD=user4" as user4; 15179: the account is locked The command failed.
インスタンス管理者としてデータベースに再接続し、ALTER
USER
文を使用してuser4
アカウントのロックを解除します。
none: Command> use database1 database1: Command> ALTER USER user4 ACCOUNT UNLOCK; User altered.
user4
にCONNECT
権限を付与します。その次に、user4
の期限切れのパスワードを変更します。(この例では、パスワードを太字で示したuser4_changed
に変更します)。
database1: Command> GRANT CONNECT TO user4; database1: Command> ALTER USER user4 IDENTIFIED BY user4_changed; User altered.
user4
ユーザーとして、データベースに接続してみます。接続が成功します。アカウントのロックが解除され、パスワードが変更されています。
database1: Command> connect adding "UID=user4;PWD=user4_changed" as user4; Connection successful: DSN=database1;UID=user4;DataStore=/scratch/database1; DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=AL32UTF8;PermSize=128; (Default setting AutoCommit=1)
外部ユーザーの作成
この例では、外部ユーザーとしてuser5
ユーザーを作成します。
Command> CREATE USER user5 IDENTIFIED EXTERNALLY; User created.
CREATE VIEW
CREATE VIEW
文は、SelectQuery
句で指定された表に対するビューを作成します。ビューとは、1つ以上のディテール表に基づいた論理表のことです。ビュー自体にデータは含まれていません。ビューは、ディテール表からすでに計算されたデータを含むマテリアライズド・ビューと区別するために、非マテリアライズド・ビューと呼ばれることがあります。
アクティブ・スタンバイ・ペアのレプリケートされた環境で、DDL_REPLICATION_LEVEL
が3以上の場合にアクティブ・データベースでCREATE VIEW
を実行すると、ビューはレプリケーション・スキームのすべてのデータベースにレプリケートされます。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のアクティブ・スタンバイ・ペアでのDDL変更に関する項を参照してください。
必要な権限
文を実行するユーザーには、CREATE VIEW
権限(所有者の場合)または別のユーザーのビューの場合はCREATE ANY VIEW
(非所有者の場合)が必要です。
ビューの所有者には、ディテール表に対するSELECT
権限が必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
CREATE VIEW [Owner.]ViewName
ASSelectQuery
パラメータ
パラメータ | 説明 |
---|---|
|
ビューの名前 |
|
ビューで使用される、ディテール表の列を選択します。 ビューに対して索引を作成することもできます。 |
SELECT問合せの制限
ビューの定義に使用される問合せには、いくつかの制限があります。
-
ビュー定義の
SELECT *
問合せは、ビューの作成時に実行されます。ビューが作成された後に追加された列は、ビューに反映されません。 -
次のものはビューの作成に使用する
SELECT
文で使用しないでください。-
FIRST
-
ORDER BY
使用した場合は、
CREATE VIEW
で無視されます。結果はソートされません。 -
引数
-
-
SELECT構文のリストの各式には、一意の名前が必要です。列の別名が定義されていないかぎり、単純にその列の名前が使用されます。
ROWID
は式とみなされるため、別名が必要です。 -
ビューを作成する場合に
SELECT FOR UPDATE
を使用しないでください。 -
特定のTimesTen問合せ制限は、非マテリアライズド・ビューの作成時に確認されません。これらの制限に違反しているビューの作成が可能な場合がありますが、その後、実行した文でこのビューが参照されると、エラーが戻されます。
-
ビューが
SELECT
文のFROM
句で参照されると、ビューの名前は、その定義によって解析時に導出表に置き換えられます。ビューのすべての句を元のSELECT問合せの同じ句にマージして、導出表なしでサポートされている問合せを形成できない場合、この導出表の内容が実体化されます。たとえば、ビューと参照元のSELECTで集計が指定されている場合は、その結果が選択の他の表に結合される前に、ビューがマテリアライズされます。 -
ビューを削除するには、
DROP VIEW
文を使用します。 -
ビューの変更に
ALTER TABLE
文を使用することはできません。 -
ビューの参照は、ディテール表が削除または変更されているために失敗することがあります。
例
employees
表から非マテリアライズド・ビューを作成します。
Command> CREATE VIEW v1 AS SELECT employee_id, email FROM employees; Command> SELECT FIRST 5 * FROM v1; < 100, SKING > < 101, NKOCHHAR > < 102, LDEHAAN > < 103, AHUNOLD > < 104, BERNST > 5 rows found.
表t1
の集計問合せから、列max1
を持つ非マテリアライズド・ビューtview
を作成します。
CREATE VIEW tview (max1) AS SELECT MAX(x1) FROM t1;
DELETE
DELETE
文は、表から行を削除します。
必要な権限
表の所有者に必要な権限はありません。
別のユーザーの表の場合は表に対するDELETE
が必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
DELETE [hint] [FIRST NumRows] FROM [Owner.]TableName [CorrelationName] [WHERE SearchCondition] [RETURNING|RETURN Expression[,...]INTO DataItem[,...]]
パラメータ
パラメータ | 説明 |
---|---|
|
|
|
削除する行の数を指定します。 |
|
検索条件を満たす行を削除する表を指定します。
|
|
削除する行を指定します。検索条件に一致する行がない場合、表は変更されません。 |
|
有効な式の構文。詳細は、「式」を参照してください。 |
|
取得した |
説明
-
表の行をすべて削除した場合、表は空になりますが、
DROP TABLE
文を実行しないかぎり、表自体は削除されません。 -
表にアウトライン列があり、削除する数百万の行がある場合、
ttCompact
組込みプロシージャを呼び出してメモリーを解放することを検討してください。 -
外部キー制約に違反する
DELETE
処理はエラーになります。外部キー制約の詳細は、「CREATE TABLE」を参照してください。 -
DELETE
文によって報告される行の総数には、ON DELETE CASCADE
アクションの結果、子表から削除された行は含まれません。 -
子表の外部キー制約で
ON DELETE CASCADE
を指定している場合、ユーザーは、子表のDELETE
権限を明示的に必要とせずに、DELETE
権限を持つ親表から行を削除できます。 -
RETURNING
句の制限:-
各
Expression
は単純な式である必要があります。集計関数はサポートされません。 -
順序番号は
OUT
パラメータに戻せません。 -
ROWNUM
および副問合せは、RETURNING
句では使用できません。 -
RETURNING
句のパラメータは、DELETE
文のいずれの場所とも重複できません。 -
RETURNING
句を使用して複数行を戻すには、PL/SQLBULK COLLECT
機能が必要です。BULK COLLECT
の詳細は、『Oracle TimesTen In-Memory Database PL/SQL開発者ガイド』のFORALLおよびBULK COLLECT操作に関する項を参照してください。 -
PL/SQLでは、
RETURNING
句はWHERE CURRENT
処理と一緒には使用できません。
-
例
発注件数が50未満の行をすべて削除します。
DELETE FROM purchasing.orderitems WHERE quantity < 50;
id
が主キーでない場合、次の問合せはすべての重複する注文を削除します。
DELETE FROM orders a WHERE EXISTS (SELECT 1 FROM orders b WHERE a.id = b.id and a.rowid < b.rowid);
次の順序で文を指定すると、外部キー違反が発生します。
CREATE TABLE master (name CHAR(30), id CHAR(4) NOT NULL PRIMARY KEY); CREATE TABLE details (masterid CHAR(4),description VARCHAR(200), FOREIGN KEY (masterid) REFERENCES master(id)); INSERT INTO master('Elephant', '0001'); INSERT INTO details('0001', 'A VERY BIG ANIMAL'); DELETE FROM master WHERE id = '0001';
ビジーな表を削除しようとするとエラーが発生します。この例では、t1
はビジーな表であり、親表とそれに基づく外部キー制約となっています。
CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL, PRIMARY KEY (a)); CREATE TABLE t2 (c INT NOT NULL, FOREIGN KEY (c) REFERENCES t1(a)); INSERT INTO t1 VALUES (1,1); INSERT INTO t2 VALUES (1); DELETE FROM t1;
次のエラーが返されます。
SQL ERROR (3001): Foreign key violation [TTFOREIGN_0] a row in child table T2 has a parent in the delete range.
employees
から従業員を削除します。empid
およびname
をemployee_id
およびlast_name
と同じデータ型の変数として宣言します。行を削除し、employee_id
およびlast_name
を変数内に戻します。正しい行が削除されたことを確認します。
Command> VARIABLE empid NUMBER(6) NOT NULL; Command> VARIABLE name VARCHAR2(25) INLINE NOT NULL; Command> DELETE FROM employees WHERE last_name='Ernst' RETURNING employee_id, last_name INTO :empid,:name; 1 row deleted. Command> PRINT empid name; EMPID : 104 NAME : Ernst
DROPACTIVE STANDBY PAIR
この文は、TimesTen Scaleoutではサポートされていません。
TimesTen Classicの場合:
この文は、アクティブ・スタンバイ・ペア・レプリケーション・スキームを削除します。
必要な権限
ADMIN
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutではサポートされていません。
SQL構文
DROP ACTIVE STANDBY PAIR
パラメータ
DROP ACTIVE STANDBY PAIR
に、パラメータはありません。
説明
アクティブ・スタンバイ・ペアは削除されますが、表、キャッシュ・グループ、マテリアライズド・ビューなどのすべてのオブジェクトは、文が発行されたデータベースにまだ存在しています。
TimesTenでOracle Clusterwareを使用する場合は、DROP ACTIVE STANDBY PAIR
文は実行できません。
DROP CACHE GROUP
この文はTimesTen Scaleoutでサポートされています。
TimesTen Classicの場合:
DROP CACHE GROUP
文は、キャッシュ・グループに関連付けられている表を削除して、CACHE_GROUP
システム表からキャッシュ・グループの定義を削除します。
必要な権限
キャッシュ・グループの所有者に必要な権限はありません。
キャッシュ・グループの所有者でない場合は、DROP ANY CACHE GROUP
、
キャッシュ・グループの少なくとも1つの表が現在のユーザーによって所有されていない場合は、DROP ANY TABLE
が必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutではサポートされていません。
SQL構文
DROP CACHE GROUP [Owner.]GroupName
パラメータ
パラメータ | 説明 |
---|---|
|
削除されるキャッシュ・グループの名前です。 |
説明
-
使用中のキャッシュ・グループ表を削除しようとすると、エラーが返されます。
-
ASYNCHRONOUS WRITETHROUGHキャッシュ・グループは、レプリケーション・エージェントの実行中には削除できません。
-
読取り専用キャッシュ・グループおよび
AUTOREFRESH
属性を持つキャッシュ・グループに対して自動的にインストールされるOracle Databaseオブジェクトは、キャッシュ・エージェントによってアンインストールされます。DROP CACHE GROUP
操作時にキャッシュ・エージェントが実行中でない場合、Oracle Databaseオブジェクトは、キャッシュ・エージェントの次の起動時にアンインストールされます。 -
DROP CACHE GROUP
文はシリアライズ可能分離レベルでは実行できません。実行しようとするとエラー・メッセージが返されます。 -
DROP CACHE GROUP
文を実行し、現在実行中の自動リフレッシュ操作がある場合、次のような結果になります。-
LockWait
の間隔が0の場合、DROP CACHE GROUP
文はロックのタイムアウト・エラーで失敗します。 -
LockWait
の間隔が0以外の場合、現在のトランザクションは自動リフレッシュされず(ロールバックされ)、DROP
文の処理が続行されます。これは、同じ自動リフレッシュ間隔を持つすべてのキャッシュ・グループに影響します。
-
例
DROP CACHE GROUP westerncustomers;
DROP FUNCTION
DROP FUNCTION
文は、データベースからスタンドアロンのストアド・ファンクションを削除します。この文を使用してパッケージに含まれるファンクションを削除しないでください。
必要な権限
ファンクションの所有者に必要な権限はありません。
別のユーザーのファンクションの場合はDROP ANY PROCEDURE
が必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
DROP FUNCTION [Owner.]FunctionName
パラメータ
パラメータ | 説明 |
---|---|
|
削除するファンクションの名前です。 |
説明
-
ファンクションを削除すると、削除されたファンクションに依存するオブジェクトは無効になります。その後、それらのいずれかのオブジェクトを参照すると、TimesTenではオブジェクトの再コンパイルが試行され、削除したファンクションを再作成していない場合、エラー・メッセージが返されます。
-
この文を使用してパッケージに含まれるファンクションを削除しないでください。パッケージを削除するか、または
OR REPLACE
句を含むCREATE PACKAGE
文を使用して、ファンクションを含まないパッケージを再定義します。 -
DROP FUNCTION
文を使用するには、データベースでPL/SQLを有効にしておく必要があります。データベースでPL/SQLを有効にしていない場合、エラーがスローされます。
例
次の文は、ファンクションmyfunc
を削除し、myfunc
に依存するすべてのオブジェクトを無効にします。
Command> DROP FUNCTION myfunc; Function dropped.
データベースでPL/SQLが無効になっている場合、TimesTenによって次のエラーが返されます。
Command> DROP FUNCTION myfunc; 8501: PL/SQL feature not installed in this TimesTen database The command failed.
関連項目
DROP INDEX
DROP
INDEX
文は、指定した索引を削除します。索引はグローバル(TimesTen Scaleout)またはローカル(TimesTen ScaleoutまたはTimesTen Classic)を指定できます。
必要な権限
索引の所有者に必要な権限はありません。別のユーザーが所有する索引の場合には、DROP
ANY
INDEX
が必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。DROP
INDEX
文は、グローバル索引とローカル索引の両方を削除するために使用します。
SQL構文
DROP INDEX [Owner.]IndexName [FROM [Owner.]TableName]
パラメータ
パラメータ | 説明 |
---|---|
|
削除する索引の名前です。その索引に対応する表の所有者名を指定できます。TimesTen Scaleoutの場合、索引はグローバルまたはローカルを指定できます。 |
|
索引を作成した表の名前です。 |
説明
-
ビジーな索引(使用中の索引、または外部キーを適用する索引)を削除しようとすると、エラーが発生します。外部キーを削除して、関連付けられた索引を削除するには、
ALTER TABLE
文を使用します。 -
索引が
UNIQUE
列の制約で作成された場合は、その索引は制約を削除することでのみ削除できます。そのためには、ALTER TABLE
DROP UNIQUE
文を使用します。UNIQUE
列の制約の詳細は、「CREATE TABLE」も参照してください。 -
コミットされていないトランザクションでの
DROP INDEX
操作がアクティブな(またはアクティブだった)場合、その索引にアクセスしないDML操作を実行している他のトランザクションはブロックされます。 -
索引を削除した場合、その索引を使用する準備された文は、次にその文を実行する際に自動的に再準備されます。
-
表名を指定しない場合、指定した所有者または暗黙的な所有者の索引名は一意である必要があります。
-
索引の所有者を指定せずに表を指定した場合、表の所有者がデフォルトの所有者となります。
-
表が指定されており、表の所有者が指定されていない場合は、現在のユーザーがデフォルトの表の所有者になります。
-
表と索引の所有者は、同じである必要があります。
-
他の接続が所有する空でないインスタンスが一時表にある場合、別の接続によって一時表から索引を削除することはできません。
-
索引がアクティブ・スタンバイ・ペア間でレプリケートされるときに、
DDL_REPLICATION_LEVEL
が2以上の場合は、DROP INDEX
文を使用して、レプリケーション・スキームのアクティブ・スタンバイ・ペアから索引を削除します。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のアクティブ・スタンバイ・ペアでのDDL変更に関する項を参照してください。
例
次のいずれかの文を使用して、orderitems
表で定義した索引partsorderedindex
を削除します。
DROP INDEX partsorderedindex FROM purchasing.orderitems;
または
DROP INDEX purchasing.partsorderedindex;
関連項目
DROP MATERIALIZED VIEW
DROP MATERIALIZED VIEW
文は、指定されたマテリアライズド・ビューを、それに関連付けられたハッシュ索引および範囲索引とともに削除します。
必要な権限
ビューの所有者であるか、またはDROP ANY MATERIALIZED VIEW
(非所有者の場合)および
表の所有者であるか、またはDROP ANY TABLE
(非所有者の場合)および
ビューに索引がある場合は、索引の所有者であるか、またはDROP ANY INDEX
(非所有者の場合)。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
DROP MATERIALIZED VIEW [Owner.]ViewName
パラメータ
パラメータ | 説明 |
---|---|
|
削除するマテリアライズド・ビューを指定します。 |
説明
DROP MATERIALIZED VIEW
操作を実行すると、ディテール表が更新されてロックされます。ディテール表がすでに別のトランザクションによってロックされている場合は、エラーが発生することがあります。
例
次の文では、custorder
マテリアライズド・ビューが削除されます。
DROP MATERIALIZED VIEW custorder;
DROP PACKAGE [BODY]
DROP PACKAGE
文は、データベースからストアド・パッケージを削除します。仕様と本体の両方を削除します。DROP PACKAGE BODY
は、パッケージの本体のみを削除します。
必要な権限
パッケージの所有者に必要な権限はありません。
別のユーザーのパッケージの場合はDROP ANY PROCEDURE
が必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
DROP PACKAGE [BODY] [Owner.]PackageName
パラメータ
パラメータ | 説明 |
---|---|
|
|
|
削除するパッケージの名前です。 |
説明
-
パッケージの本体のみを削除した場合、依存するオブジェクトは無効になりません。ただし、パッケージ仕様で宣言されたいずれかのプロシージャまたはストアド・ファンクションは、パッケージ本体を再作成するまで実行できません。
-
パッケージ仕様に依存するオブジェクトはすべて無効になります。その後、それらのいずれかのオブジェクトを参照すると、TimesTenではオブジェクトの再コンパイルが試行され、削除したパッケージを再作成していない場合、エラーが戻されます。
-
この文を使用してパッケージから単一のオブジェクトを削除しないでください。かわりに、
OR REPLACE
句を含むCREATE PACKAGE
文およびCREATE PACKAGE BODY
文を使用して、オブジェクトを含まないパッケージを再作成します。 -
DROP PACKAGE [BODY]
文を使用するには、データベースでPL/SQLを有効にしておく必要があります。データベースでPL/SQLを有効にしていない場合、エラーが返されます。
例
次の文は、パッケージsamplePackage
の本体を削除します。
Command> DROP PACKAGE BODY SamplePackage; Package body dropped.
パッケージsamplePackage
の仕様と本体の両方を削除するには、次の文を使用します。
Command> DROP PACKAGE samplepackage; Package dropped.
関連項目
DROP PROCEDURE
DROP PROCEDURE
文は、データベースからスタンドアロンのストアド・プロシージャを削除します。この文を使用してパッケージに含まれるプロシージャを削除しないでください。
必要な権限
プロシージャの所有者に必要な権限はありません。
別のユーザーのプロシージャの場合はDROP ANY PROCEDURE
が必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
DROP PROCEDURE [Owner.]ProcedureName
パラメータ
パラメータ | 説明 |
---|---|
|
削除するプロシージャの名前です。 |
説明
-
プロシージャを削除すると、削除されたプロシージャに依存するオブジェクトは無効になります。その後、それらのいずれかのオブジェクトを参照すると、TimesTenではオブジェクトの再コンパイルが試行され、削除したプロシージャを再作成していない場合、エラー・メッセージが返されます。
-
この文を使用してパッケージに含まれるプロシージャを削除しないでください。パッケージを削除するか、または
OR REPLACE
句を含むCREATE PACKAGE
文を使用して、プロシージャを含まないパッケージを再定義します。 -
DROP PROCEDURE
文を使用するには、データベースでPL/SQLを有効にしておく必要があります。データベースでPL/SQLを有効にしていない場合、エラーがスローされます。
例
次の文は、プロシージャmyproc
を削除し、myproc
に依存するすべてのオブジェクトを無効にします。
Command> DROP PROCEDURE myproc; Procedure dropped.
データベースでPL/SQLが無効になっている場合、TimesTenによって次のエラーが返されます。
Command> DROP PROCEDURE myproc; 8501: PL/SQL feature not installed in this TimesTen databaseThe command failed.
関連項目
DROP PROFILE
DROP
PROFILE
文では、データベースからユーザーを削除します。
必要な権限
ADMIN
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
DROP PROFILE profile [CASCADE]
パラメータ
パラメータ | 説明 |
---|---|
|
削除するプロファイルの名前です。 |
|
|
説明
-
この文は、既存のプロファイルを削除する場合に使用します。
DEFAULT
プロファイルは削除できません。DEFAULT
プロファイルの詳細は、「CREATE PROFILE」を参照してください。 -
現在ユーザーに割り当てられていないプロファイルを作成する場合は、プロファイルを削除するための
CASCADE
を指定する必要はありません。ただし、プロファイルが現在ユーザーに割り当てられている場合は、CASCADE
を指定して、そのプロファイルを削除する必要があります。
例
この例では、test_profile
プロファイルとtest_profile_assign_to_user
プロファイルを作成します。その後、test_user
ユーザーを作成して、そのユーザーにtest_profile_assign_to_user
プロファイルを割り当てます。この例では、test_profile
プロファイルを削除してみます。このプロファイルにはユーザーが割り当てられていないため、操作は成功します。その次に、test_profile_assign_to_user
プロファイル削除してみます。CASCADE
が指定されている場合、操作は成功します。test_profile_assign_to_user
プロファイルが削除されると、test_user
ユーザーにはDEFAULT
プロファイルが割り当てられます。
-
test_profile
プロファイルを作成します。FAILED_LOGIN_ATTEMPTS
に5
の値に設定します。Command> CREATE PROFILE test_profile LIMIT FAILED_LOGIN_ATTEMPTS 5; Profile created.
-
test_profile_assign_to_user
プロファイルを作成します。FAILED_LOGIN_ATTEMPTS
に3
の値に設定します。Command> CREATE PROFILE test_profile_assign_to_user LIMIT FAILED_LOGIN_ATTEMPTS 3; Profile created.
-
test_user
ユーザーを作成して、このユーザーにtest_profile_assign_to_user
プロファイルを割り当てます。Command> CREATE USER test_user identified by test_user_pwd PROFILE test_profile_assign_to_user; User created.
-
test_profile
プロファイルを削除します。DROP
PROFILE
操作は成功します。このtest_profile
プロファイルが割り当てられたユーザーは存在しません。Command> DROP PROFILE test_profile; Profile dropped.
-
test_profile_assign_to_user
プロファイル削除してみます。DROP
PROFILE
操作は失敗します。このプロファイルが割り当てられているユーザーが存在します。DROP
PROFILE
操作を再度繰り返しますが、今回はCASCADE
を指定します。DROP
PROFILE
操作は成功します。Command> DROP PROFILE test_profile_assign_to_user; 15178: Profile TEST_PROFILE_ASSIGN_TO_USER has users assigned, cannot drop without CASCADE The command failed. Command> DROP PROFILE test_profile_assign_to_user CASCADE; Profile dropped.
-
DBA_USERS
システム・ビューを問い合せて、test_user
ユーザーにDEFAULT
プロファイルが割り当てられていることを確認します。Command> SELECT profile FROM dba_users WHERE username = 'TEST_USER'; PROFILE < DEFAULT > 1 row found.
DROP REPLICATION
この文は、TimesTen Scaleoutではサポートされていません。
TimesTen Classicの場合:
DROP REPLICATION
文は、クラシック・レプリケーション・スキームを破棄して、実行中のデータベースから削除します。
必要な権限
ADMIN
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutではサポートされていません。
SQL構文
DROP REPLICATION [Owner.]ReplicationSchemeName
パラメータ
パラメータ | 説明 |
---|---|
|
クラシック・レプリケーション・スキームに割り当てる名前です。 |
説明
データベースの最新のレプリケーション・スキームを削除しても、レプリケートされた表は削除されません。これらの表は、レプリケーション・スキームの定義の有無にかかわらず、データベース内に継続して保持されます。
例
次の文は、実行中のデータベースからクラシック・レプリケーション・スキームr
の情報を削除します。
DROP REPLICATION r;
DROP SEQUENCE
DROP SEQUENCE
文は、既存の順序番号ジェネレータを削除します。
順序がアクティブ・スタンバイ・ペア間でレプリケートされる場合で、DDL_REPLICATION_LEVEL
が3以上の場合は、DROP SEQUENCE
文によって、レプリケーション・スキームのすべてのデータベースのアクティブ・スタンバイ・ペアから順序を削除します。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のアクティブ・スタンバイ・ペアでのDDL変更に関する項を参照してください。
必要な権限
順序の所有者に必要な権限はありません。
別のユーザーの順序の場合はDROP ANY SEQUENCE
が必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
DROP SEQUENCE [Owner.]SequenceName
パラメータ
パラメータ | 説明 |
---|---|
|
順序番号ジェネレータの名前です。 |
説明
-
順序は、使用中でも削除できます。
-
TimesTen Scaleoutを使用している場合、
ALTER
SEQUENCE
文でバッチ値を変更できます。それ以外の場合、順序を変更するには、DROP SEQUENCE
文を使用してから、同じ名前の順序を新規作成します。たとえば、MINVALUE
を変更する場合、順序を削除し、同じ名前で必要なMINVALUE
を持つ順序を再度作成します。 -
順序がレプリケーション・スキームに含まれている場合は、
ALTER REPLICATION
文を使用してレプリケーション・スキームから順序を削除します。次にDROP SEQUENCE
文を使用して順序を削除します。
例
次の文は、mysequence
を削除します。
DROP SEQUENCE mysequence;
関連項目
DROP SYNONYM
DROP SYNONYM
文は、データベースからシノニムを削除します。
シノニムがアクティブ・スタンバイ・ペア間でレプリケートされる場合で、DDL_REPLICATION_LEVEL
が2以上の場合は、DROP SYNONYM
文によって、レプリケーション・スキームのすべてのデータベースのアクティブ・スタンバイ・ペアからシノニムを削除します。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のアクティブ・スタンバイ・ペアでのDDL変更に関する項を参照してください。
必要な権限
プライベート・シノニムをその所有者が削除する場合は、必要な権限はありません。別のユーザーのプライベート・シノニムを削除するには、DROP ANY SYNONYM
権限が必要です。
PUBLIC
シノニムを削除するには、DROP PUBLIC SYNONYM
権限が必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
プライベート・シノニムを削除するには、次の構文を使用します。
DROP SYNONYM [Owner.]SynonymName
パブリック・シノニムを削除するには、次の構文を使用します。
DROP PUBLIC SYNONYM SynonymName
パラメータ
パラメータ | 説明 |
---|---|
|
|
|
オプションで、プライベート・シノニムの所有者を指定します。所有者を省略する場合、プライベート・シノニムは現在のユーザーのスキーマに存在している必要があります。 |
|
削除するシノニムの名前を指定します。 |
例
パブリック・シノニムpubemp
を削除します。
DROP PUBLIC SYNONYM pubemp; Synonym dropped.
プライベート・シノニムsynjobs
を削除します。
DROP SYNONYM synjobs; Synonym dropped.
DROP ANY SYNONYM
権限を持つユーザーterry
として、ttuser
が所有するプライベート・シノニムsyntab
を削除します。
DROP SYNONYM ttuser.syntab; Synonym dropped.
関連項目
DROP TABLE
DROP TABLE
文は、指定した表を、それに関連付けられたハッシュ索引および範囲索引とともに削除します。
必要な権限
表の所有者に必要な権限はありません。
別のユーザーの表の場合はDROP ANY TABLE
が必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
DROP TABLE [Owner.]TableName
パラメータ
パラメータ | 説明 |
---|---|
|
削除する表を指定します。 |
説明
-
使用中の表を削除しようとすると、エラーが発生します。
-
コミットされていないトランザクションでの
DROP TABLE
がアクティブな場合(またはアクティブだった場合)、その表にアクセスしないDML操作を実行する他のトランザクションを続行できます。 -
表がレプリケートされた表である場合、次のいずれかを実行できます。
-
DROP TABLE
文を発行する前に、DROP REPLICATION
文を使用してレプリケーション・スキームを削除します。 -
DDL_REPLICATION_LEVEL
が2以上の場合は、DROP TABLE
文によって、レプリケーション・スキームのすべてのデータベースのアクティブ・スタンバイ・ペアから表を削除します。DDL_REPLICATION_LEVEL
が1の場合は、レプリケーション・エージェントを停止し、ALTER ACTIVE STANDBY PAIR ... EXCLUDE TABLE
文を使用してレプリケーション・スキームから表を除外します。次にDROP TABLE
文を使用して表を削除します。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のアクティブ・スタンバイ・ペアでのDDL変更に関する項を参照してください。
-
-
他の接続が所有する空でないインスタンスが一時表にある場合、別の接続によって一時表を削除することはできません。
例
CREATE TABLE vendorperf (ordernumber INTEGER, delivday TT_SMALLINT, delivmonth TT_SMALLINT, delivyear TT_SMALLINT, delivqty TT_SMALLINT, remarks VARCHAR2(60)); CREATE UNIQUE INDEX vendorperfindex ON vendorperf (ordernumber);
次の文は、表および索引を削除します。
DROP TABLE vendorperf;
DROP USER
DROP USER
文は、データベースからユーザーを削除します。
必要な権限
ADMIN
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
DROP USER user
パラメータ
パラメータ | 説明 |
---|---|
|
データベースから削除されるユーザーの名前。 |
説明
ユーザーを削除するには、次の前提条件があります。
-
ユーザーがデータベースに内部的または外部的に存在している必要があります。
-
ユーザーが所有するオブジェクトを削除する必要があります。
-
レプリケーションが構成されている場合、この文はレプリケートされます。
例
データベースからユーザーterry
を削除します。
DROP USER terry; User dropped.
関連項目
DROP VIEW
DROP VIEW
文は、指定したビューを削除します。
ビューがアクティブ・スタンバイ・ペア間でレプリケートされる場合で、DDL_REPLICATION_LEVEL
が3以上の場合は、DROP VIEW
文によって、レプリケーション・スキームのすべてのデータベースのアクティブ・スタンバイ・ペアからビューを削除します。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のアクティブ・スタンバイ・ペアでのDDL変更に関する項を参照してください。
必要な権限
ビューの所有者であるか、またはDROP ANY VIEW
(非所有者の場合)
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
DROP VIEW [Owner.]ViewName
パラメータ
パラメータ | 説明 |
---|---|
|
削除するビューを指定します。 |
例
次の文では、custorder
ビューが削除されます。
DROP VIEW custorder;
関連項目
FLUSH CACHE GROUP
この文は、TimesTen Scaleoutではサポートされていません。
TimesTen Classicの場合:
FLUSH CACHE GROUP
文は、TimesTenキャッシュ表のデータをOracle Database表にフラッシュします。この文は、ユーザー管理キャッシュ・グループでのみ使用できます。
この操作には、WHERE
句を受け入れる操作およびWITH ID
句を受け入れる操作の2つのタイプがあります。
FLUSH CACHE GROUP
は、コミットの伝播(TimesTenからOracle Databaseへ)がオフになっているときに使用します。コミットのすべてのトランザクションを伝播するのではなく、変更をOracle Databaseに伝播する前に多数のトランザクションをコミットできます。Oracle Databaseにキャッシュ・インスタンスが存在する場合は、キャッシュ・インスタンスIDごとに更新操作が実行されます。Oracle Databaseにキャッシュ・インスタンスが存在しない場合は、TimesTenによって挿入されます。
この機能は、注文がマスターOracle Database表にコミットされる前に、高速キャッシュとしてTimesTenを使用する、カートへの変更が頻繁に行われるショッピング・カート・アプリケーションなどで役立ちます。
ノート:
通常、WHERE
句を使用するより、WITH ID
句を使用した方が高いシステム・パフォーマンスが得られます。
挿入と更新のみがフラッシュされます。挿入は、Oracle Database表にレコードが存在しない場合は挿入として、または(レコードがすでに存在する場合は)更新として伝播されます。削除をフラッシュすることはできません。つまり、TimesTenでレコードが削除された場合に、その削除をOracle Database表にフラッシュする方法はありません。削除は、手動で、またはコミット伝播をオンにすることで伝播する必要があります。削除されたレコードをフラッシュしようとすると、暗黙的に無視されます。エラーや警告は発行されません。READ ONLY
またはPROPAGATE
として指定されている表のレコードをOracle Database表にフラッシュすることはできません。
必要な権限
キャッシュ・グループの所有者に必要な権限はありません。
別のユーザーのキャッシュ・グループの場合はFLUSH
またはFLUSH ANY CACHE GROUP
が必要です。
基礎となる表に対するINSERT
権限、DELETE
権限、UPDATE
権限。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutではサポートされていません。
SQL構文
FLUSH CACHE GROUP [Owner.]GroupName [WHERE ConditionalExpression]
または
FLUSH CACHE GROUP [Owner.]GroupName WITH ID (ColumnValueList)
パラメータ
パラメータ | 説明 |
---|---|
|
フラッシュされるキャッシュ・グループの名前。 |
|
|
|
|
説明
-
通常、
WHERE
句は、単一またはすべてのキャッシュ・インスタンスを対象に使用するものではなく、キャッシュ・インスタンスのセットに対して使用します。フラッシュ操作にWHERE
句を使用して、Oracle Databaseに送信するキャッシュ・インスタンスを決定します。 -
一般的には、
FLUSH CACHE GROUP
文のWHERE
句の列名を完全に修飾する必要はありません。ただし、同一キャッシュ・グループ内の複数の表を結合する問合せがTimesTenによって自動的に生成されるため、キャッシュ・グループ内に同じ名前の列を持つ表が複数ある場合は、列を完全に修飾する必要があります。所有者名を指定しない場合、キャッシュ・グループのWHERE
句によって参照されるすべての表は、キャッシュ・グループ操作を実行している現在のログイン名が所有しています。 -
WHERE
句を省略した場合、キャッシュ・グループの内容全体がOracle Database表にフラッシュされます。WHERE
句を指定した場合、ルート表のみを含めることができます。 -
FLUSH CACHE GROUP
文の実行後、ODBC関数SQLRowCount()
、JDBCメソッドgetUpdateCount()
、およびOCI_ATTR_ROW_COUNT
引数を指定したOCI関数OCIAttrGet()
によって、フラッシュされたキャッシュ・インスタンスの数が返されます。 -
WITH ID
句を使用して、バインディング・パラメータを指定します。
制限
次をフラッシュするときには、WITH ID
句を使用しないでください。
-
AUTOREFRESH
属性を持つ静的ユーザー管理キャッシュ・グループ -
AWTまたはSWTキャッシュ・グループ
例
FLUSH CACHE GROUP marketbasket; FLUSH CACHE GROUP marketbasket WITH ID(10);
関連項目
GRANT
GRANT
文は、1つ以上の権限をユーザーに割り当てます。
必要な権限
システム権限を付与するには、ADMIN
が必要です。
オブジェクト権限を付与するには、ADMIN
が必要であるか、オブジェクト所有者である必要があります。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
GRANT {SystemPrivilege [,...] | ALL [PRIVILEGES]} [...] TO {user |PUBLIC} [,...]
または
GRANT {{ObjectPrivilege [,...] | ALL [PRIVILEGES]} ON {[Owner.]object}[,...]} TO {user | PUBLIC} [,...]
パラメータ
システム権限を付与するためのパラメータは次のとおりです。
パラメータ | 説明 |
---|---|
|
付与するシステム権限です。使用できる値のリストについては、「システム権限」を参照してください。 |
|
ユーザーにすべてのシステム権限を割り当てます。 |
|
権限が付与されるユーザーの名前。ユーザー名は、 |
|
すべてのユーザーに権限を付与することを指定します。 |
オブジェクト権限を付与するためのパラメータは次のとおりです。
パラメータ | 説明 |
---|---|
|
付与するオブジェクト権限です。使用できる値のリストについては、「オブジェクト権限」を参照してください。 |
|
ユーザーにすべてのオブジェクト権限を割り当てます。 |
|
|
|
権限が付与されるユーザーの名前。ユーザーがデータベースに存在している必要があります。 |
|
すべてのユーザーに権限を付与することを指定します。 |
説明
-
ADMIN
権限を持つユーザーは、1つ以上のシステム権限をユーザーに付与できます。 -
オブジェクトの所有者は、そのオブジェクトに対する1つ以上のオブジェクト権限をユーザーに付与できます。
-
ADMIN
権限を持つユーザーは、任意のオブジェクトに対する1つ以上のオブジェクト権限をユーザーに付与できます。 -
ユーザーから権限を削除するには、
REVOKE
文を使用してください。 -
システム権限とオブジェクト権限を1つの文で付与することはできません。
-
オブジェクト権限の文に指定できるオブジェクトの数は1つのみです。
-
レプリケーションが構成されている場合、この文はレプリケートされます。
例
ユーザーterry
にADMIN
権限を付与します。
GRANT admin TO terry;
ADMIN
権限を持っている権限付与者が、ユーザーpat
が所有するcustomers
表に対するSELECT
権限をユーザーterry
に付与します。
GRANT SELECT ON pat.customers TO terry;
ユーザーterry
にオブジェクト権限を付与します。
GRANT SELECT ON emp_details_view TO terry;
INSERT
INSERT
文は、表に行を追加します。
次の式は、INSERT
文のVALUES
句の中で使用できます。
-
順序
NEXTVAL
および順序CURRVAL
-
DEFAULT
必要な権限
表の所有者に必要な権限はありません。
別のユーザーの表の場合、INSERT
が必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
INSERT [hint] INTO [Owner.]TableName [(Column [,...])] VALUES (SingleRowValues) [RETURNING|RETURN Expression[,...] INTO DataItem[,...]]
SingleRowValues
パラメータの構文は、次のとおりです。
{NULL|{?|:DynamicParameter}|{Constant}| DEFAULT}[,...]
パラメータ
パラメータ | 説明 |
---|---|
|
|
|
データを挿入する表の所有者。 |
|
データを挿入する表の名前。 |
|
このリストの各列には、 1つ以上の表の列をこのリストで省略した場合、挿入された行では、省略された列の値は、表の作成時または最終更新時に指定された列のデフォルト値になります。省略した列に 列のリストを完全に省略した場合は、表のすべての列に値を指定する必要があります。 |
: |
準備されたSQL文の動的パラメータのプレースホルダ。動的パラメータの値は、文の実行時に設定されます。 |
|
特定の値。定数の詳細は、「定数」を参照してください。 |
|
列をデフォルト値で更新する必要があることを指定します。 |
|
有効な式の構文。式の詳細は、「式」を参照してください。 |
|
取得した |
説明
-
表の列を列名リストで省略した場合は、
INSERT
文によって、省略された列にデフォルト値が割り当てられます。省略した列に表定義でNOT NULL
が指定されている場合、その列にデフォルト値が定義されていなければ、INSERT
文は失敗します。 -
BINARY
およびVARBINARY
データは、文字形式または16進形式に挿入できます。-
文字形式では、一重引用符が必要です。
-
16進形式では、値の前に接頭辞
0x
が必要です。
-
-
外部キー制約に違反する
INSERT
処理はエラーになります。外部キー制約の詳細は、「CREATE TABLE」を参照してください。 -
RETURNING
句の制限:-
各
Expression
は単純な式である必要があります。集計関数はサポートされません。 -
順序番号は
OUT
パラメータに戻せません。 -
ROWNUM
および副問合せは、RETURNING
句では使用できません。 -
RETURNING
句内のパラメータは、INSERT
文で重複して使用できません。 -
PL/SQLでは、
RETURNING
句はWHERE CURRENT
処理と一緒には使用できません。
-
例
purchasing.vendors
表に新しい単一行を追加します。
INSERT INTO purchasing.vendors VALUES (9016, 'Secure Systems, Inc.', 'Jane Secret', '454-255-2087', '1111 Encryption Way', 'Hush', 'MD', '00007', 'discount rates are secret');
動的パラメータ:pno
および:pname
には、実行時に値が設定されます。
INSERT INTO purchasing.parts (partnumber, partname) VALUES (:pno, :pname);
新しい従業員の年間のsalary
およびjob_id
を返します。変数sal
およびjobid
を、salary
およびjob_id
と同じデータ型で宣言します。employees
に行を挿入します。確認用に変数を出力します。
Command> VARIABLE sal12 NUMBER(8,2); Command> VARIABLE jobid VARCHAR2(10) INLINE NOT NULL; Command> INSERT INTO employees(employee_id, last_name, email, hire_date, job_id, salary) VALUES (211,'Doe','JDOE',sysdate,'ST_CLERK',2400) RETURNING salary*12, job_id INTO :sal12,:jobid; 1 row inserted. PRINT sal12 jobid; SAL12 : 28800 JOBID : ST_CLERK
INSERT...SELECT
INSERT...SELECT
文は、問合せの結果を表に挿入します。
必要な権限
オブジェクトの所有者に必要な権限はありません。
別のユーザーのオブジェクトの場合、INSERT
とSELECT
が必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
INSERT INTO [Owner.]TableName [(ColumnName [,...])] InsertQuery
パラメータ
パラメータ | 説明 |
---|---|
|
データを追加する表。 |
|
値を指定する列。表の列を列名リストで省略した場合は、 |
|
サポートされている任意の |
説明
-
結果セットの列の型は、ターゲット表の列の型と互換性がある必要があります。
-
値を挿入するときに、順序
CURRVAL
またはNEXTVAL
を指定できます。詳細は、「TimesTen ClassicでのCURRVALおよびNEXTVALの使用方法」を参照してください。 -
InsertQuery
でORDER BY
句を使用できます。ターゲット表に結果セットを挿入する際に、ORDER BY
句を使用してソート順序が変更されますが、順序は保証されません。 -
InsertQuery
にエラーがあると、INSERT
操作は失敗します。 -
RETURNING
句はINSERT...SELECT
文では使用できません。 -
UNION
、UNION
ALL
、MINUS
またはINTERSECT
のSELECT
副問合せは、同じ数の投影式が必要です。
例
20日以内に配送される部品を示すpurchasing.parts
表に新しい行が追加されます。
INSERT INTO purchasing.parts SELECT partnumber, deliverydays FROM purchasing.supplyprice WHERE deliverydays < 20;
LOAD CACHE GROUP
LOAD CACHE GROUP
文は、Oracle Database表からTimesTenキャッシュ・グループにデータをロードします。
必要な権限
キャッシュ・グループの所有者に必要な権限はありません。
別のユーザーのキャッシュ・グループの場合、LOAD
またはLOAD ANY CACHE GROUP
が必要です。
基礎となる表に対するINSERT
権限、DELETE
権限、UPDATE
権限。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
LOAD CACHE GROUP [Owner.]GroupName [WHERE ConditionalExpression] COMMIT EVERY n ROWS [PARALLEL NumThreads [READERS NumReaders]]
または
LOAD CACHE GROUP [Owner.]GroupName WITH ID (ColumnValueList)
ノート:
WITH
ID
句は、TimesTen Scaleoutではサポートされていません。
パラメータ
パラメータ | 説明 |
---|---|
|
キャッシュ・グループに割り当てられた名前。 |
|
|
|
|
|
キャッシュ・グループ表のパラレル・ロードを実行します。同時にロードを実行するスレッドの数を指定します。1つのスレッドがOracle Databaseからのバルク・フェッチを実行し、その他のスレッド(
|
|
このオプションでは、Oracle Databaseからのバルク・フェッチのために使用するNumThreadsパラメータからのスレッドの合計数を指定します。 たとえば、NumThreadsパラメータを NumReadersは整数( |
|
|
説明
-
LOAD CACHE GROUP
は、キャッシュ・グループの定義を満たし、キャッシュ・グループにまだ存在していないすべての新しいキャッシュ・インスタンスをOracle Databaseからロードします。 -
キャッシュ・グループがレプリケートされるか、またはAWTキャッシュ・グループである場合、
LOAD CACHE GROUP
文を発行する前に、レプリケーション・エージェントが実行中であることを確認してください。キャッシュ・エージェントが稼働していることを確認してください。 -
LOAD CACHE GROUP
は、独自のトランザクション内で実行され、トランザクション内の最初の操作である必要があります。 -
LOAD CACHE GROUP
は、Oracle Database表に対する新規(挿入)行のみを、対応するTimesTenキャッシュ表にロードします。 -
エラーが発生するとロールバックされます。キャッシュ・インスタンスが定期的にコミットされる場合、エラーが発生すると残りのロードは中止されます。ロードは直前にコミットした時点までロールバックされます。
-
COMMIT EVERY
n
ROWS
(n
>= 0
)を指定しているときにLOAD CACHE GROUP
文が失敗すると、ロードされた行の一部はすでにコミットされているために、ターゲット・キャッシュ・グループの内容が一貫性のない状態になる場合があります。一部のキャッシュ・インスタンスが部分的にしかロードされていない可能性があります。UNLOAD CACHE GROUP
文を使用してキャッシュ・グループをアンロードしてから、キャッシュ・グループを再ロードします。 -
一般的には、
LOAD CACHE GROUP
文のWHERE
句の列名を完全に修飾する必要はありません。ただし、同一キャッシュ・グループ内の複数の表を結合する問合せがTimesTenによって自動的に生成されるため、キャッシュ・グループ内に同じ名前の列を持つ表が複数ある場合は、列を完全に修飾する必要があります。 -
読取り専用キャッシュ・グループをロードする場合、次の条件を満たしている必要があります。
-
AUTOREFRESH
のSTATEは、PAUSEDにする必要があります。 -
LOAD CACHE GROUP
文ではWHERE
句を使用できません(動的キャッシュ・グループの場合を除く)。 -
キャッシュ・グループは空である必要があります。
-
-
キャッシュ・グループの自動リフレッシュ状態は、
LOAD
CACHE
GROUP
操作の完了後に変更されることがあります。詳細は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』の自動リフレッシュによる動的キャッシュ・グループのロードおよびリフレッシュに関する項を参照してください。 -
LOAD CACHE GROUP
文の実行後、ODBC関数SQLRowCount()
、JDBCメソッドgetUpdateCount()
、およびOCI_ATTR_ROW_COUNT
引数を指定したOCI関数OCIAttrGet()
を実行すると、ロードされたキャッシュ・インスタンスの数が返されます。 -
次の場合に
WITH ID
句を使用します。-
キャッシュ・インスタンスのロード速度を上げる場合(
WHERE
句の中で使用) -
バインディング・パラメータを指定する場合
-
障害発生時にロード・トランザクションをロールバックする場合
-
制限
-
LOAD
CACHE
GROUP
...WITH
ID
句は、TimesTen Scaleoutではサポートされていません。
-
WHERE
句で子表を参照しないでください。 -
次の場合には
PARALLEL
句を指定しないでください。-
WITH ID
句が使用されている場合 -
COMMIT EVERY 0 ROWS
句が使用されている場合 -
データベース・レベルのロックが有効な場合(接続属性
LockLevel
が1に設定されている場合)
-
-
次のタイプのキャッシュ・グループをロードする場合は、
WITH ID
句を使用しないでください。-
静的読取り専用キャッシュ・グループ
-
自動リフレッシュ属性が指定された静的ユーザー管理キャッシュ・グループ
-
AUTOREFRESH
およびPROPAGATE
属性が指定されたユーザー管理キャッシュ・グループ
-
-
WITH ID
句はCOMMIT EVERY
n
ROWS
句と同時に使用しないでください。
例
CREATE CACHE GROUP recreation.cache FROM recreation.clubs ( clubname CHAR(15) NOT NULL, clubphone SMALLINT, activity CHAR(18), PRIMARY KEY(clubname)) WHERE (recreation.clubs.activity IS NOT NULL); LOAD CACHE GROUP recreation.cache COMMIT EVERY 30 ROWS;
HR
スキーマを使用して、PARALLEL
句とLOAD CACHE GROUP
文を同時に使用する例を示します。COMMIT EVERY
n
ROWS
句が必要です。CACHEGROUPS
コマンドを発行します。キャッシュ・グループcg2
が定義され、自動リフレッシュの状態がPaused(一時停止中)であることが示されています。キャッシュ・グループcg2
をアンロードしてから、LOAD CACHE GROUP
文とPARALLEL
句を指定してパラレル・ロードを実行します。25個のキャッシュ・インスタンスがロードされます。
Command> CACHEGROUPS; Cache Group SAMPLEUSER.CG2: Cache Group Type: Read Only Autorefresh: Yes Autorefresh Mode: Incremental Autorefresh State: Paused Autorefresh Interval: 1.5 Minutes Root Table: SAMPLEUSER.COUNTRIES Table Type: Read Only Child Table: SAMPLEUSER.LOCATIONS Table Type: Read Only Child Table: SAMPLEUSER.DEPARTMENTS Table Type: Read Only 1 cache group found. Command> UNLOAD CACHE GROUP cg2; 25 cache instances affected. Command> COMMIT; Command> LOAD CACHE GROUP cg2 COMMIT EVERY 10 ROWS PARALLEL 2; 25 cache instances affected. Command> COMMIT;
次の例では、対応するOracle Database表からnew_customers
キャッシュ・グループのTimesTenキャッシュ表に、顧客番号が5000以上の顧客のキャッシュ・インスタンスのみをロードします。
LOAD CACHE GROUP new_customers WHERE (oratt.customer.cust_num >= 5000) COMMIT EVERY 256 ROWS;
MERGE
この文は、TimesTen Scaleoutではサポートされていません。
TimesTen Classicの場合:
MERGE
文を使用すると、1つまたは複数のソースから行を選択して、ターゲット表に対して更新や挿入ができます。ターゲット表に対してどの行を更新または挿入するかの評価に使用する条件を指定できます。
この文は、複数のINSERT
文およびUPDATE
文を組み合せるために使用します。
MERGE
は、決定的な文であり、同一のMERGE
文でターゲット表の同じ行を複数回更新できません。
必要な権限
ターゲット表およびソース表の所有者に必要な権限はありません。
別のユーザーが所有するターゲット表の場合はINSERT
またはUPDATE
、別のユーザーが所有するソース表の場合はSELECT
が必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutではサポートされていません。
SQL構文
MERGE [hint] INTO [Owner.]TargetTableName [Alias] USING {[Owner.]SourceTableName|(Subquery)}[Alias] ON (Condtion) {MergeUpdateClause MergeInsertClause | MergeInsertClause MergeUpdateClause | MergeUpdateClause | MergeInsertClause }
MergeUpdateClause
の構文は次のとおりです。
WHEN MATCHED THEN UPDATE SET SetClause [WHERE Condition1]
MergeInsertClause
の構文は次のとおりです。
WHEN NOT MATCHED THEN INSERT [Columns [,...]] VALUES ( {{Expression | DEFAULT|NULL} [,...] }) [WHERE Condition2]
パラメータ
パラメータ | 説明 |
---|---|
|
|
|
ターゲット表の名前。これは、行の更新や挿入の対象となる表です。 |
|
オプションで、ターゲット表やソース表の別名を指定できます。 |
|
|
|
行に対してMerge InsertまたはMerge Updateのどちらを実行するかを決定するために、ターゲット表の各行の評価に使用する条件を指定します。評価時に条件がTRUEの場合、 |
|
|
|
|
|
ターゲット表に挿入する列です。 |
|
指定すると、 |
説明
-
MergeUpdateClause
とMergeInsertClause
は、一緒に、または別々に指定できます。両方指定する場合は、どちらが先でもかまいません。 -
DUAL
が、USING
句でのみ指定された表であり、MERGE
文の他の場所では参照されない場合は、副問合せではDUAL
を使用するかわりに、単純な表として指定します。この単純な場合でパフォーマンスを向上させるには、ON
句でターゲット表の一意索引にキー条件を指定します。 -
MergeUpdateClause
の制限:-
ON
condition句で参照する列は更新できません。 -
ソース表の列は更新できません。
-
-
MergeInsertClause
の制限:-
ターゲット表の列の値は挿入できません。
-
-
その他の制限:
-
ソース表の副問合せで集合演算子は使用しないでください。
-
MergeUpdateClause
またはMergeInsertClause
のWHERE
条件で、副問合せは使用しないでください。 -
ターゲット表は、マテリアライズド・ビューのディテール表には指定できません。
-
RETURNING
句はMERGE
文では使用できません。
-
例
この例では、dual
は単純な表として指定されます。ON
句に指定されたターゲット表のUNIQUE
索引にキー条件があります。この例では、DuplicateBindMode
属性は1に設定されます。(デフォルトは0です)。
Command> CREATE TABLE mergedualex (col1 TT_INTEGER NOT NULL, col2 TT_INTEGER, PRIMARY KEY (col1)); Command> MERGE INTO mergedualex USING dual ON (col1 = :v1) WHEN MATCHED THEN UPDATE SET col2 = col2 + 1 WHEN NOT MATCHED THEN INSERT VALUES (:v1, 1); Type '?' for help on entering parameter values. Type '*' to end prompting and abort the command. Type '-' to leave the parameter unbound. Type '/;' to leave the remaining parameters unbound and execute the command. Enter Parameter 1 'V1' (TT_INTEGER) > 10 1 row merged. Command> SELECT * FROM mergedualex; < 10, 1 > 1 row found.
この例では、列employee_id
およびmanager_id
を含むcontacts
という名前の表が作成されます。employee_id
およびmanager_id
にそれぞれ101とNULL
の値を持つcontacts
に、行が1つ挿入されます。MERGE
文で、employees
表のデータを使用してcontacts
に行が挿入されます。SELECT FIRST 3
の行では、employee_id
が101の場合は、manager_id
が100に更新されることを示しています。employees
表の残りの106行がcontacts
に挿入されます。
Command> CREATE TABLE contacts (employee_id NUMBER (6) NOT NULL PRIMARY KEY, manager_id NUMBER (6)); Command> SELECT employee_id, manager_id FROM employees WHERE employee_id =101; < 101, 100 > 1 row found. Command> INSERT INTO contacts VALUES (101,null); 1 row inserted. Command> SELECT COUNT (*) FROM employees; < 107 > 1 row found. Command> MERGE INTO contacts c USING employees e ON (c.employee_id = e.employee_id) WHEN MATCHED THEN UPDATE SET c.manager_id = e.manager_id WHEN NOT MATCHED THEN INSERT (employee_id, manager_id) VALUES (e.employee_id, e.manager_id); 107 rows merged. Command> SELECT COUNT (*) FROM contacts; < 107 > 1 row found. Command> SELECT FIRST 3 employee_id,manager_id FROM employees; < 100, <NULL> > < 101, 100 > < 102, 100 > 3 rows found. Command> SELECT FIRST 3 employee_id, manager_id FROM contacts; < 100, <NULL> > < 101, 100 > < 102, 100 > 3 rows found.
REFRESH CACHE GROUP
REFRESH CACHE GROUP
文は、TimesTenキャッシュ表のデータをキャッシュされたOracle Database表でコミットされた最新のデータに置き換えます。
必要な権限
Oracle DatabaseスキーマのCREATE SESSION
およびOracle Database表のSELECT
。
キャッシュ・グループの所有者の場合、キャッシュ・グループに対して必要な権限はありません。
別のユーザーのキャッシュ・グループの場合、REFRESH
またはREFRESH ANY CACHE GROUP
が必要です。
基礎となる表に対するINSERT
権限、DELETE
権限、UPDATE
権限。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
REFRESH CACHE GROUP [Owner.]GroupName [WHERE ConditionalExpression] COMMIT EVERY n ROWS [PARALLEL NumThreads]
または
REFRESH CACHE GROUP [Owner.]GroupName WITH ID (ColumnValueList)
ノート:
WITH
ID
句は、TimesTen Scaleoutではサポートされていません。
パラメータ
パラメータ | 説明 |
---|---|
|
キャッシュ・グループに割り当てられた名前。 |
|
|
|
|
|
キャッシュ・グループ表のパラレル・ロードを実行します。同時にロードを実行するスレッドの数を指定します。1つのスレッドがOracle Databaseからのバルク・フェッチを実行し、その他のスレッド(
|
|
|
説明
-
REFRESH CACHE GROUP
文は、独自のトランザクション内で実行する必要があります。 -
キャッシュ・グループがレプリケートされるか、またはAWTキャッシュ・グループである場合、
REFRESH CACHE GROUP
文を発行する前に、レプリケーション・エージェントが実行中であることを確認してください。キャッシュ・エージェントが稼働していることを確認してください。 -
REFRESH
CACHE
GROUP
文は、TimesTenキャッシュ表のデータをキャッシュされたOracle Database表でコミットされた最新のデータ(TimesTenキャッシュ表にすでに存在するデータも含む)に置き換えます。明示的にロードされるキャッシュ・グループの場合、リフレッシュ処理は、UNLOAD CACHE GROUP
文の後にLOAD CACHE GROUP
文を続けて指定した場合と同じ処理を実行します。Oracle Database表のすべての行での挿入、更新、削除などの操作は、キャッシュ表に適用されます。動的キャッシュ・グループの場合、リフレッシュ処理は、更新または削除されたOracle Database表の行のみをキャッシュ表にリフレッシュします。明示的にロードされるキャッシュ・グループと動的なキャッシュ・グループの詳細は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』のTimesTenとOracleのデータベース間での変更の伝送に関する項を参照してください。 -
読取り専用キャッシュ・グループをリフレッシュする場合、次の条件を満たしている必要があります。
-
AUTOREFRESH
のSTATEは、PAUSEDにする必要があります。 -
キャッシュ・グループが読取り専用動的キャッシュ・グループである場合、
PARALLEL
句を使用しないでください。
-
-
明示的にロードされるキャッシュ・グループまたは動的キャッシュ・グループの自動リフレッシュ状態が
PAUSED
の場合、キャッシュ・グループに対して発行された条件なしのREFRESH CACHE GROUP
文が完了した後、状態はON
に変更されます。 -
動的キャッシュ・グループの自動リフレッシュ状態が
PAUSED
の場合、REFRESH CACHE GROUP...WITH ID
文が完了した後も状態はPAUSED
のままになります。 -
一般的には、
REFRESH CACHE GROUP
文のWHERE
句の列名を完全に修飾する必要はありません。ただし、同一キャッシュ・グループ内の複数の表を結合する問合せがTimesTenによって自動的に生成されるため、キャッシュ・グループ内に同じ名前の列を持つ表が複数ある場合は、列を完全に修飾する必要があります。 -
COMMIT EVERY
n
ROWS
(n
>= 0
)を指定しているときにREFRESH CACHE GROUP
文が失敗すると、ロードされた行の一部はすでにコミットされているために、ターゲット・キャッシュ・グループの内容が一貫性のない状態になる場合があります。一部のキャッシュ・インスタンスが部分的にしかロードされていない可能性があります。UNLOAD CACHE GROUP
文を使用してキャッシュ・グループをアンロードしてから、LOAD CACHE GROUP
文を使用してキャッシュ・グループを再ロードします。 -
REFRESH CACHE GROUP
文の実行後、ODBC関数SQLRowCount()
、JDBCメソッドgetUpdateCount()
、およびOCI_ATTR_ROW_COUNT
引数が指定されたOCI関数OCIAttrGet()
を実行すると、リフレッシュされたキャッシュ・インスタンスの数が返されます。 -
次の場合に
WITH ID
句を使用します。-
キャッシュ・インスタンスのリフレッシュ速度を上げる場合(
WHERE
句の中で使用) -
バインディング・パラメータを指定する場合
-
障害発生時にリフレッシュ・トランザクションをロールバックする場合
-
制限
-
REFRESH
CACHE
GROUP
...WITH
ID
句は、TimesTen Scaleoutではサポートされていません。 -
次の場合は
PARALLEL
句を指定しないでください。-
WITH ID
句が使用されている場合 -
COMMIT
EVERY
n
ROWS
句が使用されている場合 -
データベース・レベルのロックが有効な場合(接続属性
LockLevel
が1に設定されている場合) -
読取り専用動的キャッシュ・グループの場合
-
-
次のタイプのキャッシュ・グループをリフレッシュする場合は、
WITH ID
句を使用しないでください。-
静的読取り専用キャッシュ・グループ
-
自動リフレッシュ属性が指定された静的ユーザー管理キャッシュ・グループ
-
自動リフレッシュ属性および伝播属性が指定されたユーザー管理キャッシュ・グループ
-
-
WITH ID
句はCOMMIT EVERY
n
ROWS
句と同時に使用しないでください。 -
動的または読取り専用キャッシュ・グループで
WHERE
句を使用しないでください。
例
REFRESH CACHE GROUP recreation.cache COMMIT EVERY 30 ROWS;
これは、次と同じです。
UNLOAD CACHE GROUP recreation.cache; LOAD CACHE GROUP recreation.cache COMMIT EVERY 30 ROWS;
HR
スキーマを使用して、PARALLEL
句とREFRESH CACHE GROUP
文を同時に使用する例を示します。COMMIT EVERY
n
ROWS
が必要です。CACHEGROUPS
コマンドを発行します。キャッシュ・グループcg2
が定義され、自動リフレッシュの状態がPaused(一時停止中)であることが示されています。REFRESH CACHE GROUP
文とPARALLEL
句を指定してパラレル・ロードを実行します。25個のキャッシュ・インスタンスがリフレッシュされます。
Command> CACHEGROUPS; Cache Group SAMPLEUSER.CG2: Cache Group Type: Read Only Autorefresh: Yes Autorefresh Mode: Incremental Autorefresh State: Paused Autorefresh Interval: 1.5 Minutes Root Table: SAMPLEUSER.COUNTRIES Table Type: Read Only Child Table: SAMPLEUSER.LOCATIONS Table Type: Read Only Child Table: SAMPLEUSER.DEPARTMENTS Table Type: Read Only 1 cache group found. Command> REFRESH CACHE GROUP cg2 COMMIT EVERY 20 ROWS PARALLEL 2; 25 cache instances affected.
REVOKE
REVOKE
文は、ユーザーから1つ以上の権限を削除します。
必要な権限
システム権限を削除するには、ADMIN
が必要です。
オブジェクト権限を削除するには、ADMIN
が必要であるか、またはオブジェクト所有者である必要があります。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
REVOKE {SystemPrivilege [,...] | ALL [PRIVILEGES]} FROM {User |PUBLIC} [,...]
または
REVOKE {{ObjectPrivilege [,...] | ALL [PRIVILEGES]} ON {[Owner.Object}} [,...] FROM {user | PUBLIC}[,...]
パラメータ
システム権限を削除するためのパラメータは次のとおりです。
パラメータ | 説明 |
---|---|
|
削除するシステム権限です。使用できる値のリストについては、「システム権限」を参照してください。 |
|
ユーザーからすべてのシステム権限を削除します。 |
|
権限が削除されるユーザーの名前。ユーザー名は、 |
|
すべてのユーザーの権限を削除することを指定します。 |
オブジェクト権限を削除するためのパラメータは次のとおりです。
パラメータ | 説明 |
---|---|
|
削除するオブジェクト権限です。使用できる値のリストについては、「オブジェクト権限」を参照してください。 |
|
ユーザーからすべてのオブジェクト権限を削除します。 |
|
権限が削除されるユーザーの名前。ユーザー名は、 |
|
|
|
すべてのユーザーの権限を削除することを指定します。 |
説明
-
オブジェクトの所有者から、そのオブジェクトの権限を削除することはできません。
-
権限を付与できるユーザーは、自分以外のユーザーが付与した場合でもその権限を削除できます。
-
権限は、付与されたときと同じレベルで削除する必要があります。ユーザーからオブジェクト権限を削除する場合、関連するシステム権限が付与されているユーザーからは削除できません。たとえば、あるユーザーに
SELECT ANY TABLE
を付与し、その後SELECT ON BOB.TABLE1
を削除しようとすると、SELECT ANY TABLE
に加えてSELECT ON BOB.TABLE1
を明示的に付与していない場合は失敗します。 -
ユーザーにすべてのシステム権限が付与されている場合は、特定の権限を削除できます。たとえば、すべてのシステム権限が付与されているユーザーから
ALTER ANY TABLE
を削除できます。 -
すべてのオブジェクト権限が付与されているユーザーからは、特定のオブジェクトの特定の権限を削除できます。たとえば、ユーザー
TERRY
にすべてのオブジェクト権限が付与されている場合でも、表CUSTOMERS
に対するDELETE
権限をTERRY
から削除できます。 -
ユーザーにすべての権限が付与されていない場合でも、そのユーザーからすべての権限を削除できます。
-
特定の権限を、その権限を付与されていないユーザーから削除することはできません。
-
ユーザーが所有するオブジェクトに対する権限は削除できません。
-
システム権限とオブジェクト権限を1つの文で削除することはできません。
-
オブジェクト権限の文に指定できるオブジェクトの数は1つのみです。
-
ディテール表に対する
SELECT
権限またはSELECT
権限を含むシステム権限をuser1
が所有するディテール表でuser2
から削除すると、user2
が所有する関連するマテリアライズド・ビューは無効と指定されます。 -
レプリケーションが構成されている場合、この文はレプリケートされます。
例
ADMIN
およびDDL
権限をユーザーterry
から削除します。
REVOKE admin
, ddl FROM terry;
ADMIN
権限を持っている権限削除者が、pat
が所有するcustomers
表に対するUPDATE
権限をterry
から削除します。
REVOKE update ON pat.customers FROM terry;
ROLLBACK
現行のトランザクションで行った処理を元に戻すには、ROLLBACK
文を使用します。
必要な権限
なし
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
ROLLBACK [WORK]
パラメータ
ROLLBACK
文では次のオプションのキーワードを使用できます。
パラメータ | 説明 |
---|---|
|
SQL標準に準拠するためにサポートされているオプションの句。 |
説明
PassThrough
接続属性が0(ゼロ)よりも大きい値で指定されている場合は、Oracle Databaseトランザクションもロールバックされます。
ロールバックによって、すべてのオープン・カーソルがクローズされます。
例
HR
スキーマのregions
表に行を1つ挿入し、トランザクションをロールバックします。最初に、AUTOCOMMIT
を0に設定します。
Command> SET AUTOCOMMIT 0; Command> INSERT INTO regions VALUES (5,'Australia'); 1 row inserted. Command> SELECT * FROM regions; < 1, Europe > < 2, Americas > < 3, Asia > < 4, Middle East and Africa > < 5, Australia > 5 rows found. Command> ROLLBACK; Command> SELECT * FROM regions; < 1, Europe > < 2, Americas > < 3, Asia > < 4, Middle East and Africa > 4 rows found.
関連項目
SELECT
SELECT
文は、1つ以上の表からデータを取得します。取得されたデータは、結果表、結果セットまたは問合せ結果と呼ばれる表の形式で表示されます。
必要な権限
オブジェクトの所有者に必要な権限はありません。
別のユーザーのオブジェクトの場合、SELECT
が必要です。
別のユーザーのオブジェクトの場合、SELECT ... FOR UPDATE
にはUPDATE
権限も必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
SELECT
文の一般的な構文は、次のとおりです。
[WithClause] SELECT [hint][FIRST NumRows | ROWS m TO n] [ALL | DISTINCT] SelectList FROM TableSpec [,...] [WHERE SearchCondition] [GROUP BY GroupByClause [,...] [HAVING SearchCondition]] [ORDER BY OrderByClause [,...]] [FOR UPDATE [OF [[Owner.]TableName.]ColumnName [,...]] [NOWAIT | WAIT Seconds]]
集合演算子UNION
、UNION ALL
、MINUS
またはINTERSECT
を含むSELECT
文の構文は、次のとおりです。
SELECT [hint] [ROWS m TO n] [ALL] SelectList FROM TableSpec [,...] [WHERE SearchCondition] [GROUP BY GroupByClause [,...] [HAVING SearchCondition] [,...]] {UNION [ALL] | MINUS | INTERSECT} SELECT [ROWS m TO n] [ALL] SelectList FROM TableSpec [,...] [WHERE SearchCondition] [GROUP BY GroupByClause [,...] [HAVING SearchCondition [,...] ] ] [ORDER BY OrderByClause [,...] ]
OrderByClause
の構文は次のとおりです。
{ColumnID|ColumnAlias|Expression} [ASC|DESC] [NULLS { FIRST|LAST }]
パラメータ
パラメータ | 説明 |
---|---|
|
|
|
|
|
取得する行の数を指定します。 |
|
取得する行の範囲を指定し、
|
|
問合せ結果の重複する行が削除されないようにします。 |
|
問合せ結果の各行が一意となるようにします。この比較では、 LOB列には |
|
問合せ結果の列の導出方法を指定します。選択リストの構文の詳細は、「SelectList」を参照してください。 |
|
|
|
列および 検索条件の詳細は、「検索条件」を参照してください。 |
|
|
|
副問合せは、 |
|
単純な結合(内部結合とも呼ばれる)では、 |
|
指定した列または式に基づいて、問合せの結果行をソートします。ソート・キーとして使用する列を、優先順位の高いものから順に指定します。
|
|
選択リストの列に対応する必要があります。ソートする列を指定するには、その名前または序数を指定します。選択リストの最初の列の番号は1です。選択リストの列を参照する場合、それが単純な列でない場合は、列番号を使用する方が適切です。これには、集計関数、算術式、定数などが該当します。
|
|
|
|
|
|
順序付けする問合せでNULL値の行が最初に返されるようにするには、
|
|
|
|
両方の 結果内の列の長さは、列に対応する選択値のうち長い方になります。最終的な結果の列名は、最も左側で選択された列の名前になります。 集合演算子 集合演算子の一方または両方のオペランドに集合演算子を指定できます。複数の集合演算子やネストされた集合演算子は、左から右に評価されます。 同じ問合せで集合演算子を同時に指定できます。 集合演算子を指定する
|
説明
-
相関名を使用する場合、相関名は基本名の構文ルールを満たしている必要があります。1つの
SELECT
文のすべての相関名は、一意である必要があります。相関名は、表をその表自体に結合する場合に役立ちます。FROM
句内で表の相関名を複数回定義し、選択リストとWHERE
句でその相関名を使用して、その表の列を指定します。相関名の詳細は、「TableSpec」を参照してください。 -
SELECT...FOR UPDATE
は副問合せを指定するSELECT
文で使用できますが、最も外側の問合せでのみ指定できます。 -
問合せで、
FIRST
NumRows
またはROWS
m
TO
n
が指定されている場合、返される行の数を制限するためにROWNUM
を使用することはできません。 -
FIRST
NumRows
とROWS
m
TO
n
は、同じSELECT
文で同時に使用することはできません。 -
PL/SQLで
SELECT...INTO
文を使用します。PL/SQLの外側でSELECT...INTO
文を使用する場合、TimesTenでは構文は許容されますが、暗黙的に無視されます。
例
この例では、SELECT
文での列の別名(max_salary
)の使用方法を示します。
SELECT MAX(salary) AS max_salary FROM employees WHERE employees.hire_date > '2000-01-01 00:00:00'; < 10500 > 1 row found.
この例では、2つの表orders
およびlineitems
を使用します。
orders
表およびlineitems
表は、次のように作成されます。
CREATE TABLE orders(orderno INTEGER, orderdate DATE, customer CHAR(20)); CREATE TABLE lineitems(orderno INTEGER, lineno INTEGER, qty INTEGER, unitprice DECIMAL(10,2));
つまり、注文ごとにorders
表に1つのレコードがあり、注文の各明細を示すレコードがlineitems
にあります。
年頭以降に入力されたすべての注文の合計を検索するには、HAVING
句を使用して、2000年1月1日以降に入力された注文のみを選択します。
SELECT o.orderno, customer, orderdate, SUM(qty * unitprice) FROM orders o, lineitems l WHERE o.orderno=l.orderno GROUP BY o.orderno, customer, orderdate HAVING orderdate >= DATE '2000-01-01';
次の問合せについて考えてみます。
SELECT * FROM tablea, tableb WHERE tablea.column1 = tableb.column1 AND tableb.column2 > 5 FOR UPDATE;
この問合せは、次の条件を満たすtablea
のすべての行をロックします。
-
tablea
.column1
の値が、少なくとも1つのtableb
.column1
の値と同じ。このとき、tableb
.column2
は5より大きい。
この問合せは、次の条件を満たすtableb
のすべての行もロックします。
-
tableb
.column2
の値が5よりも大きい。 -
tableb
.column1
の値が、少なくとも1つのtablea
.column1
の値と同じ。
WHERE
句を指定しない場合、両方の表のすべての行がロックされます。
この例は、(+)結合演算子を示しています。
SELECT * FROM t1, t2 WHERE t1.x = t2.x(+);
外部結合条件はOR
で連結できないため、次の問合せはエラーとなります。
SELECT * FROM t1, t2, t3 WHERE t1.x = t2.x(+) OR t3.y = 5;
次の問合せは有効です。
SELECT * FROM t1, t2, t3 WHERE t1.x = t2.x(+) AND (t3.y = 4 OR t3.y = 5);
IN
演算子を使用して(+)記号の付いた列を比較することはできません。たとえば、次の問合せはエラーとなります。
SELECT * FROM t1, t2, t3 WHERE t1.x = t2.x(+) AND t2.y(+) IN (4,5);
次の問合せは有効です。
SELECT * FROM t1, t2, t3 WHERE t1.x = t2.x(+) AND t1.y IN (4,5);
次の問合せは、内部結合になります。(+)演算子が指定されていない条件は、内部結合として扱われます。
SELECT * FROM t1, t2 WHERE t1.x = t2.x(+) AND t1.y = t2.y;
次の問合せのWHERE
句には、外部結合の内部表の列と定数を比較する条件が含まれています。(+)演算子が指定されていないため、この条件は内部結合として扱われます。
SELECT * FROM t1, t2 WHERE t1.x = t2.x(+) AND t2.y = 3;
結合のその他の例は、「JoinedTable」を参照してください。
次の例は、student
表の順序の現在の値を返します。
SELECT SEQ.CURRVAL FROM student;
次の問合せのFROM
句にはSELECT
文が含まれているため、導出表が生成されます。
SELECT * FROM t1, (SELECT MAX(x2) maxx2 FROM t2) tab2 WHERE t1.x1 = tab2.maxx2;
次の問合せは、2つのSELECT
文の結果を結合します。
SELECT * FROM t1 WHERE x1 IN (SELECT x2 FROM t2) UNION SELECT * FROM t1 WHERE x1 IN (SELECT x3 FROM t3);
次のように、カテゴリ内の最高価格と同じ価格のすべての注文を選択します。
SELECT * FROM orders WHERE price = (SELECT MAX(price) FROM stock WHERE stock.cat=orders.cat);
次の例では、INTERSECT
集合演算子の使用方法を示します。employees
表にNULL
のdepartment_id
値があります。departments
表では、department_id
はNOT NULL
の主キーとして定義されます。INTERSECT
集合演算子を使用して返される行には、department_id
値がNULL
のdepartments
表の行は含まれません。
Command> SELECT department_id FROM employees INTERSECT SELECT department_id FROM departments; < 10 > < 20 > < 30 > < 40 > < 50 > < 60 > < 70 > < 80 > < 90 > < 100 > < 110 > 11 rows found. Command> SELECT DISTINCT department_id FROM employees; < 10 > < 20 > < 30 > < 40 > < 50 > < 60 > < 70 > < 80 > < 90 > < 100 > < 110 > < <NULL> > 12 rows found.
次の例では、最初の問合せでは返されるが、2番目の問合せでは返されない行を組み合せて、MINUS
集合演算子の使用方法を示します。employees
表にNULL
のdepartment_id
値を含む行のみが返されます。
Command> SELECT department_id FROM employees MINUS SELECT department_id FROM departments; < <NULL> > 1 row found.
次の例では、GROUP BY
句におけるSUBSTR
式の使用方法およびHAVING
句における副問合せの使用方法を示します。最初の10行が返されます。
Command> SELECT ROWS 1 TO 10 SUBSTR (job_id, 4,10), department_id, manager_id, SUM (salary) FROM employees GROUP BY SUBSTR (job_id,4,10),department_id, manager_id HAVING (department_id, manager_id) IN (SELECT department_id, manager_id FROM employees x WHERE x.department_id = employees.department_id) ORDER BY SUBSTR (job_id, 4,10),department_id,manager_id; < ACCOUNT, 100, 108, 39600 > < ACCOUNT, 110, 205, 8300 > < ASST, 10, 101, 4400 > < CLERK, 30, 114, 13900 > < CLERK, 50, 120, 22100 > < CLERK, 50, 121, 25400 > < CLERK, 50, 122, 23600 > < CLERK, 50, 123, 25900 > < CLERK, 50, 124, 23000 > < MAN, 20, 100, 13000 > 10 rows found.
次の例では、更新のためにemployees
表をロックし、ロックが取得できるまで10秒間待機します。ロックが10秒以内に取得できない場合、エラーが返されます。最初の5行が選択されます。
Command> SELECT FIRST 5 last_name FROM employees FOR UPDATE WAIT 10; < King > < Kochhar > < De Haan > < Hunold > < Ernst > 5 rows found.
次の例では、更新のためにdepartments
表をロックします。選択した行が別のプロセスにロックされており、ロックが取得できない場合はエラーが返されます。これは、NOWAIT
が指定されているためです。
Command> SELECT FIRST 5 last_name e FROM employees e, departments d WHERE e.department_id = d.department_id FOR UPDATE OF d.department_id NOWAIT; < Whalen > < Hartstein > < Fay > < Raphaely > < Khoo > 5 rows found.
次のように、HR
スキーマを使用して、副問合せとFOR UPDATE
句を同時に使用する例を示します。
Command> SELECT employee_id, job_id FROM job_history WHERE (employee_id, job_id) NOT IN (SELECT employee_id, job_id FROM employees) FOR UPDATE; < 101, AC_ACCOUNT > < 101, AC_MGR > < 102, IT_PROG > < 114, ST_CLERK > < 122, ST_CLERK > < 176, SA_MAN > < 200, AC_ACCOUNT > < 201, MK_REP > 8 rows found.
次のように、SELECT ROWS
m
TO
n
およびSELECT FIRST
の動的パラメータのプレースホルダを使用します。
Command> SELECT ROWS ? TO ? employee_id FROM employees; Type '?' for help on entering parameter values. Type '*' to end prompting and abort the command. Type '-' to leave the parameter unbound. Type '/;' to leave the remaining parameters unbound and execute the command. Enter Parameter 1 (TT_INTEGER) > 1 Enter Parameter 2 (TT_INTEGER) > 3 < 100 > < 101 > < 102 > 3 rows found. Command> SELECT ROWS :a TO :b employee_id FROM employees; Type '?' for help on entering parameter values. Type '*' to end prompting and abort the command. Type '-' to leave the parameter unbound. Type '/;' to leave the remaining parameters unbound and execute the command. Enter Parameter 1 (TT_INTEGER) > 1 Enter Parameter 2 (TT_INTEGER) > 3 < 100 > < 101 > < 102 > 3 rows found. Command> SELECT FIRST ? employee_id FROM employees; Type '?' for help on entering parameter values. Type '*' to end prompting and abort the command. Type '-' to leave the parameter unbound. Type '/;' to leave the remaining parameters unbound and execute the command. Enter Parameter 1 (TT_INTEGER) > 3 < 100 > < 101 > < 102 > 3 rows found.
次の例では、ORDER BY
句でのNULLS LAST
の使用方法を示します。employees
表を問い合せて、コミッションの割合が.30より大きいかNULLである従業員を検索します。最初の7人の従業員を選択し、commission_pct
とlast_name
で順序付けします。commision_pct
を降順で順序付けし、NULLS LAST
を使用してNULL値の行を問合せの最後に表示します。commission_pct
とlast_name
を出力します。
Command> SELECT FIRST 7 commission_pct,last_name FROM employees where commission_pct > .30 OR commission_pct IS NULL ORDER BY commission_pct DESC NULLS LAST,last_name; < .4, Russell > < .35, King > < .35, McEwen > < .35, Sully > < <NULL>, Atkinson > < <NULL>, Austin > < <NULL>, Baer > 7 rows found.
WithClause
構文
WithClause
には、次の構文があります。
WITHQueryName
AS (Subquery
) [,QueryName
AS (Subquery
)] ...
パラメータ
WithClause
には、次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
|
説明
副問合せのファクタリングによってWITH
句が提供され、この句を使用して副問合せブロックに名前を割り当てることができ、その後はその名前をメインのSELECT
問合せで複数回参照できます。問合せ名は、メインの問合せとメインの問合せに含まれる副問合せで参照できます。
WITH
句は、メインのSELECT
文の接頭辞としてのみ定義できます。
副問合せのファクタリングは、重複する、または複雑な副問合せブロックを1つ以上の場所で使用する複雑な問合せの簡素化に役立ちます。また、TimesTenでは、副問合せのファクタリングを使用し、副問合せブロックを一度評価およびマテリアライズして、その結果をSELECT
文での各参照に提供することで、問合せを最適化します。
メインの問合せで集合演算子UNION
、MINUS
、およびINTERSECT
を指定できます。
WITH
句の使用制限:
-
ビューまたはマテリアライズド・ビュー定義で
WITH
句を使用しないでください。 -
再帰的な副問合せのファクタリングはサポートされていません。
-
副問合せまたは導出表では
WITH
句を使用しないでください。 -
問合せの別名に列パラメータ・リストを指定できません。たとえば、TimesTenでは
WITH
w1
(
c1
,
c2
)
AS
...はサポートされません。
例
次の例では、初期問合せブロックに対して問合せ名dept_costs
およびavg_cost
を作成し、これらの名前をメインの問合せの本体で使用します。
Command> WITH dept_costs AS ( SELECT department_name, SUM(salary) dept_total FROM employees e, departments d WHERE e.department_id = d.department_id GROUP BY department_name), avg_cost AS ( SELECT SUM(dept_total)/COUNT(*) avg FROM dept_costs) SELECT * FROM dept_costs WHERE dept_total > (SELECT avg FROM avg_cost) ORDER BY department_name; > DEPARTMENT_NAME DEPT_TOTAL ------------------------------- Sales 304500 Shipping 156400
SelectList
SQL構文
SELECT
文のSelectList
パラメータには、次の構文があります。
{* | [Owner.]TableName.* | { Expression | [[Owner.]TableName.]ColumnName | [[Owner.]TableName.]ROWID | NULL } [[AS] ColumnAlias] } [,...]
パラメータ
SELECT
文のSelectList
パラメータには、次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
問合せ結果の列として、 |
|
指定した表のすべての列を結果に含めます。 |
|
集計問合せに、 選択リストが集計問合せでない場合、列参照は 集計問合せの選択リスト内の列参照は、 |
|
指定された所有者の指定された表の特定の列を含めます。順序の |
|
指定された所有者の指定された表の |
|
|
|
|
説明
-
各句は、構文に示されたとおりの順序で指定する必要があります。
-
TimesTenでは、SelectListで副問合せはサポートされません。
-
選択リストの結果列は、次のいずれかの方法で取得できます。
-
結果列は、
FROM
句にリストされているいずれかの表から直接取得できます。 -
結果列の値は、
FROM
句にリストされている表の特定の列の値を使用して、算術式を使用して計算できます。 -
単一表の複数の列の値を算術式で結合して、結果列の値を生成できます。
-
集計関数(
AVG
、MAX
、MIN
、SUM
およびCOUNT
)を使用すると、行のグループの結果列の値を計算できます。集計関数は、単独で使用することも、式の中で使用することもできます。同じ表の複数の列を処理するDISTINCT
修飾子を含む集計関数を指定できます。GROUP BY
句を指定しない場合は、問合せを満たすすべての行に関数が適用されます。GROUP BY
句を指定した場合は、GROUP BY
句で定義された各グループに1回ずつ関数が適用されます。GROUP BY
句とともに集計関数を使用する場合は、選択リストに集計関数、算術式、GROUP BY
句の列を含めることができます。GROUP BY
句の詳細は、「GROUP BY句」を参照してください。 -
固定値を含む結果列は、定数を指定するか、または定数のみを含む式を使用して作成できます。
-
-
選択リストを使用すると、結果列の取得方法を指定できるだけでなく、問合せ結果を表示する位置を制御できます。選択リストで最初に指定した結果列が問合せ結果の最も左側の列に表示され、残りの列も同様に表示されます。
-
SelectListの結果列は、左から右の順に番号が付けられます。左端の列の番号は1です。
ORDER BY
句内のこの列番号によって、結果列を参照できます。これは、算術式または集計関数で定義した列を参照する場合に特に便利です。 -
表をその表自体と結合するには、
FROM
句内で表の相関名を複数回定義し、選択リストとWHERE
句でその相関名を使用して、その表の列を指定します。 -
GROUP BY
句を使用した場合、次のように、選択リストに従ってグループごとに1つの応答が返されます。-
行は、グループ化される前に
WHERE
句によって削除されます。 -
GROUP BY
句は、結果行をグループ化します。詳細は、「GROUP BY句」を参照してください。 -
選択リストの集計関数は、グループ単位で計算されます。
-
例
次の例では、部品が届くまでの平均日数の値のみが返されます。
SELECT AVG(deliverydays) FROM purchasing.supplyprice;
次の文は、20日未満で配送されるすべての部品の部品番号および配送時刻を返します。
SELECT partnumber, deliverydays FROM purchasing.supplyprice WHERE deliverydays < 20;
単一の部品で複数行が返される場合があります。
次の文は、各部品の部品番号と平均価格を返します。
SELECT partnumber, AVG(unitprice) FROM purchasing.supplyprice GROUP BY partnumber;
次の例では、結合によってカリフォルニア州の業者の名前と住所が返されます。行は、partnumber
の値の昇順で返されます。重複する部品番号を含む行は、vendorname
の値の昇順で返されます。FROM
句では、選択リストとWHERE
句の両方で使用される、2つの相関名(v
とs
)を定義しています。vendornumber
列は、vendors
とsupplyprice
で共通する唯一の列です。
SELECT partnumber, vendorname, s.vendornumber,vendorcity FROM purchasing.supplyprice s, purchasing.vendors v WHERE s.vendornumber = v.vendornumber AND vendorstate = 'CA' ORDER BY partnumber, vendorname;
次の問合せでは、表purchasing.parts
をそれ自体に結合して、シリアル番号が1133-P-01
の部品と同じ販売価格の部品を特定します。
SELECT q.partnumber, q.salesprice FROM purchasing.parts p, purchasing.parts q WHERE p.salesprice = q.salesprice AND p.serialnumber = '1133-P-01';
次に、特定の行のROWIDを取得する方法の例を示します。取得したROWIDの値は、後で別のSELECT
文、DELETE
文またはUPDATE
文で使用できます。
SELECT rowid FROM purchasing.vendors WHERE vendornumber = 123;
次に、列の別名を使用して、employees
表からデータを取得する方法の例を示します。
SELECT MAX(salary) AS max_salary FROM employees;
TableSpec
SQL構文
SELECT
文のTableSpec
パラメータには、次の構文があります。
TableNameSyntax | JoinedTable | DerivedTable TableNameSyntax::= [Owner.]TableName [CorrelationName] | ([Owner.]TableName) [CorrelationName] | ([Owner.]TableName [CorrelationName])
単純な表指定の構文は、次のとおりです。
[Owner.]TableName or ([Owner.]TableName)
パラメータ
SELECT
文のTableSpec
パラメータには、次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
参照する表を指定します。カッコはオプションです。 |
|
単一の文のすべての相関名は、一意である必要があります。 |
|
表の結合を定義する問合せを指定します。詳細は、「JoinedTable」を参照してください。 |
|
|
JoinedTable
JoinedTable
パラメータには、CROSS JOIN
、INNER JOIN
、LEFT OUTER JOIN
またはRIGHT OUTER JOIN
から導出された表を指定します。
SQL構文
JoinedTable
の構文は次のとおりです。
{CrossJoin | QualifiedJoin}
CrossJoin
は、次のようになります。
TableSpec1 CROSS JOIN TableSpec2
また、QualifiedJoin
は、次のようになります。
TableSpec1 [JoinType] JOIN TableSpec2 ON SearchCondition
QualifiedJoin
パラメータでは、JoinType
の構文は次のようになります。
{INNER | LEFT [OUTER] | RIGHT [OUTER]}
パラメータ
SELECT
文のTableSpec
句のJoinedTable
パラメータには、次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
2つの表に相互結合を実行します。戻り値は、入力表のデカルト積となる結果表です。結果は、次の構文を持つ問合せと同じになります。
|
|
結合が |
|
|
|
|
|
実行する結合の種類を指定します。サポートされる結合の種類は、次のとおりです。
|
|
|
説明
-
FULL OUTER JOIN
はサポートされていません。 -
結合表は、マテリアライズド・ビューを定義する文以外のすべての文で、
FROM
句内の表を置き換えるために使用できます。したがって、結合表は、UNION
、MINUS
、INTERSECT
、副問合せ、非マテリアライズド・ビューまたは導出表で使用できます。 -
結合表のオペランドに副問合せは指定できません。たとえば、次の文はサポートされていません。
SELECT * FROM regions INNER JOIN (SELECT * FROM countries) table2 ON regions.region_id=table2.region_id;
-
結合表のオペランドとしてビューを指定できます。
-
結合表のオペランドとして一時表は指定できません。
-
OUTER JOIN
は、WHERE
句のSearchCondition
での(+)演算子の使用またはJOIN
表操作の使用という2つの方法で指定できます。同じ文で2つの指定方式の両方を使用することはできません。 -
結合順およびグループ化は
JoinedTable
演算と併用できますが、(+
)演算子とは併用できません。たとえば、次の演算は(+)演算子と併用できません
。t LEFT JOIN (t2 INNER JOIN t3 ON x2=x3) ON (x1 = x2 - x3)
例
これらの例では、HR
スキーマのregions
およびcountries
表を使用します。
次の例では、左外部結合を実行します。
SELECT * FROM regions LEFT JOIN countries ON regions.region_id=countries.region_id WHERE regions.region_id=3; < 3, Asia, JP, Japan, 3 > < 3, Asia, CN, China, 3 > < 3, Asia, IN, India, 3 > < 3, Asia, AU, Australia, 3 > < 3, Asia, SG, Singapore, 3 > < 3, Asia, HK, HongKong, 3 > 6 rows found.
次のように、左外部結合を(+)演算子とともに実行することもできます。
SELECT * FROM regions, countries WHERE regions.region_id=countries.region_id (+) AND regions.region_id=3;
次の例では、右外部結合を実行します。
SELECT * FROM regions RIGHT JOIN countries ON regions.region_id=wountries.region_id WHERE regions.region_id=3; < AU, Australia, 3, 3, Asia > < CN, China, 3, 3, Asia > < HK, HongKong, 3, 3, Asia > < IN, India, 3, 3, Asia > < JP, Japan, 3, 3, Asia > < SG, Singapore, 3, 3, Asia > 6 rows found.
次の例では、右外部結合を(+)演算子とともに実行します。
SELECT * FROM countries, regions WHERE regions.region_id (+)=countries.region_id AND countries.region_id=3; < JP, Japan, 3, 3, Asia > < CN, China, 3, 3, Asia > < IN, India, 3, 3, Asia > < AU, Australia, 3, 3, Asia > < SG, Singapore, 3, 3, Asia > < HK, HongKong, 3, 3, Asia > 6 rows found.
右結合方式では、同じ行が異なる表示順序で生成されることに注意してください。結合結果の行の順序は予期できません。
次の例では、内部結合を実行します。
SELECT * FROM regions INNER JOIN countries ON regions.region_id=countries.region_id WHERE regions.region_id=2; < 2, Americas, US, United States of America, 2 > < 2, Americas, CA, Canada, 2 > < 2, Americas, BR, Brazil, 2 > < 2, Americas, MX, Mexico, 2 > < 2, Americas, AR, Argentina, 2 > 5 rows found.
次の例では、相互結合を実行します。
SELECT * FROM regions CROSS JOIN countries WHERE regions.region_id=1; < 1, Europe, AR, Argentina, 2 > < 1, Europe, AU, Australia, 3 > < 1, Europe, BE, Belgium, 1 > < 1, Europe, BR, Brazil, 2 > ... < 1, Europe, SG, Singapore, 3 > < 1, Europe, UK, United Kingdom, 1 > < 1, Europe, US, United States of America, 2 > < 1, Europe, ZM, Zambia, 4 > < 1, Europe, ZW, Zimbabwe, 4 > 25 rows found.
DerivedTable
導出表は、FROM
句のSELECT
文の結果で、別名を持ちます。
SQL構文
DerivedTable
の構文は次のとおりです。
(Subquery) [CorrelationName]
パラメータ
SELECT
文のTableSpec
句のDerivedTable
パラメータには、次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
副問合せの詳細は、「副問合せ」を参照してください。 |
|
オプションで、 |
GROUP BY句
GROUP BY
句を指定すると、データベースで、選択した行を各行の式の値に基づいてグループ化し、各グループのサマリー情報を1行戻すことができます。GROUP BY
句を省略した場合、問合せの結果全体が1つのグループとして扱われます。この句にCUBE
またはROLLUP
を指定した場合、標準グループ化の他に超集合グループ化が結果に含まれます。
GROUP BY
句の式では、次のことが可能です。
-
1つまたは複数の列を指定します。
-
算術演算、
ROWID
擬似列またはNULL
を使用します。 -
日付、定数または動的パラメータを使用します。
-
ROLLUP
またはCUBE
句を使用すると、標準グループ化の他に超集合グループ化が結果で生成されます。超集合グループ化は、GROUP BY
句で標準グループ化とともに返される、計算された小計および合計です。 -
GROUPING SETS
句を使用して、生成する超集合グループ化を指定します。
GROUP BY
句を使用する場合、SelectListには集計関数およびGROUP BY
句で参照される列のみを含めることができます。選択リストに構成要素*
、TableName.
*
またはOwner.TableName
.*
が含まれている場合は、*
に含まれているすべての列をGROUP BY
句に含める必要があります。グループ化された行では、NULL値は同じ値とみなされます。他のすべての列が同じである場合、列中のすべてのNULL値は単一のグループにまとめられます。
ノート:
NULLグループ化を識別し、潜在的に超集合グループ化から削除するには、GROUPING
関数を使用します。詳細は、「GROUPING」を参照してください。
SQL構文
GROUP BY
句の一般的な構文は次のとおりです。
GROUP BY {Expression | RollupCubeClause | GroupingSetsClause }[,...] GroupingSetsClause::= GROUPING SETS GroupingExpressionList | RollupCubeClause [,...] RollupCubeClause { ROLLUP | CUBE } ( GroupingExpressionList ) } GroupingExpressionList::= { Expression | ExpressionList [, { Expression | ExpressionList } ] ...} ExpressionList :: = ( Expression [, Expression ] ...)
パラメータ
パラメータ | 説明 |
---|---|
|
有効な式の構文。詳細は、「式」を参照してください。 |
|
|
|
|
|
|
|
|
|
|
|
カンマで区切られた、1つ以上の式のリスト。 |
例
次のGROUP BY
の例では、employees
表の従業員の給与を合計し、SUBSTR
式を使用して、職務権限ごとにデータをグループ化します。
Command> SELECT SUBSTR (job_id, 4,10), SUM (salary) FROM employees GROUP BY SUBSTR (job_id,4,10); < PRES, 24000 > < VP, 34000 > < PROG, 28800 > < MGR, 24000 > < ACCOUNT, 47900 > < MAN, 121400 > < CLERK, 133900 > < REP, 273000 > < ASST, 4400 > 9 rows found.
emp_details_view
を問い合せて、先頭の10部門およびその部門のマネージャを選択し、その部門で同じマネージャの管理下にある従業員の数をカウントします。GROUP BY
句を使用して、結果を部門およびマネージャごとにグループ化します。
Command> columnlabels on; Command> SELECT first 10 department_id AS DEPT, manager_id AS MGR, COUNT(employee_id) AS NUM_EMP FROM emp_details_view GROUP BY (department_id, manager_id) ORDER BY department_id, manager_id; DEPT, MGR, NUM_EMP < 10, 101, 1 > < 20, 100, 1 > < 20, 201, 1 > < 30, 100, 1 > < 30, 114, 5 > < 40, 101, 1 > < 50, 100, 5 > < 50, 120, 8 > < 50, 121, 8 > < 50, 122, 8 > 10 rows found.
ROLLUP、CUBEおよびGROUPING SETS句
次の定義では、列をROLLUP
、CUBE
およびGROUPING SETS
句でグループ化する方法を説明します。
-
グルーピング列:
GROUP BY
句で使用される1つの列。たとえば、次のGROUP BY
句では、X
、Y
およびZ
はグループ列です。GROUP BY X, GROUPING SETS(Y, Z)
-
複合列: カッコ内のグルーピング列のリスト。たとえば、次の句では、
(C1, C2)
および(C3, C4)
は複合列です。GROUP BY ROLLUP( (C1,C2), (C3,C4), C5);
-
グルーピング: グルーピングは、グルーピング・セット内の1つの集計レベルです。たとえば、次の文では、
(C1)
および(C2, C3)
は個別のグルーピングです。GROUP BY GROUPING SETS(C1, (C2,C3));
-
グルーピング・セット: カッコ内のグルーピングのコレクション。たとえば、次の文では、
(C1, (C2, C3))
および(C2, (C4, C5))
は、2つの個別のグルーピング・セットです。GROUP BY GROUPING SETS(C1, (C2,C3)), GROUPING SETS(C2, (C4, C5));
-
連結グルーピング・セット: 複数のグルーピング・セットをカンマで区切ります。結果は、各グルーピング・セットからのグループ化のクロス積です。
-
総計または空のセット列: 総計または空のセットのグルーピングは、すべての行を1つのグループとみなすことによって集計を計算します。
ROLLUP
およびCUBE
句では、総計は自動的に結果に含まれますが、GROUPING SETS
句では、空のカッコ( )
を指定することで要求します。
重複したグルーピング列をROLLUP
、CUBE
またはGROUPING SETS
で使用できます。ただし、結果行は重複します。
ROLLUP
、CUBE
およびGROUPING SETS
句は、マテリアライズド・ビュー定義ではサポートされていません。
次の項では、GROUPING SETS
、ROLLUP
およびCUBE
句について説明します。
GROUPING SETS
GROUPING SETS
句を使用すると、データベースが戻すデータのグループを明示的に指定できます。目的の超集合サマリーのみが生成されるように、必要なグループのみをカッコで囲んで指定します。
次の文は3つのグループを生成し、1つのグループは各性別と年の列について結果を返し、2番目のグループは各月のサマリー超集合について結果を返し、最後のグループは総計について結果を返します。
SELECT GENDER, YEAR, MONTH, SUM (NUM_OF_STUDENTS) AS TOTAL FROM INSTRUCTOR_SUMMARY GROUP BY GROUPING SETS ((GENDER, YEAR), -- 1ST GROUP (MONTH), -- 2ND GROUP ()); -- 3RD GROUP
複数のGROUPING SETS
を組み合せて、複数のGROUPING SETS
間の特定の組合せを生成できます。次の文には、2つのGROUPING SETS
句があります。
GROUP BY GROUPING SETS (YEAR, MONTH), GROUPING SETS (WEEK, DAY);
これは、次のGROUPING SETS
文と同等です。
GROUP BY GROUPING SETS (YEAR, WEEK), (YEAR, DAY), (MONTH, WEEK), (MONTH, DAY);
次のように、GROUP BY
句に通常のグルーピング列とGROUPING SETS
句の両方がある場合、結果は通常のグルーピング列でグループ化されます。
GROUP BY a, b GROUPING SETS(c, d);
これは、次のルールと同等です。
GROUP BY GROUPING SETS((a, b, c), (a, b, d));
次の例は、(region_name
, country_name
)、state_province
および総計のグルーピング・セットを指定します。
Command> SELECT region_name AS Region, country_name AS Country, state_province AS State, COUNT(employee_id) AS "Total Emp" FROM regions r, countries c, locations l, departments d, employees e WHERE r.region_id = c.region_id AND l.country_id = c.country_id AND d.location_id = l.location_id AND d.department_id = e.department_id GROUP BY grouping sets((region_name, country_name), state_province, ()) ORDER BY region_name, state_province; REGION, COUNTRY, STATE, TOTAL EMP < Americas, Canada, <NULL>, 2 > < Americas, United States of America, <NULL>, 68 > < Europe, Germany, <NULL>, 1 > < Europe, United Kingdom, <NULL>, 35 > < <NULL>, <NULL>, Bavaria, 1 > < <NULL>, <NULL>, California, 45 > < <NULL>, <NULL>, Ontario, 2 > < <NULL>, <NULL>, Oxford, 34 > < <NULL>, <NULL>, Texas, 5 > < <NULL>, <NULL>, Washington, 18 > < <NULL>, <NULL>, <NULL>, 106 > < <NULL>, <NULL>, <NULL>, 1 > 12 rows found.
ROLLUP
ROLLUP
は、GROUP BY
句で使用します。ROLLUP
をSUM
とともに使用すると、最も詳細なレベルの小計(ROLLUP
句で指定したすべての列)から総計レベルまでが、レベルごとに列を1つずつ削除して生成されます。これらは超集合行と呼ばれます。
ROLLUP
句では次の項目が返されます。
-
ROLLUP
を使用しないでGROUP BY
によって生成される通常の集計行。 -
ROLLUP
句で指定されたグルーピング・リストに基づく小計。ROLLUP
は、その引数として、グルーピング列の順序付けリストを取ります。各小計は、グルーピング列の順序付けリストに対して、総計に達するまで最も右にあるグルーピング列を削除しながら作成されます。たとえば、GROUP BY ROLLUP(x, y, z)
を指定した場合、返される超集合グループは(x,y,z)、(x,y)、(x)、( )
のようになります。作成される小計の数は
n
+1
個の集計レベルであり、n
はグルーピング列の数です。たとえば、3つの式(n
=3
)がROLLUP
句にある場合、n
+1 = 3+1
、つまり4個のグルーピングになります。 -
総計行。
カッコ内の複合列を使用して列をグループ化できます。たとえば、次のような文があるとします。
GROUP BY ROLLUP( (a, b), (c, d), e);
(a, b
)および(c, d
)複合列は、データベースによってROLLUP
の結果が生成される際に、1つの単位として処理されます。この例では、返されるグルーピング・セットは、((a, b), (c, d), e )
、((a, b), (c, d))
、(a, b)
および()
となります。
次のように、複数のROLLUP
句をSELECT
文で実行できます。
SELECT C1, COUNT(*) FROM T GROUP BY ROLLUP(a, b), ROLLUP(c, d);
これは、次の文と同じです。
SELECT C1, COUNT(*) FROM T GROUP BY GROUPING SETS((a, b),(a),()), GROUPING SETS((c, d),(c), ());
この例では、employees
表を問い合せて、先頭の10部門を選択し、各部門の各マネージャの管理下にある従業員数を戻します。ROLLUP
を使用して、各部門の従業員数の小計を算出し、会社のすべての従業員の総計を戻します。
Command> SELECT first 10 department_id AS Dept, manager_id AS Mgr, COUNT(employee_id) AS "Total emp" FROM employees GROUP BY ROLLUP(department_id, manager_id) ORDER BY department_id, manager_id; DEPT, MGR, TOTAL EMP < 10, 101, 1 > < 10, <NULL>, 1 > < 20, 100, 1 > < 20, 201, 1 > < 20, <NULL>, 2 > < 30, 100, 1 > < 30, 114, 5 > < 30, <NULL>, 6 > < 40, 101, 1 > < 40, <NULL>, 1 > 10 rows found.
次の問合せによって、各地域、国および州または都道府県の従業員数が返されます。ロールアップによって、各州または都道府県および各国の全従業員の小計の超集合行、および会社の全従業員の総計が返されます。地域と国を(カッコに入れて)独自の単位として組み合せることによって、ロールアップでは各地域の全従業員は返されません。
Command> SELECT region_name AS Region, country_name AS Country, state_province AS State, COUNT(employee_id) AS "Total Emp" FROM regions r, countries c, locations l, departments d, employees e WHERE r.region_id = c.region_id AND l.country_id = c.country_id AND d.location_id = l.location_id AND d.department_id = e.department_id GROUP BY rollup((region_name, country_name), state_province) ORDER BY region_name; REGION, COUNTRY, STATE, TOTAL EMP < Americas, Canada, Ontario, 2 > < Americas, United States of America, Texas, 5 > < Americas, United States of America, California, 45 > < Americas, United States of America, Washington, 18 > < Americas, Canada, <NULL>, 2 > < Americas, United States of America, <NULL>, 68 > < Europe, Germany, Bavaria, 1 > < Europe, United Kingdom, <NULL>, 1 > < Europe, United Kingdom, Oxford, 34 > < Europe, Germany, <NULL>, 1 > < Europe, United Kingdom, <NULL>, 35 > < <NULL>, <NULL>, <NULL>, 106 > 12 rows found.
CUBE
CUBE
句は、CUBE
句のグルーピング列の可能なすべての組合せの値に基づいて、選択された行をグループ化します。グループごとに1つのサマリー情報行が戻されます。たとえば、3つの式(n
=3
)がCUBE
句にある場合、2n = 23、つまり8個のグルーピングになります。n
個の式の値でグループ化した行を標準行、その他のすべてを超集合行といいます。複合列を使用してグループ化できます。たとえば、一般的に要求されるCUBE
操作は、月、州および販売製品のすべての組合せに基づいた州の売上小計用です。
GROUP BY CUBE(a, b, c)
を指定した場合、結果として生成される集計グルーピングは、(a,b,c
)、(a,b)
、(a,c
)、(b,c
)、a、b、c
、( )
です。
この例では、各地域および国の従業員数を戻し、次の問合せを発行します。
Command> SELECT region_name AS Region, country_name AS Country, COUNT(employee_id) AS "Total Emp" FROM regions r, countries c, locations l, departments d, employees e WHERE r.region_id = c.region_id AND l.country_id = c.country_id AND d.location_id = l.location_id AND d.department_id = e.department_id GROUP BY CUBE(region_name, country_name) ORDER BY region_name; REGION, COUNTRY, TOTAL EMP < Americas, Canada, 2 > < Americas, United States of America, 68 > < Americas, <NULL>, 70 > < Europe, Germany, 1 > < Europe, United Kingdom, 35 > < Europe, <NULL>, 36 > < <NULL>, Canada, 2 > < <NULL>, Germany, 1 > < <NULL>, United Kingdom, 35 > < <NULL>, United States of America, 68 > < <NULL>, <NULL>, 106 > 11 rows found.
TRUNCATE TABLE
TRUNCATE TABLE
文は、すべての行を削除するDELETE
文と類似しています。
TimesTen Classicでは、DELETE
は各行を個別に削除するため、TRUNCATE
操作はほとんどの状況でDELETE
操作より高速です。
TimesTen Scaleoutでは、TRUNCATE
TABLE
は、切り捨てられる表に依存するすべてのコマンドを無効にするDDL文に似ています。表内のすべての行を削除するには、DELETE
文ではなくTRUNCATE
文を使用することをお薦めします。
必要な権限
表の所有者に必要な権限はありません。
別のユーザーの表の場合、DELETE
が必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
TRUNCATE TABLE [Owner.]TableName
パラメータ
パラメータ | 説明 |
---|---|
|
切り捨てる表を指定します。 |
説明
-
TRUNCATE
はDDL文です。コミットは、TRUNCATE
文の実行前後に実行されます。 -
表にアウトライン列があり、切り捨てる数百万の行がある場合、
ttCompact
組込みプロシージャを呼び出してメモリーを解放することを検討してください。 -
同時読取りのコミット読取り操作が可能であり、読取りセマンティックは
DELETE
文がある場合の読取りのコミット読取りと同じになります。 -
子表がある場合でも、
TRUNCATE
を実行できます。ただし、TRUNCATE
を実行するには、子表を空にする必要があります。いずれかの子表に行が含まれていると、子表が空でないことを示すエラーが返されます。 -
TRUNCATE
は、マテリアライズド・ビューのディテール表、キャッシュ・グループに含まれる表または一時表ではサポートされていません。 -
表に可変長の表外データが含まれている場合、
TRUNCATE TABLE
の実行結果は、表内のすべての行を削除するDELETE
文と同じです。表外データの詳細は、「数値データ型」を参照してください。 -
表をレプリケートしている場合に
TRUNCATE
文を使用すると、操作対象の行が存在しない場合でも、サブスクライバにレプリケートされます。 -
タイムスタンプ競合検出が有効な状態で表をレプリケートすると、競合はレポートされません。
-
切り捨てられた表がコミットされていない場合は、この表のハッシュ・ページを変更するために、
DROP TABLE
およびALTER TABLE
操作を使用できません。
例
recreation.clubs
表のすべての行を削除するには、次の文を使用します。
TRUNCATE TABLE recreation.clubs;
関連項目
UNLOAD CACHE GROUP
UNLOAD CACHE GROUP
文は、キャッシュ・グループからデータを削除します。
必要な権限
キャッシュ・グループの所有者に必要な権限はありません。
別のユーザーのキャッシュ・グループの場合、UNLOAD
またはUNLOAD ANY CACHE GROUP
が必要です。
基礎となる表に対するINSERT
権限、DELETE
権限、UPDATE
権限。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
UNLOAD CACHE GROUP [Owner.]GroupName [WHERE ConditionalExpression] [COMMIT EVERY n ROWS]
または
UNLOAD CACHE GROUP [Owner.]GroupName WITH ID (ColumnValueList)
ノート:
WITH
ID
句は、TimesTen Scaleoutではサポートされていません。
パラメータ
パラメータ | 説明 |
---|---|
|
キャッシュ・グループに割り当てられた名前。 |
|
|
|
この句を指定する場合は、キャッシュ・エージェントが稼働中で、トランザクションで実行されている操作がアンロードのみである必要があります。
パフォーマンスを高めるには、大量のデータに影響するキャッシュ・グループで操作を実行する際にこの句を使用します。 データが少量のキャッシュ・グループでは、この句を使用しないでください。 |
|
|
説明
-
UNLOAD
CACHE
GROUP
文は、Oracle Database表のデータに影響することなく、TimesTenキャッシュ表から行を消去します。 -
表にアウトライン列があり、数百万の行がある場合、
ttCompact
組込みプロシージャを呼び出してメモリーを解放することを検討してください。 -
キャッシュ・グループがレプリケートされている場合、
UNLOAD CACHE GROUP
文によって、レプリケートされたキャッシュ・グループの内容全体も削除されます。 -
AWTキャッシュ・グループに対する
UNLOAD CACHE GROUP
文の実行は、行に対する更新がOracle Databaseに伝播されるまで待機します。 -
UNLOAD CACHE GROUP
文は、すべての種類のキャッシュ・グループに使用できます。キャッシュ・グループの詳細は、「CREATE CACHE GROUP」を参照してください。 -
AUTOREFRESH
属性を持つキャッシュ・グループでは、UNLOAD CACHE GROUP
文を慎重に使用してください。Oracle Databaseで行または子行が更新されると、自動リフレッシュ操作の結果として、アンロードされた行がキャッシュ・グループに再表示されることがあります。 -
UNLOAD CACHE GROUP
文の実行後、ODBC関数SQLRowCount()
、JDBCメソッドgetUpdateCount()
、およびOCI_ATTR_ROW_COUNT
引数が指定されたOCI関数OCIAttrGet()
を実行すると、アンロードされたキャッシュ・インスタンスの数が返されます。 -
COMMIT
EVERY
n
ROWS
句を指定する場合は、キャッシュ・エージェントはアンロード処理を実行し、データのアンロード後にトランザクションをコミットします。キャッシュ・エージェントが稼働していることを確認してください。COMMIT
EVERY
n
ROWS
句を指定しない場合は、アンロード処理はアプリケーションによって実行されます。 -
COMMIT
EVERY
n
ROWS
句を指定する場合は、アンロード操作をロールバックできません。COMMIT
EVERY
n
ROWS
句(n
>= 0
)を指定しているときにアンロード操作が失敗すると、アンロードされた行の一部はすでにコミットされているために、キャッシュ・グループが一貫性のない状態になる可能性があります。そのため、一部のキャッシュ・インスタンスが部分的にしかアンロードされていない可能性があります。その場合は、キャッシュ・グループを再度アンロードします。 -
WITH ID
句を使用して、バインディング・パラメータを指定します。 -
UNLOAD
CACHE
GROUP
操作は独自のトランザクションで実行されます。
制限
-
UNLOAD
CACHE
GROUP
...WITH
ID
句は、TimesTen Scaleoutではサポートされていません。 -
WHERE
句で子表を参照しないでください。 -
静的読取り専用キャッシュ・グループのまたは自動リフレッシュ属性が指定された静的ユーザー管理キャッシュ・グループには、
WITH
ID
句を使用しないでください。 -
WITH ID
句はCOMMIT EVERY
n
ROWS
句と同時に使用しないでください。
例
キャッシュ表からデータをアンロードする場合はUNLOAD
CACHE
GROUP
... COMMIT
EVERY
n
ROWS
を使用します。COMMIT
EVERY
n
ROWS
句が使用されるため、キャッシュ・エージェントはデータをアンロードします。
Command> UNLOAD CACHE GROUP testcache WHERE sampleuser.orders.order_id > 100 COMMIT EVERY 100 ROWS; 2 cache instances affected.
キャッシュ・グループをCREATE
およびUNLOAD
します。COMMIT
EVERY
n
ROWS
句が使用されないため、アプリケーションはアンロードを実行します。
CREATE CACHE GROUP recreation.cache FROM recreation.clubs ( clubname CHAR(15) NOT NULL, clubphone SMALLINT, activity CHAR(18), PRIMARY KEY(clubname)) WHERE (recreation.clubs.activity IS NOT NULL); UNLOAD CACHE GROUP recreation.cache;
UPDATE
UPDATE
文は、表のすべての行または検索条件を満たす行の1つ以上の列値を更新します。
必要な権限
表の所有者に必要な権限はありません。
別のユーザーの表の場合、UPDATE
が必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
UPDATE [hint] [FIRST NumRows] {[Owner.]TableName [CorrelationName]} SET {ColumnName = {Expression1 | NULL | DEFAULT}} [,...] [ WHERE SearchCondition ] RETURNING|RETURN Expression2[,...] INTO DataItem[,...]
パラメータ
パラメータ | 説明 |
---|---|
|
|
|
更新する行の数を指定します。 |
|
単一の文のすべての相関名は、一意である必要があります。 |
|
|
|
集計関数を含まない式。式は、更新操作に指定した行ごとに評価されます。式のデータ型は、更新する列のデータ型と互換性がある必要があります。値を更新する場合、 |
|
|
|
列をデフォルト値で更新する必要があることを指定します。 |
|
検索条件には副問合せを含めることができます。検索条件がTRUEとなる行はすべて、 |
|
有効な式の構文。詳細は、「式」を参照してください。 |
|
取得した |
説明
-
TimesTen Scaleoutでは、分散キー列は、列を同じ値に更新する以外の更新はできません。
-
主キー列は、列を元の値に更新する以外の更新はできません。
-
WHERE
句を省略した場合、表のすべての行はSET
句の指定に従って更新されます。 -
UPDATE
操作中に文字またはバイナリ文字列が切り捨てられた場合、TimesTenによって警告が生成されます。 -
制約違反(
UNIQUE
、FOREIGN
KEY
、NOT
NULL
)が発生すると、UPDATE
文は失敗します。 -
外部キー制約に違反する
UPDATE
操作はエラーになります。外部キー制約の詳細は、「CREATE TABLE」を参照してください。 -
RETURNING
句の制限:-
各
Expression2
は単純な式である必要があります。集計関数はサポートされません。 -
順序番号は
OUT
パラメータに戻せません。 -
ROWNUM
および副問合せは、RETURNING
句では使用できません。 -
RETURNING
句に使用されているパラメータは、UPDATE
文で重複して使用できません。 -
RETURNING
句を使用して複数行を戻すには、PL/SQLBULK COLLECT
機能が必要です。『Oracle TimesTen In-Memory Database PL/SQL開発者ガイド』のFORALLおよびBULK COLLECT操作に関する項を参照してください。 -
PL/SQLでは、
RETURNING
句はWHERE CURRENT
処理と一緒には使用できません。
-
例
UPDATE
文を使用してdepartment_id
= 110のemployees
を更新します。department_id
= 110のemployees
の場合は、manager_id
をjob_id
= 'FI_ACCOUNT
'のemployees
のmanager_id
に更新します。SET
句の副問合せでDISTINCT
修飾子を使用します。
job_id
= 'FI_ACCOUNT
'のemployees
のmanager_id
を検索します。
Command> SELECT manager_id FROM employees WHERE job_id = 'FI_ACCOUNT'; < 108 > < 108 > < 108 > < 108 > < 108 > 5 rows found.
次に、department_id
= 110のemployees
のmanager_id
を検索します。
Command> SELECT manager_id FROM employees WHERE department_id = 110; < 101 > < 205 > 2 rows found.
ここで、department_id
= 110のemployees
のmanager_id
を更新します。SET
副問合せでSELECT
DISTINCT
を使用します。UPDATE
の後に、department_id
= 110のemployees
のmanager_id
が更新されたことを確認します。
Command> UPDATE employees SET manager_id = (SELECT DISTINCT employees.manager_id FROM employees WHERE employees.job_id = 'FI_ACCOUNT') WHERE employees.department_id = 110; 2 rows updated. Command> SELECT manager_id FROM employees WHERE department_id = 110; < 108 > < 108 > 2 rows found.
UPDATE
文のSET
句で副問合せを使用します。location_id
= 1700またはlocation_id
= 2400のemployees
を更新します。これらの従業員のdepartment_id
をlocation_id
= 2500のdepartment_id
に設定します。(これはdepartment_id
80です)。これらの従業員の給与を所属する部門の最大給与に設定します。
最初の5人の従業員に対して問合せを実行してdepartment_idと給与を確認します。
Command> SELECT FIRST 5 employee_id, department_id, salary FROM employees ORDER BY employee_id, department_id, salary; < 100, 90, 24000 > < 101, 90, 17000 > < 102, 90, 17000 > < 103, 60, 9000 > < 104, 60, 6000 > 5 rows found.
ここでUPDATE
文を使用して従業員を更新します。
Command> UPDATE employees e1 SET department_id = (SELECT department_id FROM departments WHERE location_id = 2500), salary = (SELECT MAX(salary) FROM employees e2 WHERE e1.department_id = e2.department_id) WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 2400 OR location_id = 1700); 19 rows updated.
最初の5人の従業員を再度問合せて、元のdepartment_id
が90の従業員が更新されていることを確認します。department_id
は80になり、給与は24000になっています。
Command> SELECT FIRST 5 employee_id, department_id, salary FROM employees ORDER BY employee_id, department_id, salary; < 100, 80, 24000 > < 101, 80, 24000 > < 102, 80, 24000 > < 103, 60, 9000 > < 104, 60, 6000 > 5 rows found.
次の例は、コストが$500を超える部品の価格を25%引き上げます。
UPDATE purchasing.parts SET salesprice = salesprice * 1.25 WHERE salesprice > 500.00;
次の例は、順序seq
のNEXTVAL
値を使用して列を更新します。
UPDATE student SET studentno = seq.NEXTVAL WHERE name = 'Sally';
次の問合せは、1つでも未出荷注文のあるすべての顧客のステータスを更新します。
UPDATE customers SET customers.status = 'unshipped' WHERE customers.id = ANY (SELECT orders.custid FROM orders WHERE orders.status = 'unshipped');
id
が主キーでない場合、次の文はすべての重複する注文を更新します。
UPDATE orders a SET orders.status = 'shipped' WHERE EXISTS (SELECT 1 FROM orders b WHERE a.id = b.id AND a.rowid < b.rowid);
次の例は、employees
表内の'Jones'
という姓の従業員について、job_id
、salary
およびdepartment_id
を更新します。salary
、last_name
およびdepartment_id
の値が変数に返されます。
Command> VARIABLE bnd1 NUMBER(8,2); Command> VARIABLE bnd2 VARCHAR2(25) INLINE NOT NULL; Command> VARIABLE bnd3 NUMBER(4); Command> UPDATE employees SET job_id='SA_MAN', salary=salary+1000, department_id=140 WHERE last_name='Jones' RETURNING salary*0.25, last_name, department_id INTO :bnd1, :bnd2, :bnd3; 1 row updated. Command> PRINT bnd1 bnd2 bnd3; BND1 : 950 BND2 : Jones BND3 : 140
結合更新
TimesTenでは、結合更新文がサポートされています。結合更新を使用すると、副問合せの結果を使用して、表の列を1つ以上更新できます。
構文
UPDATE [Owner.]TableName SET ColumnName=Subquery [WHERE SearchCondition]
または
UPDATE [Owner.]TableName SET (ColumnName[,...])=Subquery [WHERE SearchCondition]
パラメータ
結合更新文には、次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
更新する表を指定します。 |
|
更新する列を指定します。単一の 副問合せの選択リストの値の数は、 |
|
検索条件には副問合せを含めることができます。検索条件がTRUEとなる行はすべて、 |
説明
結合更新のSET
句内で副問合せを使用しても、更新されるターゲット表の行数は削減されません。削減は、WHERE
句を使用して指定する必要があります。したがって、WHERE
句内でターゲット表の行が指定されているにもかかわらず、副問合せがこの行に対していずれの行も返さない場合、この行の更新対象列はNULL
値に更新されます。
例
この例では、t1
の行がt2
と一致しない場合、最初のSELECT
のx1
の値と2番目のSELECT
のx1
およびy1
の値はNULL
に設定されます。
UPDATE t1 SET x1=(SELECT x2 FROM t2 WHERE id1=id2); UPDATE t1 SET (x1,y1)=(SELECT x2,y2 FROM t2 WHERE id1=id2);
t2
と一致するt1
の行のみを更新するようにUPDATE
文を制限するには、副問合せを含むWHERE
句を次のように指定する必要があります。
UPDATE t1 SET x1=(SELECT x2 FROM t2 WHERE id1=id2) WHERE id1 IN (SELECT id2 FROM t2); UPDATE t1 SET (x1,y1)=(SELECT x2,y2 FROM t2 WHERE id1=id2) WHERE id1 IN (SELECT id2 FROM t2);
関連項目