LoginSignup
4
1

運用中のOutSystemsアプリのEntityにUnique制約のついたAttributeを追加したい

Last updated at Posted at 2024-06-04

この記事のゴール

運用中のシステムのEntityにUnique制約を付けたAttributeを追加する。

発生した現象

運用中のEntityに新しくUnique制約が付いたAttributeを追加する必要が生じた。
ここではCompanyに新しくUnique制約を付けたCodeを追加する。

まず、EntityにAttributeを追加して
image.png

そのあと制約を作成
image.png

Publishするが、一意制約が発生してしまう。
image.png

すでにレコードが存在しているので、デフォルト値「空値」を複数のレコードに設定しようとして一意制約違反が発生している。

試したこと

  1. デフォルト値が一意になるように設定する
  2. Unique制約を後から設定する

デフォルト値が一意になるように設定する

ぱっと思いつく方法は

  1. GUIDを生成して格納する
    残念ながら安直にサーバアクションを設定することができない模様。裏でSQLに変換されるのだろうし、デフォルト値に何が設定できるのか少し調べただけではわからなかった。
    image.png

  2. 該当レコードのIDを文字列に変換して格納する
    Guidと同じ理由で断念。

すぐには解決できそうにないので2つ目の施策を考える。

Unique制約を後から設定する

既視感、よく考えたらPythonのDjangoでよくやっていた方法。

  1. 既存Entityに新しいAttributeをUnique制約なしに追加する
    まずはDataTypeとLength、IsMandatoryを設定しUnique制約を付けずにPublishする。

  2. 新しいAttributeに一意な値を設定する
    既存のレコードに対して新しく追加されたAttributeに一意な値を設定するタイマーを作成する。
    ここではCodeというAttributeに同レコードのIDを設定することで一意性を担保している。
    image.png
    タイマーを実行し、一意の値を設定する。
    image.png

  3. 新しく追加したAttributeにUnique制約を付加し、Publishする

まとめ

運用中のシステムのすでにレコードが存在するEntityにUnique制約を付けたAttributeを追加必要が出た場合には、以下の手順を実施することで実現できる。

  1. 既存Entityに新しいAttributeをUnique制約なしに追加する
  2. 新しいAttributeに一意な値を設定する
  3. 新しく追加したAttributeにUnique制約を付加する

本番環境にLifeTimeで配置して終了とはいかず、タイマーを動かしてから再度本番への変更が必要となる。本番適用のためには、事前の十分な計画とテストが必要。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1