1
我試圖總結我解決這個大腦,但不能讓它工作,所以我在這裏提出一個小測試用例,並希望有人能向我解釋:tSQLt,觸發器和測試
首先一點測試數據庫:
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),沒有BEGIN TRANSACTION以匹配! ROLLBACK TRANSACTION。我想最後一個錯誤是與tSQLt周圍的事務有關,並且我的觸發器會干擾這一點,但這肯定不是我所期望的。
有人可以解釋,也許幫我做對了嗎?
謝謝,塞巴斯蒂安!做得很清楚! /安德斯 –