OutSystems でアプリケーションを作成中に、以前に作ったEntity の Attribute 名を変更したい時があります。
このAttribute名について、単純に変更してしまうと思いもよらぬ挙動をして、データが失われ、アプリケーションが正常に動作できなくなります。
特にOutSystems で既にアプリケーションをある程度構築していて、さらに本番環境で稼働させている中でのリファクタリングや機能修正を行う際に、この問題に直面すると悲しみに暮れます。
Attributeの整理を行いたいという願望に対して、現代の最先端を行くべきローコードツールとは思えないほど容易ではありません。
(なぜカラム名を変更できるような仕組みにしなかったかは、OutSystems開発者の方々の、将来を見据えた意図があるかと思いますが....)
そこで、既にPublish済みのEntityに対して、安全に Attribute 名を変更する方法を説明します。
OutSystemsの驚くべき仕様
カラム名を変更すると、新しいカラムとして扱われる
OutSystems では、Entity の Attribute 名を変更すると、実際のデータベース上では「新しいカラム」が作成され、元のカラムは「非表示(hidden)」になる という仕様になっています。
なお、一般的な SQL データベースでは ALTER TABLE ... RENAME COLUMN を使用してカラム名を変更できます。
が、OutSystems ではそのような処理は自動で行われません。
カラム名変更の影響
この仕様により、カラム名を変更しただけでは、元のデータが新しいカラムに引き継がれません。
その結果、開発者が 「Attribute 名を変えただけなのに、データが消えた!?」 という状況に陥る可能性があります。
もうすでにAttribute名を変更してデータがなくなってしまった?
もし 「カラム名を変更したらデータが消えた!」 という状況に陥った場合でも、データを取り戻すことが可能です。
手順:消えたデータを復元する
- 対象の Entity に新しい Attribute を追加する
- 追加する Attribute 名を「変更前のカラム名」と同じにする
- すると、OutSystems が既存の(非表示になった)カラムと再び紐付けを行い、データが復元される
なぜ復元できるのか?
OutSystems は カラムを物理的に削除するのではなく、「非表示」にするだけ なので、
「元のカラム名で新しい Attribute を作成する」と、OutSystems がそれを 元のカラムと再びリンク するため、データが復元されます。
本題:Entity Attribute Name をデータ保持したまま変更する方法
OutSystems では、Entity の Attribute 名を変更すると、データが引き継がれない という問題があります。
そのため、安全にカラム名を変更しつつ、データを保持するための手順を説明します。
1. 変更後の Attribute 名を「新規作成」
- OutSystems ではカラムのリネームができないため、新しい Attribute を作成する。
2. 変更前の Attribute から変更後の Attribute にデータをコピーするロジックを作成
- データ移行用のServer Actionを作成する。
- 対象となるEntityに対して、元Attributeに保存されている情報を新Attributeへコピーし、DBへUpdate処理をする。
- OutSystemsのTimerを使って、アプリケーションの OnPublish 時に実行することをお勧めします。
- 任意のタイミングで実行して構いません。
3. 変更前の Attribute の usage(参照)を確認し、すべての参照を変更後の Attribute に変更
- Service Studio の「Find Usage」機能を使って、変更前の Attribute を参照している画面やロジックを特定し、新しい Attribute に更新 する。
4. 変更前の Attribute の usage がないことを確認(すべて移行終了)
- 再度「Find Usage」機能を使い、変更前の Attribute を参照する箇所がないことを確認する。
5. Publish(変更を適用)
- 開発環境で Publish し、正常に動作することを確認する。
6. 変更前の Attribute のコメントに「削除予定」を記載
- いきなり削除せず、Attribute のコメントに 「削除予定」 などの注意書きを追加する。
- 一定期間運用し、問題が発生しないことを確認する。
7. 開発 → 検証 → 本番まで変更を適用
- 開発環境 → 検証環境 → 本番環境 と変更を適用していき、データが正しく引き継がれていることを確認する。
8. 変更前の Attribute を削除する
- 問題がないことを確認した後、不要になった Attribute を削除する。
- 削除する前に、データが新しいカラムに完全に移行されていることを最終確認する。
まとめ
- OutSystems ではカラム名を直接変更できない ため、新しい Attribute を作成する必要がある。
- データ移行用のロジックを作成し、元のデータをコピーすることでデータを保持 する。
- すべての参照を新しい Attribute に更新し、不要になった Attribute を削除 する。
- いきなり削除せず、一定期間「削除予定」として保持しながら慎重に移行するのが安全。
この手順に従えば、OutSystems の仕様に対応しながら安全に Entity Attribute 名を変更できます!