В базе данных уже есть объект с именем I_XXXRECID

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

Описание ошибки SQL: [Microsoft][Собственный клиент SQL Server 11.0][SQL Server] В базе данных уже есть объект с именем "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 есть индекс с таким именем:

  • Но индекс не виден в таблице:

РЕДАКТИРОВАТЬ 1: Дополнительная информация

Нет конфликта в таблице ID:

Таблица из SSMS:

Удаление таблицы из SSMS:

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

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

3 ответа

Решение

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

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

[DBO]. [ACOCOSTCENTERATTRIBUTEVALUE_BR]

[DBO]. [Dbo.ACOCOSTCENTERATTRIBUTEVALUE_BR]

Я сбрасывал таблицу [dbo].[ACOCOSTCENTERATTRIBUTEVALUE_BR] из ssms и синхронизации из AOT, из-за которой ошибка сохранялась.

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

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

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

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

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

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

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

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

Другие вопросы по тегам