2016年3月8日-警告: SQL 更新処理で結果が不正になる
対象バージョン: Cache/Ensemble 2015.2, 2015.2.1, 2015.2.2
対象プラットフォーム: すべて
[発生する問題]
特定のSQL INSERT, UPDATE, DELETE 文で処理の結果が不正になる問題が発生します。
[問題の詳細]
2つ以上の更新SQL文が入れ子になっている場合にのみこの問題が発生します。
以下は問題が発生する1つの例です:
1. クラスに UPDATE トリガが定義されており、その中で埋め込みSQLによる更新処理がある。
2. SQL が UPDATE トリガ内に埋め込まれているネスト構造となっているため、トリガを発生させた
UPDATE 処理の実行途中で別の UPDATE が実行されます。
(これがこの問題を引き起こす条件です)
3. この例ではトリガ内のSQLで同じテーブルを更新していますが、同じ問題はトリガ内で
別テーブルを更新した場合にも発生する可能性があります。
次のクラス User.Test があるとします。
Class User.Test Extends %Persistent
{
Index idx On (x, y);
Property x As %Integer;
Property y As %Integer;
Property z As %Integer;
Property flg As %Integer;
Property zz As %String;
Trigger UA [ Event = UPDATE, Time = AFTER ]
{
if ({flg}=0) quit
&sql( UPDATE SQLUser.Test
SET flg=0
WHERE x=:{x} and y=:{y} and z=:{z}
)
quit
}
}
このクラス(テーブル)が次のレコードを持っている状態で、
x y z flg zz
123 55 1 0
123 55 2 0
次の UPDATE 文を実行すると1行しか更新されません。
UPDATE SQLUser.Test SET flg=1,zz=’done’ WHERE x=123 and y=55
x y z flg zz
123 55 1 done
123 55 2 0
[解決方法]
この問題は、修正ID: DPV4766, DPV4772 で解決します。
この修正は今後リリースする製品に含まれる予定です。
Cache / Ensemble 2015.2.2 は本件の修正を加えてビルド番号が805から811に変更となりました。
現在対象バージョンをお使いのお客様で修正版にアップグレードされた場合、アプリケーションのすべてのクラスと
ルーチンを再コンパイルする必要がございます。
本件についてご質問等ございましたら
インターシステムズジャパン・カスタマサポートセンターまでお知らせください。