データベース再編成の実行時に一時テーブルが作成されるのは、SQL ステートメントだけで解決するのが難しい場合です。データベース再編成の実行に使用されるジェネレーターは、再編成中に変換プログラムを作成して実行します。再編成の詳細については、こちらを参照してください。
この種のデータベースの再編成は、IAR (影響分析レポート) で確認できます。このような再編成では、一時テーブルが作成され、GeneXus プログラムまたは SQL ステートメントを使用してデータが新しい構造にコピーされます。
変換が必要なテーブルごとに、次の内容が詳述された <TableName>conversion という名前のファイルが作成されます:
CREATE TABLE [ GXA0001 ] ( ....)
テーブル <TableName> に対して変換プログラムを実行
DROP TABLE [ <TableName> ]
CALL sp_rename(' [ GXA0001 ] ', '<TableName>')
ALTER TABLE [ <TableName> ] ....
注: このデータベース再編成の例は SQLServer に関連付けられています。ほかの DBMS で実行する場合は若干異なります。
データベースの再編成では、次の処理が行われます:
- GXA0001 という一時テーブルが、新しいテーブル構造で作成されます。
- 変換プログラムが実行され、一時的な構造にデータが読み込まれます。
- 古いテーブル "Tablename" が削除されます。
- 一時テーブルの名前が正しい "TableName" に変更されます。
- テーブルの制約が設定されます。
ジェネレーターは、データベース再編成中に、テーブルごとに以下のパターンを使用して変換プログラムを作成し、実行します。
<TableName>conversion.cs (C# ジェネレーター)
<TableName>conversion.java (Java ジェネレーター)
<TableName>conversion.rb (Ruby ジェネレーター)
注: バージョン X Evolution 2 Upgrade 3 以降では、この再編成の処理が最適化され、一時テーブルを作成する代わりに「ALTER TABLE」が使用されます (詳しくは、SAC #32631 を参照してください)。
CREATE TABLE [ GXA0001 ] (
[ Transaction1Id ] SMALLINT NOT NULL,
[ Transaction1Num ] SMALLINT NOT NULL,
[ Transaction1Blob ] VARBINARY(MAX) NOT NULL)
テーブル Transaction1 に対して変換プログラムを実行
DROP TABLE [ Transaction1 ]
CALL sp_rename(' [ GXA0001 ] ', 'Transaction1')
ALTER TABLE [ Transaction1 ]
ADD PRIMARY KEY ( [ Transaction1Id ] )
Transaction1 テーブルのキーを変更する場合 (N(5) を N(6) に変更するなど)、ALTER TABLE は実行できません。この場合、一時テーブルが作成され、データは最適化手法で一時テーブルにコピーされます:
INSERT INTO GXA0001 (a, b, c) SELECT a, b, c FROM Transaction1
Transaction1 テーブルに、[ Nullable ] プロパティ - 項目属性 = True の項目属性がある場合、上記の最適化は実行できません。そのため、データを 1 つのテーブル (Transaction1) から照会するカーソルと、他のテーブルに挿入するもう 1 つ別のカーソルを定義する形でコピーが行われます。
たとえば、次の設定を変更します。
再編成の構成は次のとおりです:
- 項目属性名を新しい長さにして一時テーブルを作成
- 古いテーブルから新しい一時テーブルにレコードをコピー
- テーブル名を新しい名前に変更
- テーブルの整合性の制限を更新
- [ nullable ] プロパティを Yes から No に変更
- Informix の例 - rgz0005 が指定されている場合
- Oracle の例 - 1 つのテーブルのデータをロードするために複数のテーブルがナビゲートされる場合
- Informix の例 - ロードされるテーブル自体がナビゲートしなければならない場合
|