AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.07.2020, 08:20   #1  
oleggy is offline
oleggy
Участник
 
276 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
где хранятся имена индексов в 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 информации по индексам нет.
Старый 09.07.2020, 10:44   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,699 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Вам не требуется эта информация. Просто удаляете индекс в базе 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');
}
Параметр DbBackend::Sql для метода name() заставит вывести имя SQL. Если имени SQL нет, значит, соответствующий индекс в SQL не создается. Либо не активен, либо закрыт конфигурационным ключем


Если Вы не в курсе, то имя индекса SQL формируется следующим образом

"I_" + id-таблицы + "Имя в Axapta"

Так что, вполне можно "вычислить" нужное имя "вручную"
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 09.07.2020, 11:04   #4  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,317 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Имена индексов не хранятся нигде. Просто название индекса - уникально не в пределах таблицы, а в пределах БД. Поэтому надо "всего лишь" найти таблицу, на которой находится этот индекс и его оттуда удалить.
А вот как найти таблицу - подсказал Владимир Максимов
__________________
Возможно сделать все. Вопрос времени
Старый 10.07.2020, 09:05   #5  
oleggy is offline
oleggy
Участник
 
276 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
Имена индексов не хранятся нигде.
Имена индексов хранятся все таки в определенной таблице. Я об этом знал и искал решение. И вам не поверил.

Помог ответ 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   #6  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,317 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от oleggy Посмотреть сообщение
Имена индексов хранятся все таки в определенной таблице. Я об этом знал и искал решение. И вам не поверил.
Понятно. Значит я просто Вас неправильно понял. Я имел в виду, что они не хранятся в пользовательских таблицах. А так-то конечно - в системных таблицах SQL Server хранятся вообще все настройки.
__________________
Возможно сделать все. Вопрос времени
Старый 10.07.2020, 09:29   #7  
oleggy is offline
oleggy
Участник
 
276 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
Проблема была в том что в SQL была задублирована таблица которая никак не использовалась самой AX и в этой таблице был тот индекс который нужно было удалить.
Я его искал в корректной таблице и через джоб (Владимир Максимов) но найти не мог.

Последний раз редактировалось oleggy; 10.07.2020 в 09:32.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как из DAX запустить транзакцию, чтобы она блокировала таблицу во внешней MS SQL базе valmictar DAX: Программирование 9 27.12.2019 10:34
Ax2009 Установка расширен ср-в отчетности и SQL 2008 Arahnid DAX: Администрирование 10 29.08.2012 22:53
Помогите с выбором версии SQL Server для Ax2009 Predator DAX: Администрирование 9 02.02.2010 21:38

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 11:20.