3 つのテーブルにデータを挿入します (私のプロセスによると)。ただし、データは 3 つのテーブルに入力する必要があります。それ以外の場合は、トランザクションをロールバックしたいと考えています。例:- データが 2 つのテーブルに挿入され、テーブル 3 が挿入されなかった場合、入力された値を 2 つのテーブルから削除したいと考えています。
これを行う最善の方法は何ですか?トリガーを使用してそれを行うことはできますか? これを解決するのを手伝ってください。
3 つのテーブルにデータを挿入します (私のプロセスによると)。ただし、データは 3 つのテーブルに入力する必要があります。それ以外の場合は、トランザクションをロールバックしたいと考えています。例:- データが 2 つのテーブルに挿入され、テーブル 3 が挿入されなかった場合、入力された値を 2 つのテーブルから削除したいと考えています。
これを行う最善の方法は何ですか?トリガーを使用してそれを行うことはできますか? これを解決するのを手伝ってください。
Uはこれを試すことができます:
SET XACT_ABORT ON
BEGIN TRY
BEGIN TRAN
INSERT INTO Table1 values ()
INSERT INTO Table2 values ()
INSERT INTO Table3 values ()
COMMIT TRAN
END TRY
BEGIN CATCH
raiserror('Custome Error Message ',16,20)
END CATCH
SET XACT_ABORT OFF
SET XACT_ABORT ON を使用すると、Transact-SQL ステートメントで実行時エラーが発生した場合、トランザクション全体が終了し、ロールバックされます。
catch ブロックでは、カスタム エラーを発生させるか、テーブルに記録できます。
Begin CATCH
Insert into #LogError values (1,'Error while inserting a duplicate value')
if @@TRANCOUNT >0
rollback tran
END CATCH
使用するtransactions
Commit tran -- if success
Rollback tran -- on error
このようなもの
Create Proc YourSPName
AS
BEGIN TRAN
INSERT INTO TableOne ( -- Columns)
VALUES ( -- Values)
IF (@@ERROR <> 0) goto Truncater;
INSERT INTO TableTwo ( -- Columns)
VALUES ( -- Values)
IF (@@ERROR <> 0) goto Truncater;
INSERT INTO TableThree ( -- Columns)
VALUES ( -- Values)
IF (@@ERROR <> 0) goto Truncater;
Truncater:
if(@@ERROR<>0)
begin
rollback tran
return -1 -- error flag
end
else
commit tran
GO
詳しくはこちらへ。