先にSQL文から
BEGIN TRANSACTION;
BEGIN TRY
-- 子テーブルのデータを先に削除
DELETE ChildTable FROM
ChildTable
JOIN
ParentTable
ON
ChildTable.ForeignKey = ParentTable.PrimaryKey
WHERE
[条件];
-- 親テーブルのデータを削除
DELETE FROM
ParentTable
WHERE
[条件];
-- トランザクションのコミット
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
-- ロールバック処理
ROLLBACK TRANSACTION;
END CATCH;
詳細説明
BEGIN TRANSACTION;
トランザクションの開始位置を示します.
BEGIN TRY
END TRY
BEGIN CATCH
END CATCH
エラー処理のブロックです.
TRYブロック内でエラーが発生するとCATCHブロックへ制御が渡ります.
-- 子テーブルのデータを先に削除
DELETE ChildTable FROM
ChildTable
JOIN
ParentTable
ON
ChildTable.ForeignKey = ParentTable.PrimaryKey
WHERE
[条件];
テーブルに親子の依存関係がある場合,子テーブルから削除します.
依存関係の仕様上親テーブルを先に削除すると子テーブルが削除できなくなります.
-- 親テーブルのデータを削除
DELETE FROM
ParentTable
WHERE
[条件];
親テーブルを消す
COMMIT TRANSACTION;
トランザクションの途中で行われたすべての変更は一時的に保持されています.
COMMIT TRANSACTION;
を実行することでデータベースに変更内容が確定されます.
-- ロールバック処理
ROLLBACK TRANSACTION;
トランザクションの途中で問題が発生したため,ロールバック処理をします.
今回の場合は
BEGIN TRANSACTION;
の直前までロールバックされます.