Имеем:
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;
}
Собстно - вопрос - я прав? и у всех ли такие проблемы?
Если тема где-то уже проскальзывала - ткните, я не нашел..