表およびリージョンの管理

最初にサンプル表を作成します。その後、表を変更するための様々な方法を学習します。項の最後で、その表を削除します。また、既存のリージョンの表示および特定のリージョンの削除についても学習します。

KVSTOREまたはKVLiteを起動し、SQLシェルを開きます。
java -jar lib/kvstore.jar kvlite -secure-config disable
java -jar lib/sql.jar -helper-hosts localhost:5000 -store kvstore

表の変更

alter tableコマンドを使用すると、次の操作を実行できます。
  • 表スキーマへのスキーマ・フィールドの追加
  • 表スキーマからのスキーマ・フィールドの削除
  • リージョンの追加
  • リージョンの削除
  • 表の存続時間値の変更

ノート:

1つのコマンドで指定できる操作のタイプは1つだけです。たとえば、スキーマ・フィールドの削除とTTL値の設定を一緒に行うことはできません。
サンプル表を作成します。
CREATE TABLE demo_acct(
acct_id INTEGER,
acct_data JSON, 
PRIMARY KEY(acct_id)
)
例1: 表スキーマへのスキーマ・フィールドの追加。
ALTER TABLE demo_acct(ADD acct_balance INTEGER)

説明: フィールドを追加しても、表内の既存の行には影響しません。フィールドを追加すると、そのデフォルト値またはNULLが、このフィールドを含まない既存の行で、このフィールドの値として使用されます。追加するフィールドは、最上位フィールド(つまり、表の列)にすることも、階層表スキーマ内で深くネストすることもできます。その結果、フィールドはパスを介して指定されます。

例2: 表スキーマからのスキーマ・フィールドの削除。
ALTER TABLE demo_acct(DROP acct_balance)
説明: 主キー以外の任意のフィールドをスキーマから削除できます。主キー・フィールドを削除しようとすると、次に示すエラーが表示されます。
ALTER TABLE demo_acct(DROP acct_id)
出力(エラーの表示):
Error handling command ALTER TABLE demo_acct(DROP acct_id):
Error: at (1, 27) Cannot remove a primary key field: acct_id

例3: リージョンの追加

add regions句を使用すると、マルチリージョンのOracle NoSQL Database環境で既存の複数リージョン表(MR表)を新しいリージョンとリンクできます。この句を使用して、MR表を新しいリージョンに展開します。

次のDDLコマンドを使用して、新しいリージョンを既存のMR表に関連付けます。
ALTER TABLE <table_name> ADD REGIONS <region_name>

説明: ここで、table_nameはMR表で、region_nameは既存のリージョンです。

例4: リージョンの削除

リージョンの削除句を使用すると、マルチリージョンのOracle NoSQL Database環境で参加リージョンから既存のMR表を切断できます。この句を使用すると、MR表を縮小してリージョンを減らすことができます。

マルチリージョンのNoSQL Database設定で特定のリージョンからMR表を削除するには、参加している他のすべてのリージョンから次のステップを実行する必要があります。
ALTER TABLE <table_name> DROP REGIONS <comma_separated_list_of_regions>

ここで、table_nameはMR表、comma_separated_list_of_regionsは削除されるリージョンのリストです。

例5: 表の存続時間値の変更

存続時間(TTL)のメカニズムを使用すると、表の行に時間枠を設定して、それを経過すると、行が自動的に期限切れになって使用できなくなるようにできまます。デフォルトでは、作成するすべての表のTTL値は、有効期限がないことを示すゼロとなります。

ALTER TABLEコマンドを使用すると、任意の表のこの値を変更できます。TTLを数値で指定し、その後にHOURSまたはDAYSを指定できます。
ALTER TABLE demo_acct USING TTL 5 days

ノート:

表のTTL値を変更しても、表の既存の行のTTL値は変更されません。かわりに、表の変更後に作成された行に配置されるデフォルトのTTL値のみが変更されます。表内のすべてのレコードのTTLを変更するには、表の各レコードを反復処理してそのTTL値を更新する必要があります。

APIの使用による表の変更:

