В базе данных уже есть объект с именем I_XXXRECID - PullRequest
3 голосов
/ 28 апреля 2019

Эта ошибка появляется при синхронизации DataDictionary.

Описание ошибки SQL: [Microsoft] [Собственный клиент SQL Server 11.0] [SQL Сервер] Уже есть объект с именем 'I_100013RECID' в базы данных.

Оператор SQL: ALTER TABLE "DBO" .ACOCOSTCENTERATTRIBUTEVALUE_BR ADD CONSTRAINT I_100013RECID ПЕРВИЧНЫЙ КЛЮЧ НЕКЛЮЧЕН (RECID)

Я скопировал всю базу данных по бизнесу и коду и создал новый AX Env. Я не уверен, есть ли эта ошибка и в исходном Env, но я хочу устранить ее в новом Env.

Что я уже пробовал:

  • Удалил таблицу из SQL Server Management Studio, а затем Синхронизировать с AOT, но ошибка сохраняется.

  • Попытка удалить имя индекса из SSMS:

    DROP INDEX I_100013RECID ON [ACOCOSTCENTERATTRIBUTEVALUE_BR]
    

    Но получаю эту ошибку:

Невозможно удалить индекс '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

Из 3 индексов, почему 2 индекса не удаляются при удалении таблицы из SSMS? Почему только 1 удаляется? Проверьте ниже для 3 индексов после синхронизации. Как от них избавиться? SSMS не позволит мне удалить его, сказав: «Каталог нельзя изменить». Могу ли я попытаться удалить его, изменив настройки основных данных? Я не уверен, что все таблицы, связанные с этой таблицей, заполнены в каталоге.

Синхронизация снова из AOT:

enter image description here

Ответы [ 3 ]

2 голосов
/ 30 апреля 2019

Таблица ACOCostCenterAttributeValue_BR используется в вашей среде вообще? Я предполагаю, что нет, если вы не работаете с бразильскими компаниями.

Я бы предложил вам

  1. Временно изменить ConfigurationKey в таблице с LedgerBasic на SysDeletedObjects63.
  2. Щелкните правой кнопкой мыши таблицу, выберите «Синхронизировать». Он удалит таблицу из БД SQL.
  3. Попробуйте снова выполнить полную синхронизацию с БД, убедитесь, что ошибок нет.
  4. Удалите таблицу ACOCostCenterAttributeValue_BR из слоя, в котором вы работаете. Она восстановит версию таблицы слоя SYS с ConfigurationKey = LedgerBasic.
  5. Щелкните правой кнопкой мыши таблицу, выберите «Синхронизировать». Это создаст таблицу в БД SQL. Если в этот момент вы начнете получать ошибки синхронизации БД, это будет означать, что в вашей БД что-то не так, например. другая таблица имеет индекс с тем же именем (I_100013RECID) или что-то в этом роде.
1 голос
/ 30 апреля 2019

Наконец я получил решение:

Проблема была в том, что было 2 таблицы

[dbo]. [ACOCOSTCENTERATTRIBUTEVALUE_BR]

[dbo]. [Dbo.ACOCOSTCENTERATTRIBUTEVALUE_BR]

Я удаляю таблицу [dbo]. [ACOCOSTCENTERATTRIBUTEVALUE_BR] из ssms и синхронизирую из AOT, из-за чего ошибка сохраняется.

Я удалил другую таблицу [dbo]. [Dbo.ACOCOSTCENTERATTRIBUTEVALUE_BR] (которого я даже не знал, что он существует, поскольку таблицы расположены в алфавитном порядке, и я смотрел только на первую таблицу) из ssms, а затем снова синхронизировал, и это было успешно.

Вторая таблица имелапрефикс "dbo."в его названии.Я абсолютно не имею ни малейшего представления о том, как он закрался, потому что я даже никогда не касался этого стола.

1 голос
/ 29 апреля 2019

Имена ограничений должны быть уникальными в базе данных: Могут ли быть ограничения с тем же именем в БД?

Уникальные ограничения автоматически создают индексы: https://www.mssqltips.com/sqlservertip/4270/difference-between-sql-server-unique-indexes-and-unique-constraints/

Этот вопрос показывает вам различные способы получить все ограничения: SQL Server 2008 - получить ограничения таблицы

...