我有一个Visual Studio数据库项目,其中包含一系列具有外键约束的表。
发布脚本包含添加约束脚本:
ALTER TABLE [dbo].[AttributeValue] WITH NOCHECK
ADD CONSTRAINT [FK_AttributeValue_Attribute]
FOREIGN KEY ([AttributeId]) REFERENCES [dbo].[Attribute] ([AttributeId]);
在脚本的最后,它启用了约束:
ALTER TABLE [dbo].[AttributeValue] WITH CHECK CHECK CONSTRAINT [FK_AttributeValue_Attribute];
问题是,它无法启用约束,因为它认为它不存在。如果我检查表格,我可以确认它不存在。
为什么没有创建约束?
如果我单独运行脚本,则create可以正常运行。
答案 0 :(得分:1)
这真的是每日WTF的参赛作品。
有人在项目中添加了一个构建后的脚本,执行以下步骤。
通过检查系统表来删除所有约束
添加一些数据
尝试通过检查系统表再次创建约束
当然,第3步什么都不做,因为在系统表中没有找到任何东西,因为它删除了第1步中的所有内容。
我对这个计划感到震惊,并将用以下内容取而代之:
第1步
EXEC sp_MSforeachtable @command1="print 'Disabling constraints: ?'", @command2="ALTER TABLE ? NOCHECK CONSTRAINT all"
第3步
EXEC sp_MSforeachtable @command1="print 'Enabling constraints: ?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"