Oracle NoSQL Database SDK for Javaを使用して表を変更します。こちらにあるサンプルの中からフル・コードAlterTable.javaをダウンロードします。
/**
* Alter the table stream_acct and add a column
*/
private static void alterTab(NoSQLHandle handle) throws Exception {
   String alterTableDDL = "ALTER TABLE " + tableName +"(ADD acctname STRING)";
   TableRequest treq = new TableRequest().setStatement(alterTableDDL);
   System.out.println("Altering table " + tableName);
   TableResult tres = handle.tableRequest(treq);
   tres.waitForCompletion(handle, 60000, /* wait 60 sec */
   1000); /* delay ms for poll */
   System.out.println("Table " + tableName + " is altered");
}
Oracle NoSQL Database Python SDKを使用して表を変更します。こちらにあるサンプルの中からフル・コードAlterTable.pyをダウンロードします。
def alter_table(handle):
   statement = '''ALTER TABLE  stream_acct(ADD acctname STRING)'''
   request = TableRequest().set_statement(statement)
   table_result = handle.do_table_request(request, 40000, 3000)
   table_result.wait_for_completion(handle, 40000, 3000)
   print('Table stream_acct is altered')
Oracle NoSQL Database Go SDKを使用して表を変更します。こちらにあるサンプルの中からフル・コードAlterTable.goをダウンロードします。
//alter an existing table and add a column
func alterTable(client *nosqldb.Client, err error, tableName string)(){
   stmt := fmt.Sprintf("ALTER TABLE %s (ADD acctName STRING)",tableName)
   tableReq := &nosqldb.TableRequest{
		Statement: stmt,
   }
   tableRes, err := client.DoTableRequest(tableReq)
   if err != nil {
      fmt.Printf("cannot initiate ALTER TABLE request: %v\n", err)
      return
   }
   // The alter table request is asynchronous, wait for table alteration to complete.
   _, err = tableRes.WaitForCompletion(client, 60*time.Second, time.Second)
   if err != nil {
      fmt.Printf("Error finishing ALTER TABLE request: %v\n", err)
      return
   }
   fmt.Println("Altered table ", tableName)
   return
}
Oracle NoSQL Database Node.js SDKを使用して表を変更します。こちらにあるサンプルの中からフル・コードAlterTable.jsをダウンロードします。
//alter a table and add a column
async function alterTable(handle) {
   const alterDDL = `ALTER TABLE ${TABLE_NAME} (ADD acctname STRING)`;
   let res =  await handle.tableDDL(alterDDL);
   console.log('Table altered: ' + TABLE_NAME);
}
Oracle NoSQL Database Dotnet SDKを使用して表を変更します。こちらにあるサンプルの中からフル・コードAlterTable.csをダウンロードします。
private static async Task alterTable(NoSQLClient client){
   var sql = $@"ALTER TABLE {TableName}(ADD acctname STRING)";
   var tableResult = await client.ExecuteTableDDLAsync(sql);
   // Wait for the operation completion
   await tableResult.WaitForCompletionAsync();
   Console.WriteLine("  Table {0} is altered", tableResult.TableName);
}

表の削除

drop table文は、指定された表および関連するすべての索引をデータベースから削除します。デフォルトでは、指定された表が存在しない場合、この文は失敗します。オプションのIF EXISTS句が指定され、表が存在しない場合、エラーは表示されません。
DROP TABLE demo_acct

ノート:

MR表を削除するには、まずその子表をすべて削除します。そうしないと、DROP文はエラーになります。

APIの使用による表の削除:

