たとえばDELETE FROM Contact
、クエリを実行し、トランザクション中にエラーが発生した場合、削除できる行を削除して、削除できない行に関連するすべてのエラーを発生させる必要があります。
3 に答える
SQL Server の場合、1 つのステートメント内で Delete コマンドの原子性を破ることはありません。明示的なトランザクションの外部で発行されたとしても、暗黙のトランザクション内で動作することになります。
明示的なトランザクションの領域内では、エラーはデフォルトでトランザクション全体をロールバックしますが、これを変更して、トランザクション全体 (複数のステートメント) 内でエラーが発生した単一のステートメントを試行してロールバックすることができます。これの設定は SET XACT_ABORT です。
削除は単一のステートメントであるため、XACT_ABORT は役に立ちません。行がエラーになり、削除がロールバックされます。
直面するエラー条件 (FK 制約違反など) がわかっている場合は、delete に適切な where 句があり、エラーが発生することがわかっている行を削除しようとしないようにすることができます。
MySQLを使用している場合は、DELETE IGNORE
構文を利用できます。
これは、使用しているデータベースのフレーバーに完全に依存する機能です。持っている人もいれば、持っていない人もいます。
たとえば、Oracle は DML エラーを一括でログに記録する機能を提供しています。 ドキュメントの例では INSERT ステートメントを使用していますが、同じ原則がすべての DML ステートメントに適用されます。