Показать сообщение отдельно
Старый 03.12.2007, 17:42   #1  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Вопрос поисследовать SqlScanMain\dropIndex
Имеем:
Ax4.0 sp1, sql 2005
таблица TransactTxt

при запуске синхронизации с проверкой Аксапте рвет голову на индексе
DataRecidIdx, в котором поля dataAreaId, Recid. Она считает, что поля в скуле и в словаре поменяны местами - ну это ладно, дальше она пытается этот индекс дропнуть :


X++:
void dropIndex(Statement stmt)
{
    SqlStatementExecutePermission ssep;
    str sqlString;
    ;

    if (sQLIndex.isIndexPrimary())
        this.dropConstraint(sQLIndex.getIndexName());

        // on Oracle, the primary index is dropped together with the constraint
    if (!(sQLIndex.isIndexPrimary() && SqlSystem::databaseBackendId() == DatabaseId::Oracle))
    {
        if( nIndexMask & #SQLFIELD_FLAG ) // Flag designating that index references must be prefixes with tablename
            sqlString = 'drop index ' + dictTable.name(DbBackend::Sql) + '.' + sQLIndex.getIndexName();
        else
            sqlString = 'drop index ' + sQLIndex.getIndexName();

        // dangerous API mitigation
        ssep =  new SqlStatementExecutePermission(sqlString);
        ssep.assert();
        // BP Deviation Documented
        stmt.executeUpdate(sqlString);
    }
}
Тут она дропает Constraint - прально, потому что индекс праймари и просто так не удалится

X++:
if (sQLIndex.isIndexPrimary())
        this.dropConstraint(sQLIndex.getIndexName());
но дальше удивительно

X++:
// on Oracle, the primary index is dropped together with the constraint
так вот - у меня sql 2005 и выполняя
X++:
alter table TRANSACTTXT drop constraint I_483DATARECIDIDX
я вижу что соответствующий индекс так же удаляется, хоть и не оракл вовсе. Соотв. она дальше пытается дропнуть индекс (которого уже нет) и вываливается ошибка синхронизации.

Напрашивается очевидное лечение (в данное время в данном месте - как в предыдущих скулях не смотрел, может надо учесть)

X++:
if (sQLIndex.isIndexPrimary())
{
        this.dropConstraint(sQLIndex.getIndexName());
        return;
}
Собстно - вопрос - я прав? и у всех ли такие проблемы?

Если тема где-то уже проскальзывала - ткните, я не нашел..

Последний раз редактировалось MironovI; 03.12.2007 в 17:51.