Oracle NoSQL Database SDK for Javaを使用して表を削除します。こちらにあるサンプルの中からフル・コードAlterTable.javaをダウンロードします。
/*Drop the table*/
private static void dropTab(NoSQLHandle handle) throws Exception {
   String dropTableDDL = "DROP TABLE " + tableName;
   TableRequest treq = new TableRequest().setStatement(dropTableDDL);
   TableResult tres = handle.tableRequest(treq);
   tres.waitForCompletion(handle, 60000, /* wait 60 sec */
       1000); /* delay ms for poll */
   System.out.println("Table " + tableName + " is dropped");
}
Oracle NoSQL Database Python SDKを使用して表を削除します。こちらにあるサンプルの中からフル・コードAlterTable.pyをダウンロードします。
def drop_table(handle):
   statement = '''DROP TABLE stream_acct'''
   request = TableRequest().set_statement(statement)
   table_result = handle.do_table_request(request, 40000, 3000)
   table_result.wait_for_completion(handle, 40000, 3000)
   print('Dropped table: stream_acct')
Oracle NoSQL Database Go SDKを使用して表を削除します。こちらにあるサンプルの中からフル・コードAlterTable.goをダウンロードします。
//drop an existing table
func dropTable(client *nosqldb.Client, err error, tableName string)(){
   stmt := fmt.Sprintf("DROP TABLE %s",tableName)
   tableReq := &nosqldb.TableRequest{
		Statement: stmt,
   }
   tableRes, err := client.DoTableRequest(tableReq)
   if err != nil {
      fmt.Printf("cannot initiate DROP TABLE request: %v\n", err)
      return
   }
   // The drop table request is asynchronous, wait for table drop to complete.
   _, err = tableRes.WaitForCompletion(client, 60*time.Second, time.Second)
   if err != nil {
      fmt.Printf("Error finishing DROP TABLE request: %v\n", err)
      return
   }
   fmt.Println("Dropped table ", tableName)
   return
}
Oracle NoSQL Database Node.js SDKを使用して表を削除します。こちらにあるサンプルの中からフル・コードAlterTable.jsをダウンロードします。
//drop a table
async function dropTable(handle) {
   const dropDDL = `DROP TABLE ${TABLE_NAME}`;
   let res =  await handle.tableDDL(dropDDL);
   console.log('Table dropped: ' + TABLE_NAME);
}
Oracle NoSQL Database Dotnet SDKを使用して表を削除します。こちらにあるサンプルの中からフル・コードAlterTable.csをダウンロードします。
private static async Task dropTable(NoSQLClient client){
   var sql = $@"DROP TABLE {TableName}";
   var tableResult = await client.ExecuteTableDDLAsync(sql);
   // Wait for the operation completion
   await tableResult.WaitForCompletionAsync();
   Console.WriteLine("  Table {0} is dropped", tableResult.TableName);
}

リージョンの管理

show regions文は、複数リージョンのOracle NoSQL Databaseに存在するリージョンのリストを提供します。出力をJSON形式にする場合は、AS JSONを指定する必要があります。

例1: 次の文は、既存のすべてのリージョンをリストします。
SHOW REGIONS
次の文は、既存のすべてのリージョンをJSON形式でリストします。
SHOW AS JSON REGIONS
マルチリージョンOracle NoSQL Database環境で、drop region文は、指定されたリモート・リージョンをローカル・リージョンから削除します。マルチリージョン設定のローカル・リージョンおよびリモート・リージョンの詳細は、複数リージョン環境の設定に関する項を参照してください。

ノート:

このリージョンは、コマンドが実行されるローカル・リージョンと異なっている必要があります。
次のdrop region文は、my_region1という名前のリモート・リージョンを削除します。
DROP REGION my_region1

APIの使用によるリージョンの削除:

Oracle NoSQL Database SDK for Javaを使用してリージョンを削除します。こちらにあるサンプルの中からフル・コードRegions.javaをダウンロードします。
/* Drop a table from a region*/
private static void dropTabInRegion(NoSQLHandle handle) throws Exception {
   String dropTableDDL = "DROP TABLE " + tableName;
   TableRequest treq = new TableRequest().setStatement(dropTableDDL);
   TableResult tres = handle.tableRequest(treq);
   tres.waitForCompletion(handle, 60000, /* wait 60 sec */
   1000); /* delay ms for poll */
   System.out.println("Table " + tableName + " is dropped");
}
   /* Drop a region*/
   private static void dropRegion(NoSQLHandle handle, String regName) throws Exception {
      String dropNSDDL = "DROP REGION " + regName;
      SystemRequest sysreq = new SystemRequest();
      sysreq.setStatement(dropNSDDL.toCharArray());
      SystemResult sysres = handle.systemRequest​(sysreq);
      sysres.waitForCompletion​(handle, 60000,1000);
      System.out.println("Region " + regName + " is dropped");
   }
