我试图用我的大脑来解决这个问题,但无法让它发挥作用,所以我在这里提出一个小测试用例,希望有人可以向我解释:
首先是一个小测试数据库:
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 围绕事务有关,并且我的触发器以某种方式干扰了它,但肯定不是我所期望的。
有人可以解释一下,也许可以帮我做对吗?