表題の通り。
既存のEntityに既にデータが入っているAttributeがあるとする。
このAttributeのName Propertyを変更したら、どうなるか?
直感的には、Attributeに対応するテーブルの列の名前が変更され、値はそのまま維持されてほしい。
ところが、実際には
- 既存の列はそのままテーブル内に残る(データも保持したまま)
- 新しい列がテーブルに追加され、以降はその列が該当Attributeに紐づけられる(データはこの時点では空)
という動作をする。
環境情報
Personal Environment(Version 11.21.0 (Build 39357))
Service Studio(Version 11.54.18)
Data Extractor(Version 1.4.0)
ドキュメント
How Data Model Changes are Handled - Renaming an Entity or Attributeより(2023/07/26時点では日本語訳が無さそうなので英語で閲覧する)。
If you rename an Attribute, OutSystems creates a new column with the new name in the database. The old column with all its data remains in the database untouched, but it won’t be available in the development environment.
この記述だと、開発以外の環境ではどうなるのか気になるが、PEではその検証ができない。
Data Extractorの使い方
ForgeにあるData Extractorを使うと、環境内にあるEntityに対応するRDB内のテーブルの情報を取得できる。
簡単な手順は以下の通り。
- Data Extractorを開く
- 画面右上の「New Snapshot」をクリック
- 画面に以下の入力をしてSaveボタンをクリック
- Snapshot Name: 適当な名前
- Extract Configurations: Table DDL(Entityに対応するテーブルのDDLを出力するオプション)にチェック(テーブルに入っているデータはチェックの有無にかかわらず出るようだ)
- 画面下部に「Extract Entities」という欄が出現するので、「Search Entity to Add」で対象のEntity名を検索⇒表示された候補からモジュール名を確認したうえで適切なものを選択し、「Add」ボタンをクリック
- 「Run」ボタンをクリック⇒一覧表示に戻ったら、しばらく待ってから、「Refresh]のリンクをクリック
ダウンロードしたzipファイルを展開し、
- csv.gzで終わるファイル:テーブルに格納されているデータ
- TableDDL.Create.sql.gzファイル:テーブルを作成するためのDDLを含むsqlファイル
動作確認手順
- Service Studioに付属するTutorial用ExcelのTasks.xlsxを取り込んでTask Entityを作成
- 属性名を変更する前の、Entity定義・データ、及びData Extractorで取得したデータとDDLを確認
- Description属性のNameをDescription_NameChangedに変更してPublish
- 属性名を変更した後の、Entity定義・データ、及びData Extractorで取得したデータとDDLを確認
属性名を変更する前の、Entity定義・データ、及びData Extractorで取得したデータとDDLを確認
Entity定義
Service StudioのView or Edit Dataで確認したEntityのデータ
DDL
CREATE TABLE [DBO].[OSUSR_W8T_TASK1]
(
[ID] BIGINT NOT NULL IDENTITY(1,1)
, [DESCRIPTION] NVARCHAR(50) COLLATE LATIN1_GENERAL_100_CI_AI_SC NULL
, [DUEDATE] DATETIME NULL
, [ISACTIVE] BIT NULL
, CONSTRAINT [OSPRK_OSUSR_W8T_TASK1] PRIMARY KEY ([ID] ASC)
)
Entityに対応するテーブルに含まれるデータ
ID | DESCRIPTION | DUEDATE | ISACTIVE |
---|---|---|---|
System.Int64 | System.String | System.DateTime | System.Boolean |
1 | Deploy Awesome Apps | 2018-02-05 00:00:00 | True |
2 | Finish Tutorial | 2016-07-06 00:00:00 | True |
3 | Go On Vacation & Relax | 2018-07-04 00:00:00 | False |
4 | Learn OutSystems | 2016-01-31 00:00:00 | False |
5 | Finish Projects on Time | 2018-02-01 00:00:00 | True |
6 | Dummy | 2022-05-11 00:00:00 | True |
属性名を変更した後の、Entity定義・データ、及びData Extractorで取得したデータとDDLを確認
Entity定義
Description属性の名前をDescription_NameChangedに変更した。
Service StudioのView or Edit Dataで確認したEntityのデータ
名前を変更後のDescription_NameChanged属性の値が空になっている(変更前のDescriptionだった時にはデータが表示されていたことに注意)。
DDL
[DESCRIPTION]と[DESCRIPTION_NAMECHANGED]が両方あることに注意。つまり、属性の名前を変えただけなのにもかかわらず、新しい列が追加されている。
CREATE TABLE [DBO].[OSUSR_W8T_TASK1]
(
[ID] BIGINT NOT NULL IDENTITY(1,1)
, [DESCRIPTION] NVARCHAR(50) COLLATE LATIN1_GENERAL_100_CI_AI_SC NULL
, [DUEDATE] DATETIME NULL
, [ISACTIVE] BIT NULL
, [DESCRIPTION_NAMECHANGED] NVARCHAR(50) COLLATE LATIN1_GENERAL_100_CI_AI_SC NULL
, CONSTRAINT [OSPRK_OSUSR_W8T_TASK1] PRIMARY KEY ([ID] ASC)
)
Entityに対応するテーブルに含まれるデータ
名前変更前のDescriptionだったころの属性に対応すると思われるDESCRIPTION列には値が入っているが、追加された、名前変更後の属性に対応すると思われるDESCRIPTION_NAMECHANGED列は空。
つまり属性変更に伴って作成された列には値はコピーされなかった。
ID | DESCRIPTION | DUEDATE | ISACTIVE | DESCRIPTION_NAMECHANGED |
---|---|---|---|---|
System.Int64 | System.String | System.DateTime | System.Boolean | System.String |
1 | Deploy Awesome Apps | 2018-02-05 00:00:00 | True | |
2 | Finish Tutorial | 2016-07-06 00:00:00 | True | |
3 | Go On Vacation & Relax | 2018-07-04 00:00:00 | False | |
4 | Learn OutSystems | 2016-01-31 00:00:00 | False | |
5 | Finish Projects on Time | 2018-02-01 00:00:00 | True | |
6 | Dummy | 2022-05-11 00:00:00 | True |