ABORTは、それぞれの値を個別にテストします。そのため、集約される値と集約されない値の両方をWHERE句で指定してはなりません。
実際には、集約される値がGROUP BYの値になり、グループの集約の結果に数学的な計算が実行されます。
例えば、次の条件が当てはまる場合、以下に示すROLLBACK文は誤ってトランザクションを終了します。
- testテーブルには、いくつかの行があり、
- Test.colAの合計は188であり、さらに
- test.colBに値125を備えた新しい行が1行だけある。
ROLLBACK WHERE (SUM(Test.colA) <> 188) AND (Test.ColB = 125);
先行するリクエストは最初に処理され、1行を選択する条件(ColB = 125)に従ってすべての行のスキャンが実行された後、条件(SUM(ColA) <> 188)に従って、中間的な集約の結果が計算されます。
選択された行のColAの値は188よりも小さいため、条件はTRUEと判断されます。
ROLLBACK ... WHEREが使用され、この文に、実行するオブジェクトに対するREADアクセスが必要な場合には、ROLLBACK文を実行するユーザーは、アクセスするデータに対するSELECT権限を持っていなければなりません。
ROLLBACKのWHERE条件には、subqueryを含めることができます。SubqueryにはFROM句が必要です。また、subqueryでの参照の範囲をROLLBACK条件にする場合には、ROLLBACKリクエストにもFROM句が必要です。