使用 tSQLt 测试唯一过滤索引
Test unique filtered index with tSQLt
目前我正在尝试测试具有唯一过滤索引的 table。到目前为止我发现的唯一建议是使用 CONSTRAINT 而不是索引,因为 tSQLt
有 ApplyConstraint
SP。但是我还是找不到如何进行过滤约束...有什么建议吗?
CREATE TABLE [dbo].[prime_rates]
(
[prime_rate] DECIMAL(5, 3) NOT NULL
, [start_date] DATE NOT NULL
, [end_date] DATE NOT NULL
DEFAULT '12/31/2099'
);
GO
CREATE UNIQUE INDEX [UIX_prime_rates_end_date]
ON [dbo].[prime_rates] ([end_date])
WHERE [end_date] = '12/31/2099';
GO
CREATE PROCEDURE [Test Class1].[test when 2 active prime rates are inserted then raise error]
AS
BEGIN
EXEC tSQLt.FakeTable @TableName = N'prime_rates';
EXEC tSQLt.ApplyConstraint 'dbo.prime_rates', 'UIX_prime_rates_end_date';
INSERT INTO dbo.prime_rates ( prime_rate
, start_date
, end_date
)
VALUES ( 1 -- prime_rate - decimal(5, 3)
, GETDATE() -- start_date - date
, '2099-12-31' -- end_date - date
);
EXEC tSQLt.ExpectException @ExpectedSeverity = 16;
INSERT INTO dbo.prime_rates ( prime_rate
, start_date
, end_date
)
VALUES ( 1 -- prime_rate - decimal(5, 3)
, GETDATE() -- start_date - date
, '2099-12-31' -- end_date - date
);
END;
基本上,您是在测试没有无意的架构更改破坏了(removed/disabled/changed 谓词)您的唯一过滤索引。
如果您伪造了 table,则您需要自己将唯一过滤索引添加到伪造品中,这否定了这一点。
这应该有效。
CREATE PROCEDURE [Test Class1].[test when 2 active prime rates are inserted then raise error]
AS
BEGIN
IF @@TRANCOUNT = 0
THROW 50000, 'This must be run in a transaction and rolled back afterwards. Use "EXEC tSQLt.RunAll;" etc. Don''t run directly ', 1;
TRUNCATE TABLE dbo.prime_rates;
INSERT INTO dbo.prime_rates
(prime_rate,
start_date,
end_date)
VALUES ( 1 -- prime_rate - decimal(5, 3)
,GETDATE() -- start_date - date
,'2099-12-31' -- end_date - date
);
EXEC tSQLt.ExpectException @ExpectedSeverity = 16;
INSERT INTO dbo.prime_rates
(prime_rate,
start_date,
end_date)
VALUES ( 1 -- prime_rate - decimal(5, 3)
,GETDATE() -- start_date - date
,'2099-12-31' -- end_date - date
);
END
目前我正在尝试测试具有唯一过滤索引的 table。到目前为止我发现的唯一建议是使用 CONSTRAINT 而不是索引,因为 tSQLt
有 ApplyConstraint
SP。但是我还是找不到如何进行过滤约束...有什么建议吗?
CREATE TABLE [dbo].[prime_rates]
(
[prime_rate] DECIMAL(5, 3) NOT NULL
, [start_date] DATE NOT NULL
, [end_date] DATE NOT NULL
DEFAULT '12/31/2099'
);
GO
CREATE UNIQUE INDEX [UIX_prime_rates_end_date]
ON [dbo].[prime_rates] ([end_date])
WHERE [end_date] = '12/31/2099';
GO
CREATE PROCEDURE [Test Class1].[test when 2 active prime rates are inserted then raise error]
AS
BEGIN
EXEC tSQLt.FakeTable @TableName = N'prime_rates';
EXEC tSQLt.ApplyConstraint 'dbo.prime_rates', 'UIX_prime_rates_end_date';
INSERT INTO dbo.prime_rates ( prime_rate
, start_date
, end_date
)
VALUES ( 1 -- prime_rate - decimal(5, 3)
, GETDATE() -- start_date - date
, '2099-12-31' -- end_date - date
);
EXEC tSQLt.ExpectException @ExpectedSeverity = 16;
INSERT INTO dbo.prime_rates ( prime_rate
, start_date
, end_date
)
VALUES ( 1 -- prime_rate - decimal(5, 3)
, GETDATE() -- start_date - date
, '2099-12-31' -- end_date - date
);
END;
基本上,您是在测试没有无意的架构更改破坏了(removed/disabled/changed 谓词)您的唯一过滤索引。
如果您伪造了 table,则您需要自己将唯一过滤索引添加到伪造品中,这否定了这一点。
这应该有效。
CREATE PROCEDURE [Test Class1].[test when 2 active prime rates are inserted then raise error]
AS
BEGIN
IF @@TRANCOUNT = 0
THROW 50000, 'This must be run in a transaction and rolled back afterwards. Use "EXEC tSQLt.RunAll;" etc. Don''t run directly ', 1;
TRUNCATE TABLE dbo.prime_rates;
INSERT INTO dbo.prime_rates
(prime_rate,
start_date,
end_date)
VALUES ( 1 -- prime_rate - decimal(5, 3)
,GETDATE() -- start_date - date
,'2099-12-31' -- end_date - date
);
EXEC tSQLt.ExpectException @ExpectedSeverity = 16;
INSERT INTO dbo.prime_rates
(prime_rate,
start_date,
end_date)
VALUES ( 1 -- prime_rate - decimal(5, 3)
,GETDATE() -- start_date - date
,'2099-12-31' -- end_date - date
);
END