Skip to main content

 

エンティティアトリビュートをIntegerからLong Integerにアップグレードする

 

OutSystems

エンティティアトリビュートをIntegerからLong Integerにアップグレードする

This article applies to:OutSystems 9.1, 10.0
OutSystems Platform 9.1以降、Long Integerという新しいデータ型を導入しています。 これをプラットフォームで他のデータ型として使用し、エンティティ識別子や通常のエンティティアトリビュートに含めることができます。この記事では、既存のエンティティアトリビュートのデータ型をIntegerからLong Integerに変更する方法について説明しています。

 

一部のエンティティでLong Integer型アトリビュートを使用しているモジュールを初めてパブリッシュすると、新しいデータ型をサポートするためにデータベーススキーマが想定どおりに作成されます。この処理はうまくいくため、何も心配する必要はありません。

ただし、既存のInteger型アトリビュートの識別子をLong Integerデータ型を含めるように変更して、モジュールをパブリッシュしようとしても、データベースで、新しいデータ型をサポートするためのアップデートが自動的に行われることはありません。そのようなデータベースアップグレードでは、モジュールのパブリッシュ時にダウンタイムが発生します。そのため、OutSystemsでは、アプリケーションに影響を及ぼさないようにアップグレードを自動的に行わないことにしました。

 

Integer型アトリビュートからLong Integer型アトリビュートへのアップグレードを実行し、既存のデータをアップグレード前の状態のまま維持するには、2つのアプローチがあります。

  • アプローチ1 - DBAが実行する。
  • アプローチ2 - 開発者が実行する(クラウドシナリオではこのアプローチを使用する必要があります)。


アプローチ1 - DBAが実行する

 

以下の手順は、DBAが実行すべき手順に対応します。考慮すすべき2つの基本的なケースには、通常のアトリビュートのアップグレードとエンティティ識別子のアップグレードです。

 

通常のエンティティアトリビュートのアップグレード

通常のエンティティアトリビュートをアップグレードするには、開発環境で[Data]タブに移動し、そのアトリビュートのデータ型をLong Integerに変更する必要があります。これには、以下の手順を実行します。

 

  1. 開発環境で[Data]タブに移動します。
  2. アトリビュートのデータ型をLong Integerに置き換えます。
  3. パブリッシュします。


モジュールをパブリッシュすると、アトリビュートはデータベースで正しいデータ型になり、データは影響を受けません。すべてスムーズに動作します。

エンティティ識別子(主キー)のアップグレード

エンティティ識別子をアップグレードするには、すべて想定どおりに動作するように以下の手順を実行する必要があります。

  1. アップグレードするアトリビュートのデータベース制約だけではなく、そのアトリビュートに依存する外部キーも削除する必要があります。場合によっては、そうしたアトリビュートのインデックスも削除する必要があります。スクリプトは、後で必要になるため必ず保存してください。

  2. データベース管理ソフトウェアを使用して、アトリビュートのデータ型を新しいデータ型に置き換えます。

    • SQL Serverの場合はbigint;bigint

    • Oracleの場合はnumber(20)

    • MySqlの場合はBIGINT(20)

これらの型は、OutSystemsプラットフォームのLong Integer型に正しく対応します。

  1. 最初の手順で削除した制約を再作成します。まず、アップグレードしたアトリビュートの制約を再作成します。次に、それに依存するアトリビュートの制約を再作成します。

  2. 開発環境に移動し、アップグレードするエンティティ識別子をLong Integerに変更します。次に、データベースでも変更した各アトリビュートに移動し、アトリビュートにすでに設定されている(つまり、アップグレードしたアトリビュートの)データ型を選択して、更新します。

  3. モジュールをパブリッシュします。これで、すべて動作します。
    ただし、動作せず、アトリビュートのデータ型が一致していないというコンパイルエラーが発生している場合は、以下の点を確認してください。

    • データベースのデータ型が正しいかどうか。

    • 変更した識別子のみを参照しているアトリビュートのデータ型を含め(前の手順を参照)、必要なアトリビュートのデータ型をすべて変更したかどうか。

 

これで、仕組みに関する抽象的な概念を理解できたので、実際のシナリオを分析しましょう。以下に例を示します。

 


上記の例では、PersonエンティティのIdアトリビュートIntegerからLong Integerにアップグレードします。どのように行いますか?

 

