数据库中已经存在一个名为 I_XXXRECID 的对象。

3

在同步数据字典时出现了这个错误。

SQL错误描述:[Microsoft][SQL Server Native Client 11.0][SQL Server] 数据库中已有一个名为 'I_100013RECID' 的对象。

SQL语句:ALTER TABLE "DBO".ACOCOSTCENTERATTRIBUTEVALUE_BR ADD CONSTRAINT I_100013RECID PRIMARY KEY NONCLUSTERED (RECID)

我复制了整个业务和代码数据库,并创建了一个新的AX环境。我不确定源环境中是否存在此错误,但我希望在新环境中解决这个问题。

我已经尝试过的方法:

  • Deleted the table from SQL Server Management Studio and then Synchronize from AOT but the error persists.

  • Tried to drop the index name from SSMS:

    DROP INDEX I_100013RECID ON [ACOCOSTCENTERATTRIBUTEVALUE_BR]
    

    But getting this error:

无法删除索引“ACOCOSTCENTERATTRIBUTEVALUE_BR.I_100013RECID”,因为它不存在或您没有权限。

但是在查询索引时,它显示的是正确的表:

select object_name(object_id) from sys.indexes WHERE name =  'I_100013RECID'

输出:

   dbo.ACOCOSTCENTERATTRIBUTEVALUE_BR
  • 查询sys.indexes后发现有一个名称为该名称的索引:

enter image description here

  • 但该索引在表中不可见:

enter image description here

编辑 1:额外信息

表ID无冲突:

enter image description here

来自 SSMS 的表:

enter image description here

从 SSMS 中删除表:

enter image description here

在我从 SSMS 中删除表时,为什么 2 个索引没有被删除,只有 1 个被删除?请查看下面的 3 个索引的同步后情况。如何摆脱这些索引? SSMS 告诉我“目录无法修改”,我能否尝试通过更改主数据上的设置来删除它?我不确定与此表相关的所有表在目录中都是否被填充。

从 AOT 再次同步:

enter image description here


你运行的语句是什么,出现了什么错误?别忘了,我们看不到你看到的。 - Thom A
@Larnu 更新了 T-SQL 语句以及问题中的错误。 - Mohammad Yusuf
结果显示主键约束已经存在。要删除它,请使用'ALTER TABLE "dbo".ACOCOSTCENTERATTRIBUTEVALUE_BR DROP CONSTRAINT I_100013RECID`;' - Dan Guzman
@AlexKwitny 你好Alex,我已经包含了一些额外的信息,请确认一下。我用命令行AXBuild.exe运行了完整编译,然后运行了完整数据字典同步。但是错误仍然存在。我应该尝试右键点击AOT编译吗?在我所使用的系统上需要花费5个多小时。 - Mohammad Yusuf
1
@MYGz,一个人永远不应该修改系统表。这不是解决你的问题的方法。我猜你已经在另一个表上有一个同名的约束。尝试运行 SELECT OBJECT_NAME(object_id) AS TableName, * FROM sys.indexes AS I ORDER BY TableName, i.name; - Dan Guzman
显示剩余9条评论
3个回答

2
您的环境中是否使用表格ACOCostCenterAttributeValue_BR?我猜想不会,除非您与巴西公司合作。
我建议您:
1. 暂时将表格上的ConfigurationKey从LedgerBasic更改为SysDeletedObjects63。 2. 右键单击表格,选择同步。这将从SQL数据库中删除表格。 3. 再次运行完整的DB同步,确保没有错误。 4. 从您正在使用的层中删除ACOCostCenterAttributeValue_BR表格。它将恢复带有ConfigurationKey = LedgerBasic的SYS层版本的表格。 5. 右键单击表格,选择同步。这将在SQL数据库中创建表格。如果此时开始出现DB同步错误,则意味着数据库中还有其他问题,例如另一个表格具有相同名称的索引(I_100013RECID)等。

1

1

最终我找到了解决方案:

问题出在有2个表格。

[dbo].[ACOCOSTCENTERATTRIBUTEVALUE_BR]

[dbo].[dbo.ACOCOSTCENTERATTRIBUTEVALUE_BR]

我正在从ssms中删除表[dbo].[ACOCOSTCENTERATTRIBUTEVALUE_BR]并从AOT同步,这导致错误仍然存在。
我删除了另一个表[dbo].[dbo.ACOCOSTCENTERATTRIBUTEVALUE_BR](我甚至不知道它的存在,因为表按字母顺序排列,我只看了第一个表),然后再次同步,成功了。
第二个表的名称中有一个前缀“dbo。”。我绝对不知道它是如何出现的,因为我以前从未碰过这个表。

2
这很奇怪,我从未见过这种情况。很高兴你找到了问题所在。不过奇怪的是,AX 显然仍在尝试与错误的表进行交互。在完全同步数据库之后,第二个问题是否还会出现? - Alex Kwitny
@AlexKwitny,尤其是当我以前从未与该表交互过的时候,是的,这样做确实很重要。我尚未运行完整的DataDictionary Sync。此表上的同步错误已经消失。我会尝试完整的DD同步并进行更新。 - Mohammad Yusuf
@AlexKwitny 你好,Alex,我又同步了 DD。没有错误。我从 SSMS 中删除的带有“dbo.”前缀的表没有再次出现。 - Mohammad Yusuf
我能想到唯一可能导致这种情况的原因是,如果你恢复到一个具有不同内核版本的环境中,或者你连接了一个具有不同内核版本的 AX 客户端。请检查你所使用的所有机器上的“帮助 > 关于”选项。在你从中复制的 AOS 上,你去过的那个 AOS 上,以及你在终端服务器上使用的任何客户端上进行比较。如果任何“帮助 > 关于”选项中的数字不匹配,那就可能是问题的原因。 - Alex Kwitny
1
@AlexKwitny 是的,我从原始环境中复制数据库时没有遇到这个问题。只有副本和[副本的副本]才会出现此问题。我检查了内核版本和应用程序版本。所有3个客户端的版本都完全相同。尽管如此,我在这里学到了以下内容:1.约束名称应在整个数据库中唯一。2.不要修改“sys.tables eg. sys.indexes”,SQL无论如何都不允许您进行修改。3.'table1'和'dbo.table1'可以是单独的表。4.就像索引一样,表也可以从SSMS中删除并从AOT中再次同步。所以这里学到了很多 :) - Mohammad Yusuf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接