1

我有这种奇怪的行为Schema Comparein Visual Studio 2017

  1. 在比较 2 个数据库时,我发现两个相同的表有所不同,其中一个没有PK名称。如果我使用脚本编写表,SSMS我会看到其中一台服务器上的表脚本确实似乎没有PK名称,但如果我查询sys.indexes表,我会发现该索引在两台服务器上都有相同的名称。

    我发现的一种可能的解决方案是更新表,假设添加一些随机索引并将其删除,所以我猜测它与 SQL Server 如何存储对象定义有关。但是很高兴知道是什么导致了这种情况以及如何以正确的方式解决它,而不是使用某种解决方法。

    PK_Diff

    ps 我知道这个PK名字不是“正确的”。

  2. 比较两个相同的情况时的类似情况SPs。我试图跑sp_refreshsqlmodulesp_recompile但它没有帮助。更新SP有帮助,但这又不是很好的解决方法。

    SP_diff

编辑 1:在第一个示例中,两个数据库上都存在同名的 PK(即使名称不符合标准)。在两个数据库上运行的以下查询返回相同的结果:

SELECT I.name 
FROM sys.indexes AS I
INNER JOIN sys.objects AS O
    ON O.object_id = I.object_id
INNER JOIN sys.schemas AS S
    ON S.schema_id = O.schema_id
WHERE S.name = 'MySchema'
AND O.name = 'MyName'

结果:PK__TraceDat__AAAC09D801ED28A5

4

2 回答 2

1

您注意到的两件事都是由于脚本的不良做法造成的,并且是可能导致问题的具体问题。虽然现在可能没有直接的问题,但未来可能会有。

在第一种情况下,您已经指出了根本问题,左侧没有 PK 的名称,而右侧有一些名称。实际上,所有约束总是有一个名称,您可以明确指出它,它就是名称。但是,如果创建脚本没有指示名称(如您的左侧),服务器将为约束创建一个随机名称(这就是您在右侧看到的)。这是一个问题,因为不同的服务器将有不同的约束名称(如果有多个数据库实例),并且如果您以后想要删除或更改约束,您将没有具体的名称来引用约束。真正的解决方案很简单,自己给约束起个名字,这样它就有了固定的引用。

第二种情况更糟。唯一的区别是左侧有一个没有模式的过程,而右侧它被明确定义为dbo. 数据库中的每个对象都存在于模式中,如果没有明确指出,则使用用户的默认模式来确定它。为什么这是一种不好的做法有多种原因(例如,在多模式数据库中,可能会出现歧义或选择错误的表,性能也会受到负面影响),因此解决方案是在以下情况下简单地命名正确的模式创建或修改表(查询也很重要,尽管在这里无关)。

于 2018-04-09T15:39:42.297 回答
0

我有时在重命名对象后使用 Apex sql diff 会遇到类似的问题。尝试删除/创建。这是问题的潜在原因。

于 2018-04-10T12:09:16.687 回答