まず、依存しているアトリビュート(Long Integerに変更しようとしているアトリビュートを参照する外部キーを含むアトリビュート)から制約とインデックスを削除する必要があります。この場合、対象となるのはPersonエンティティのMotherFatherPictureエンティティのPersonId 、およびLocationエンティティのPersonIdです。これらの4つのアトリビュートのどれか1つに依存しているアトリビュートがほかにある場合は、最初にその制約を削除する必要があり、削除するとこれらの4つのアトリビュートから制約を削除できるようになります。その後、アップグレード対象のアトリビュートから制約を削除できます。キー制約(主キーと外部キー)や削除すべきインデックスがいくつか見つかる可能性があります。さらに、アトリビュートがnullにならないようにデフォルトのアトリビュート値を定義して制約を調べるための制約も見つかる可能性があります。これには、以下の手順を実行します。

 

  1. PictureエンティティとLocationエンティティのPersonIdから制約を削除します。

  2. PersonエンティティのMotherFatherから制約を削除します。

  3. PersonエンティティのIdから制約を削除します。

 

その後、Idアトリビュートのデータ型を新しいデータ型(たとえば、SQL Serverを使用している場合はbright)に変更できます。また、他のアトリビュートも同様に変更できます。 これには、以下の手順を実行します。

 

  1. PersonエンティティのIdのデータ型を新しいデータ型に変更します。

  2. PersonエンティティのMotherFatherのデータ型を新しいデータ型に変更します。

  3. PictureエンティティとLocationエンティティのPersonIdのデータ型を新しいデータ型に変更します。

 

これで、削除した制約を作成できるようになります。最初にアップグレード対象のアトリビュート(Person エンティティのId)、次に外部アトリビュート(PersonエンティティのMotherFather、およびPictureおよびLocationエンティティのPersonId)に対して作成できます。 外部アトリビュートに依存しているアトリビュートがほかにある場合は、この手順の直後にそうしたアトリビュートの制約を再作成する必要があります。また、主キーを再作成するときに非null制約を追加する必要があります。これには、以下の手順を実行します。

 

  1. PersonエンティティのIdアトリビュートの削除した制約を作成します。

  2. PersonエンティティのMotherアトリビュートとFatherアトリビュートの削除した制約を作成します。

  3. PictureエンティティとLocationエンティティのPersonIdアトリビュートから削除した制約を作成します。

 

最後に、開発環境に移動し、アップグレード対象のアトリビュートをLong Integerに変更して、他の変更したアトリビュートのデータ型を再割り当てした後にパブリッシュします。

 

  1. 開発環境に移動します。
    1. PersonエンティティのId アトリビュートをLong Integerに変更します。

    2. PictureエンティティとLocationエンティティのPersonIdアトリビュートのデータ型をPerson識別子に再度選択します。;

    3. パブリッシュします。

これで、すべて動作します。また、既存のデータもアップグレード前の状態のままであるはずです。

アプローチ2 - 開発者が実行する

 

開発者が実行できるアプローチ(クラウドシナリオで実行すべきアプローチ)で必要なのは、開発環境を使用して変換を行うことだけです。すべて想定どおりに動作するために必要な手順を以下に示します。

  1. [Data]タブで、IntegerからLong Integerに変更するアトリビュートを持つエンティティと、新しいエンティティとしてそうしたアトリビュートへの依存関係があるエンティティをコピーして貼り付けます。

  2. 先ほど作成したエンティティ(コピーして貼り付けたエンティティ)のアトリビュートをIntegerからLong Integerに変更します。

  3. 古いエンティティから、コピーして貼り付けたエンティティにデータをコピーするためのコードを実装して実行します。データが正しく保存されたかどうかを確認します。

  4. データが正しく保存されたことを確認します。

  5. 古いエンティティを削除し、古いエンティティが使用されていた場所が新しいエンティティを指すことで表示されるエラーを修正します。ヒント: 新しいエンティティの名前を古いエンティティと同じ名前に変更します。

  6. パブリッシュします。

 

PersonエンティティのIdアトリビュートをIntegerからLong Integerにアップグレードする場合は、前の例に戻ります。もう1つのアプローチでは、どのように行いますか?

 

  1. [Data]タブに移動し、Personエンティティ、Pictureエンティティ、およびLocationエンティティをコピーして貼り付けます。

  2. PersonエンティティのIdのデータ型をIntegerからLong Integerに変更します。

  3. 古いエンティティから新しいエンティティにデータをコピーするためのコードを実装すべきPreparationを含む新しいWeb画面を作成します。以下のようになります。

最初にPersonエンティティからデータをコピーして保存する必要があります。これにより、他のエンティティはその外部キーで参照しているデータを特定できるようになります。

 

  1. 先ほどブラウザで作成したWeb画面をパブリッシュして開きます。これにより、Preparationのコードが実行されてデータがコピーされます。データが正しく保存されたかどうかを確認します。

  2. Personエンティティ、Pictureエンティティ、Locationエンティティを削除し、新しいエンティティ(多くの場合、Person2Picture2Location2)の名前を変更して、削除したエンティティの名前に合わせます(Person2PersonPicture2 Picture Location2 Locationにそれぞれ変更)。

  3. パブリッシュします。