tSQLt 不会将错误命名的约束 (PK_dbo ..) 应用于假表



将tSQLt测试添加到现有的生产产品中,因此我们无法更改表,约束等。 目前,所有约束都标记为"PK_dbo。违规类别",当它们应该像"PK_ViolationCategory"时

当我运行时:

EXEC tSQLt.NewTestClass 'AdHocReportFiltersTestConstraint';
GO
CREATE PROCEDURE [AdHocReportFiltersTestConstraint].[Setup]
AS
BEGIN
EXEC tSQLt.FakeTable 'dbo.AdHocReports'
END
GO

CREATE PROCEDURE [AdHocReportFiltersTestConstraint].[test_AdHocReportFilters_Constraint]
AS
BEGIN
DECLARE @Id uniqueidentifier = NEWID()  
DECLARE @Name NVARCHAR(Max) = 'Test_Name'
DECLARE @Value NVARCHAR(Max) = 'Test_Value'
DECLARE @AdHocReport_ID uniqueidentifier = NEWID()  
INSERT INTO dbo.AdHocReportFilters ([Id], [Name], [Value], [AdHocReport_Id])
VALUES (@Id, @Name, @Value, @AdHocReport_ID)
exec tSQLt.ApplyConstraint 'dbo.AdHocReports', 'PK_dbo.AdHocReportFilters';
END

EXEC tSQLt.RunTestClass 'AdHocReportFiltersTestConstraint';
GO

我收到错误,

(1 row affected)
[AdHocReportFiltersTestConstraint].[test_AdHocReportFilters_Constraint] failed: 
(Error) The INSERT statement conflicted with the FOREIGN KEY constraint 
"FK_dbo.AdHocReportFilters_dbo.AdHocReports_AdHocReport_Id". The conflict occurred in 
database "CR", table "dbo.tSQLt_tempobject_fbc9c8bf09e742929eccae914d5e440d", 
column 'Id'.[16,0]{test_AdHocReportFilters_Constraint,11}

关于如何解决这个问题的任何想法?

一旦我开始工作,我将添加第二条记录以违反 PK 约束并捕获错误。

只是看你的代码,我看到你正在做以下事情:

  1. 伪造表dbo。AdHocReports
  2. 在表 dbo 中插入一行。AdHocReportFilters
  3. 应用名为"PK_dbo.AdHocReportFilters"到表dbo。AdHocReports
  4. 然后,您将尝试添加另一行来验证PK_dbo。AdHocReportFilters 约束

您收到的错误似乎表明您违反了AdHocReportFilters表上的外键 - 这是意料之中的,因为该表未被伪造。

从测试名称中不清楚您是在尝试验证主键还是外键的行为。

查看这些步骤,我认为您可能混淆了两个表,但是如果没有更详细的代码(即CREATE TABLE(语句,我很难进一步帮助您。

有两个表:

dbo.AdHocReports (Id,... (more columns))
dbo.AdHocReportFilters ([Id], [Name], [Value], [AdHocReport_Id] ) 

AdHocReportFilters.AdHocReport_Id 是表 dbo 的外键。引用 dbo.AdHocReports.Id 的 AdHocReportFilters

当您在表格AdHocReportFilters中插入一行时,您应该确保AdHocReportFilters.AdHocReport_Id是表格id columndbo.AdHocReports

但是在您的SP中,@AdHocReport_IDNEWID(),这当然是唯一的值,因此不在表dbo.AdHocReports.Id

解决方法,

禁用外键约束

ALTER TABLE dbo.AdHocReportFilters NOCHECK CONSTRAINT FK_dbo.AdHocReportFilters_dbo.AdHocReports_AdHocReport_Id

最新更新