В базе данных уже есть объект с именем 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
используется в вашей среде вообще? Я предполагаю, что нет, если вы не работаете с бразильскими компаниями.
Я бы предложил вам
- Временно изменить
ConfigurationKey
на столе от LedgerBasic к SysDeletedObjects63. - Щелкните правой кнопкой мыши таблицу, выберите "Синхронизировать". Это удалит таблицу из базы данных SQL.
- Попробуйте снова выполнить полную синхронизацию с БД, убедитесь, что ошибок нет.
- Удалить
ACOCostCenterAttributeValue_BR
таблицы из слоя, в котором вы работаете. Будет восстановлена версия таблицы уровня SYS сConfigurationKey
= LedgerBasic. - Щелкните правой кнопкой мыши таблицу, выберите "Синхронизировать". Это создаст таблицу в БД SQL. Если в этот момент вы начнете получать ошибки синхронизации БД, это будет означать, что в вашей БД что-то не так, например, другая таблица имеет индекс с таким же именем (I_100013RECID) или что-то подобное.
Имена ограничений должны быть уникальными в базе данных: могут ли быть ограничения с одинаковыми именами в БД?
Уникальные ограничения автоматически создают индексы: https://www.mssqltips.com/sqlservertip/4270/difference-between-sql-server-unique-indexes-and-unique-constraints/
Этот вопрос показывает различные способы получения всех ограничений: SQL Server 2008 - получение ограничений таблицы