私はこれに頭を悩ませようとしましたが、うまくいかないので、ここに小さなテストケースを提示します。誰かが私に説明してくれることを願っています:
最初の小さなテスト データベース:
CREATE DATABASE test;
USE test;
CREATE TABLE testA (nr INT)
GO
CREATE TRIGGER triggerTestA
ON testA
FOR INSERT AS BEGIN
SET NOCOUNT ON;
IF EXISTS (SELECT nr FROM Inserted WHERE nr > 10)
RAISERROR('Too high number!', 16, 1);
END;
そして、ここに動作をテストするためのtSQLテストがあります:
ALTER PROCEDURE [mytests].[test1] AS
BEGIN
EXEC tSQLt.FakeTable @TableName = N'testA'
EXEC tSQLt.ApplyTrigger
@TableName = N'testA',
@TriggerName ='triggerTestA'
EXEC tSQLt.ExpectException
INSERT INTO dbo.testA VALUES (12)
END;
このテストは正常に実行されますが、トリガーは私が望むことを行いません: ユーザーが値 > 10 を入力できないようにします。このバージョンのトリガーは、私が望むことを行います:
CREATE TRIGGER triggerTestA
ON testA FOR INSERT AS BEGIN
SET NOCOUNT ON;
BEGIN TRANSACTION;
BEGIN TRY
IF EXISTS (SELECT nr FROM Inserted WHERE nr > 10)
RAISERROR('Too high number!', 16, 1);
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
THROW;
END CATCH;
END;
しかし、今度はテストが失敗し、A) エラーが発生した (これは予期されていたことです!)、B) ROLLBACK TRANSACTION に一致する BEGIN TRANSACTION が存在しないと述べています。この最後のエラーは tSQLt を取り囲むトランザクションに関連していると思いますが、私のトリガーが何らかの形でそれを妨害していると思いますが、私が期待するものではないことは確かです。
誰かが説明してくれますか?