Oracle NoSQL Database Python SDKを使用してリージョンを削除します。こちらにあるサンプルの中からフル・コードRegions.pyをダウンロードします。
#Drop the table from a region
def drop_tab_region(handle):
   statement = '''DROP TABLE stream_acct'''
   request = TableRequest().set_statement(statement)
   table_result = handle.do_table_request(request, 40000, 3000)
   table_result.wait_for_completion(handle, 40000, 3000)
   print('Dropped table: stream_acct')

#Drop the region
def drop_region(handle):
   statement = '''DROP REGION LON'''
   sysreq = SystemRequest().set_statement(statement)
   sys_result = handle.system_request(sysreq)
   sys_result.wait_for_completion(handle, 40000, 3000)
   print('Region LON is dropped')
Oracle NoSQL Database Go SDKを使用してリージョンを削除します。こちらにあるサンプルの中からフル・コードRegions.goをダウンロードします。
//drops a table from a region
func drpTabInRegion(client *nosqldb.Client, err error, tableName string)(){
   stmt := fmt.Sprintf("DROP TABLE %s",tableName)
   tableReq := &nosqldb.TableRequest{
		Statement: stmt,
   }
   tableRes, err := client.DoTableRequest(tableReq)
   if err != nil {
      fmt.Printf("cannot initiate DROP TABLE request: %v\n", err)
      return
   }
   _, err = tableRes.WaitForCompletion(client, 60*time.Second, time.Second)
   if err != nil {
      fmt.Printf("Error finishing DROP TABLE request: %v\n", err)
      return
   }
   fmt.Println("Dropped table ", tableName)
   return
}

//drop a region
func dropRegion(client *nosqldb.Client, err error)(){
   stmt := fmt.Sprintf("DROP REGION LON")
   sysReq := &nosqldb.SystemRequest{
		Statement: stmt,
   }
   sysRes, err := client.DoSystemRequest(sysReq)
   _, err = sysRes.WaitForCompletion(client, 60*time.Second, time.Second)
   if err != nil {
      fmt.Printf("Error finishing DROP REGION request: %v\n", err)
      return
   }
   fmt.Println("Dropped REGION LON ")
   return
}
Oracle NoSQL Database Node.js SDKを使用してリージョンを削除します。こちらにあるサンプルの中からフル・コードRegions.jsをダウンロードします。
//drop a table from a region
async function dropTabInRegion(handle) {
   const dropDDL = `DROP TABLE ${TABLE_NAME}`;
   let res =  await handle.tableDDL(dropDDL);
   console.log('Table dropped: ' + TABLE_NAME);
}

//drop a region
async function dropRegion(handle) {
   const dropReg = `DROP REGION LON`;
   let res = await handle.adminDDL(dropReg);
   console.log('Region dropped: LON' );
}
Oracle NoSQL Database Dotnet SDKを使用してリージョンを削除します。こちらにあるサンプルの中からフル・コードRegions.csをダウンロードします。
private static async Task dropTabInRegion(NoSQLClient client){
   var sql = $@"DROP TABLE {TableName}";
   var tableResult = await client.ExecuteTableDDLAsync(sql);
   // Wait for the operation completion
   await tableResult.WaitForCompletionAsync();
   Console.WriteLine("  Table {0} is dropped", tableResult.TableName);
}

private static async Task dropRegion(NoSQLClient client){
   var sql = $@"DROP REGION LON";
   var adminResult = await client.ExecuteAdminAsync(sql);
   // Wait for the operation completion
   await adminResult.WaitForCompletionAsync();
   Console.WriteLine("  Dropped region LON");
}