|
09.07.2020, 08:20 | #1 |
Участник
|
где хранятся имена индексов в SQL базе AX2009
Привет.
При синхронизации таблицы, система сообщает: Новый уникальный индекс с именем "I_50753RECID" может вызвать нарушение уникального индекса". По окончании синхронизации выдает ошибку SQL: Описание ошибки SQL: [Microsoft][SQL Native Client][SQL Server]There is already an object named 'I_50753RECID' in the database. Оператор SQL: ALTER TABLE VTH_COSTCARDCALCULATORTAB50753 ADD CONSTRAINT I_50753RECID PRIMARY KEY NONCLUSTERED (DATAAREAID,RECID) Планирую в SQL данный индекс удалить, но никак не могу найти, где система хранит имена индексов. В SqlDictionary информации по индексам нет. |
|
10.07.2020, 09:05 | #3 |
Участник
|
Имена индексов хранятся все таки в определенной таблице. Я об этом знал и искал решение. И вам не поверил.
Помог ответ axm2017. Код: SET @nameIndex = 'I_50753RECID'; select s.name AS nameSchema , t.name AS nameTable , i.name AS nameIndex , c.name AS nameColumn , SqlDictionary.name AS nameTableAX from sys.tables t join sys.schemas s on t.schema_id = s.schema_id join sys.indexes i on i.object_id = t.object_id join sys.index_columns ic on ic.object_id = t.object_id join sys.columns c on c.object_id = t.object_id and ic.column_id = c.column_id LEFT JOIN SqlDictionary ON SqlDictionary.SqlName = t.name where i.name = @nameIndex Последний раз редактировалось oleggy; 10.07.2020 в 09:09. |
|
|
За это сообщение автора поблагодарили: sukhanchik (3). |
10.07.2020, 09:17 | #4 |
Administrator
|
Понятно. Значит я просто Вас неправильно понял. Я имел в виду, что они не хранятся в пользовательских таблицах. А так-то конечно - в системных таблицах SQL Server хранятся вообще все настройки.
__________________
Возможно сделать все. Вопрос времени |
|
10.07.2020, 09:29 | #5 |
Участник
|
Проблема была в том что в SQL была задублирована таблица которая никак не использовалась самой AX и в этой таблице был тот индекс который нужно было удалить.
Я его искал в корректной таблице и через джоб (Владимир Максимов) но найти не мог. Последний раз редактировалось oleggy; 10.07.2020 в 09:32. |
|
09.07.2020, 10:44 | #6 |
Участник
|
Вам не требуется эта информация. Просто удаляете индекс в базе SQL, а потом запускаете синхронизацию в Axapta. А дальше Axapta сама найдет все нужные реквизиты и создаст индекс в SQL
Однако получить имена индексов можно через классы DictXXX X++: static void job_Test(Args _args) { DictTable dictTable; DictIndex dictIndex; int idx; ; dictTable = new dictTable(tablenum(CustTable)); for (idx = 1; idx <= dictTable.indexCnt(); idx++) { dictIndex = dictTable.indexObject(dictTable.indexCnt2Id(idx)); info(strFmt('Axapta = %1, SQL = %2', dictIndex.name(DbBackend::Native), dictIndex.name(DbBackend::Sql))); } info('End'); } Если Вы не в курсе, то имя индекса SQL формируется следующим образом "I_" + id-таблицы + "Имя в Axapta" Так что, вполне можно "вычислить" нужное имя "вручную"
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
09.07.2020, 11:04 | #7 |
Administrator
|
Имена индексов не хранятся нигде. Просто название индекса - уникально не в пределах таблицы, а в пределах БД. Поэтому надо "всего лишь" найти таблицу, на которой находится этот индекс и его оттуда удалить.
А вот как найти таблицу - подсказал Владимир Максимов
__________________
Возможно сделать все. Вопрос времени |
|