コンテンツにスキップ
8.8 制約、エラー、トラブルシューティング

8.8 制約、エラー、トラブルシューティング

他のRDBMSのSQLを移行するときは、名前が似ていることを理由に同じ機能を期待しがちです。 まずEditionと公開構文を確認し、次にデータ制約と同時アクセスの問題を分けて調べてください。

機能のサポート範囲

TRANSACTIONはStandard Edition専用です。 ClusterではCREATE TABLE・CREATE TRANSACTION TABLE・CREATE TXN TABLEはすべて拒否されます。 LOGはCREATE LOG TABLEで明示する必要があります。

要求対応・代替方法
一般的なSELECT・INSERT・UPDATE・DELETEサポート。WHEREなしの変更は全行が対象
単一のPRIMARY KEYサポート。テーブルごとに1つ
単一・複合UNIQUE INDEXサポート。テーブル作成後に別途作成
列の後のUNIQUE・テーブルレベルPRIMARY KEY該当する作成構文は未サポート
FOREIGN KEY・Trigger・Stored Procedure未サポート
BEGIN・COMMIT・ROLLBACKサポート。ネストしたBEGIN・SAVEPOINTは未サポート
ADD・DROP・RENAME COLUMN、RENAME TOサポート条件を確認
MODIFY COLUMN未サポート
AppendSDK別の公開手段とバッチ境界を確認
TAGのMETADATA・BASETIME・BASEDISTANCETRANSACTIONには適用しない

Clusterで小規模なマスターデータを変更する場合はLOOKUPを検討できますが、明示的なリレーショナルトランザクションの完全な代替ではありません。 元のイベントはLOG・TAG、リレーショナルトランザクションは別のRDBMSなど、要件に応じて分ける必要があります。

エラー別の診断

症状確認箇所次の対処
ERR-01418 一意性違反PK・UNIQUEキーと既存データ入力修正またはUPSERT規則の確認
NOT NULL違反省略・NULL・空文字列・DEFAULT入力値と制約を確認
UPDATEの処理が0行キーと現在状態の条件対象なし・処理済みなどの業務状態を確認
Resource busy他の書き込み、古い読み取りスナップショット、開いたカーソル原因に応じて待機・新規トランザクション・カーソル終了
COMMIT・ROLLBACKがbusy同じ接続の開いた結果セット結果セットを閉じて終了を再試行
エラー後の後続SQLも拒否ロールバック専用状態かROLLBACK後に新しい処理を開始
DDL失敗参照インデックス・VIEW・アクティブなトランザクション依存関係と変更タイミングを調整
マウント先の値が予想と異なるマウント名・所有者・テーブル名本番データとバックアップデータを区別

同じResource busyでも、再試行の方法は異なります。 2接続による詳細な実習は、ロックとbusy timeoutを参照してください。 エラー文字列にTRANSACTIONがあることだけを理由に、繰り返し実行しないでください。

制約エラーとデータ保持

CREATE TRANSACTION TABLE ch8_error (
    id    LONG PRIMARY KEY,
    code  VARCHAR(32) NOT NULL,
    value INTEGER
);
CREATE UNIQUE INDEX ch8_error_code ON ch8_error(code);
INSERT INTO ch8_error VALUES (1, 'A', 10);

以下は、それぞれ意図的に失敗する任意の実習です。 正常なSQLとまとめず、確認する文だけを実行してください。

-- PRIMARY KEYの重複
INSERT INTO ch8_error VALUES (1, 'B', 20);
-- UNIQUEの重複
INSERT INTO ch8_error VALUES (2, 'A', 20);
-- 必須値の違反
INSERT INTO ch8_error VALUES (3, NULL, 30);
-- 未サポートのスキーマ変更
ALTER TABLE ch8_error MODIFY COLUMN (code VARCHAR(64));
SELECT id, code, value FROM ch8_error ORDER BY id;
DROP TABLE ch8_error;

最後のクエリには(1, A, 10)だけが残ります。 単一文の失敗で状態が保持されることと、BEGIN内で先に成功した文まで自動的に取り消されるわけではないことを区別する必要があります。 トランザクションに比較例があります。

診断情報の収集

サーバーバージョン・Edition、DDLとインデックス、実行SQL、エラーコードとメッセージ全文、実際の影響行数を併せて用意してください。 接続障害では、COMMITの要求・応答時刻と業務キーも必要です。 パスワード・個人情報・機密の業務値を伏せ、再現に必要な最小限のサンプルだけを共有してください。

復旧のために内部保存ファイルを直接変更したり、本番テーブルを再作成したりしないでください。 先に原因と反映状態を確認することが、データ損失の低減につながります。

最終更新日