2

私はこれに頭を悩ませようとしましたが、うまくいかないので、ここに小さなテストケースを提示します。誰かが私に説明してくれることを願っています:

最初の小さなテスト データベース:

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 を取り囲むトランザクションに関連していると思いますが、私のトリガーが何らかの形でそれを妨害していると思いますが、私が期待するものではないことは確かです。

誰かが説明してくれますか?

4

1 に答える 1