tsqlt テストで TRY/CATCH ブロックを使用していない可能性があります。
エラー メッセージ " There was also a ROLLBACK ERROR --> The current transaction cannot be commit and cannot be roll back to a savepoint. Roll back the whole transaction. " は、次のように再現できます。
1) エラーをスローしてロールバックするトリガーを次のように作成します。
CREATE TRIGGER [dbo].[MyTable_IUDTR] ON [dbo].[MyTable]
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
BEGIN TRY
RAISERROR('MyError', 16, 1)
END TRY
BEGIN CATCH
THROW;
END CATCH
END
GO
2) tsqlt テストを作成して、返されたエラー メッセージを確認します。
CREATE PROC [ut_MyTable_IUDTR].[test that the error is returned]
AS
BEGIN
DECLARE @ErrorMsg VARCHAR(50)
EXEC tsqlt.FakeTable @TableName = 'MyTable'
EXEC tsqlt.ApplyTrigger 'MyTable', 'MyTable_IUDTR'
INSERT INTO dbo.MyTable
( FirstName, LastName )
VALUES ( N'John',N'Smith')
SET @ErrorMsg = ERROR_MESSAGE()
EXEC tSQLt.AssertEqualsString @Expected = 'MyError', @Actual = @ErrorMsg
END
GO
3) テストを実行します。
EXEC [tSQLt].Run 'ut_MyTable_IUDTR.test that the error is returned'
4) 次のエラーが表示されます。
There was also a ROLLBACK ERROR --> The current transaction cannot be committed and cannot be rolled back to a savepoint. Roll back the entire transaction.
修正:
次のように、TRY/CATCH ブロックを含めるように tsqlt テストを変更します。
ALTER PROC [ut_MyTable_IUDTR].[test that the error is returned]
AS
BEGIN
DECLARE @ErrorMsg VARCHAR(50)
EXEC tsqlt.FakeTable @TableName = 'MyTable'
EXEC tsqlt.ApplyTrigger 'MyTable', 'MyTable_IUDTR'
BEGIN TRY
INSERT INTO dbo.MyTable
( FirstName, LastName )
VALUES ( N'John',N'Smith')
END TRY
BEGIN CATCH
SET @ErrorMsg = ERROR_MESSAGE()
END CATCH
EXEC tSQLt.AssertEqualsString @Expected = 'MyError', @Actual = @ErrorMsg
END
GO