Skip to main content

 

 

 

 
Language:

 

 

 

 
 
OutSystems

デプロイ時のエラー「Could not create Foreign Key」のトラブルシューティング

モジュールをパブリッシュすると、特定の状況で以下のエラーが発生する場合があります。

Could not create Foreign Key: This may have happened because there are '<EntityAId>' values of entity '<EntityB>' with no corresponding value in entity '<EntityA>', or attribute 'EntityAId' of entity 'EntityB' is creating a circular dependency between entities.Check error log for details.

Service Studioでモジュールをパブリッシュする際に、このエラーが表示される場合があります。

あるいは、Service Centerでも、ソリューションをパブリッシュする際などにエラーが表示される場合があります。

最も一般的なシナリオ

このガイドでは、このようなパブリッシュ時のエラーの原因となる可能性のある最も一般的な状況と、そのような状況を解決する方法を示します。最も可能性の高い原因をリストの最初に表示しているため、このリストの順序でトラブルシューティングすることを推奨します。

対応する値がない

テーブル間で外部キー(FK)を作成するには、FKが作成されるテーブル(エラーのエンティティ「A」)に、親テーブル(エラーのエンティティ「B」)に存在する値のみが含まれていることが重要です。実例として、以下の2つのテーブルを考えます。

エンティティ「A」:

ID User_ID Task
1 10 Create
2 11 Review

エンティティ「B」:

ID Username Email
5 Ruben ruben@example.com
6 Capitao capitao@example.com

エンティティ「A」の列「User_ID」からエンティティ「B」の列「ID」を指すように外部キーを作成した場合、列「User_ID」の既存のデータに親テーブル(エンティティ「B」)に存在しない値が含まれているため、エラーが発生します。

この仮説を検証するには、エンティティが指している物理テーブルのデータを確認します。

この状況を解決するには、参照されているすべての値が親テーブルに存在するようにテーブルのデータを修正する必要があります。そのためには、以下のいずれかを実行します。

  • 存在しないエントリを削除する
  • 親テーブルに値を追加する

循環依存または複数のカスケードパス

テーブルからエントリを削除したときに、そのエントリに依存する外部キーもすべて削除するようにテーブルを設定できます。これをカスケード削除と呼びます。 これをOutSystemsで行うには、外部キー関係のプロパティに移動し、Delete Ruleプロパティで[Delete]を選択します。

このような削除規則は、データベースエンジンでは処理できないため認められていないという状況に陥る場合もあります。以下のシナリオでは、このエラーが予想されるため、エラーが発生しないように削除規則を見直す必要があります。

循環依存

上記の左側のエンティティ図では、削除規則が削除対象のテーブルにループバックされるため、データベースエンジンは削除のカスケードパスを無限にたどります。これにより望ましくない動作が発生するため、以下のいずれかになるようにエンティティモデルのトポロジーを見直す必要があります。

  • いずれかの外部キー関係が存在しない
  • いずれかの削除規則が「Delete」以外である

複数のカスケードパス

上記の右側のエンティティ図では、テーブルXから値を削除すると、最終的にテーブルZの値が削除されます。しかし、データベースエンジンは最初にどの削除を行う必要があるか(Yに続いてZを削除するか、または直接Zを削除するか)を判断できません。このような状況を回避するには、Zにつながるいずれかの外部キー関係を[Ignore]に設定する必要があります。

データベースのタイムアウト

テーブルに含まれるデータがSQLエンジンによって検証されることを考慮すると、テーブルが存在する場合、テーブルのサイズが大きいほどFKの作成に時間がかかります。テーブルに大量のレコードがあるかどうかを検証し、その場合は、Configuration Toolでタイムアウト値を更新します。

あるいは、タイムアウト値を増やしても足りない場合やテーブルが小さい場合は、データベースのロックを確認します。

データベースのロック

上記のように、テーブルのロックが原因で、単にタイムアウトが発生して外部キーが作成されない可能性もあります。Oracleでは、ロックが発生すると、以下のエラーが表示される場合もあります。

ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

これに該当するかどうかを確認するには、データベース管理者と協力して、パブリッシュ操作に影響を及ぼすロックの有無と、そのようなロックを解除する方法を確認する必要があります。