Скрипты
Разработка

Жутко долго выполняется скрипт с UpdateQuery

Firebird2.0, CRM X25 3.0.4.112

if (Assigned(RightsDataset)) {
var UQ = Services.GetNewItemByUSI('uq_Rights');
RightsDataset.DisableEvents();
EnableDatasetFilters(RightsDataset, false, 'ID');
EnableDatasetFilters(RightsDataset, false, 'UserContactID');
ApplyDatasetFilter(RightsDataset, 'RecordID', ID, true);
ApplyDatasetFilter(RightsDataset, 'AdminUnitID', UsID, true);
RightsDataset.Open();
if (IsDatasetEmpty(RightsDataset)) {
AddAccessRecord2(RightsDataset, ID, UsID, CanRead, CanWrite,
CanDelete, CanChangeAccess, CanDel);
} else {
var RightID=RightsDataset.ValAsGUID('ID');
if (!IsEmptyValue(RightID)) {
//UpdateAccessRecord2(UQ, RightID, CanRead, CanWrite,
//CanDelete, CanChangeAccess, CanDel);
}
}
RightsDataset.Close();
RightsDataset.EnableEvents();
AdminUnitDataset.GotoNext();
}

function AddAccessRecord2(Dataset, RecordID, AdminUnitID, CanRead,
        CanWrite, CanDelete, CanChangeAccess, CanDel) {
        var FieldValues = new Array (RecordID, AdminUnitID, CanRead,
                CanWrite, CanDelete, CanChangeAccess, CanDel);
        var FieldNames = new Array ('RecordID', 'AdminUnitID', 'CanRead',
                'CanWrite',     'CanDelete', 'CanChangeAccess', 'CanDel');
    AppendRecordInDataset(Dataset, FieldNames, FieldValues);
}
function UpdateAccessRecord2(UpdateQuery, ID, CanRead,
        CanWrite, CanDelete, CanChangeAccess, CanDel) {
        var FieldValues = new Array (CanRead,
                CanWrite, CanDelete, CanChangeAccess, CanDel);
        var FieldNames = new Array ('CanRead',
                'CanWrite',     'CanDelete', 'CanChangeAccess', 'CanDel');
    UpdateRecordField(UpdateQuery, ID, FieldNames, FieldValues);
}

AddAccessRecord2 выполняется доли секунды, а UpdateAccessRecord2 - секунд 10-15.
Почему так? Нельзя ли как-то быстро обновлять поля?

Нравится

13 комментариев

Точную причину назвать не могу. Рекомендую более детально отладить работу функции UpdateRecordField, возможно, причина задержек вовсе не в БД, а в коде конфигурации.
Для отладки по шагам и оценкой времени выполнения можно после каждой строки выводить в лог некоторое сообщение, при выводе сообщения осуществляется вывод точного времени, поэтому можно проанализировать, сколько времени выполнялась та или иная строка кода.

Здравствуйте!
1. Что собой представляет uq_Rights?
2. Какую таблицу Вы обновляете? Нет ли на ней триггеров?
3. Под администратором тормозит или под пользователем?

1.[javascript]
<?xml version="1.0" encoding="UTF-8"?>

[/javascript]
2. Обновляю в данном случае tbl_TaskRight. А так собираюсь обновлять любую tbl_...Right. Триггеров нет.
3. И под администратором и под пользователем.

1. Сколько записей в tbl_TaskRight?
2. Можете выполнить в IBExpert, заполнив параметры:
[sql]
UPDATE "tbl_TaskRight"
SET "CanRead" = :CanRead,
"CanWrite" = :CanWrite,
"CanDelete" = :CanDelete,
"CanChangeAccess" = :CanChangeAccess
WHERE("tbl_TaskRight"."ID" = :ID);
[/sql]
Сколько он будет выполняться?

1. 7400
2.
[sql]
UPDATE "tbl_TaskRight"
SET "CanRead" = 1,
"CanWrite" = 1,
"CanDelete" = 1,
"CanChangeAccess" = 1,
"CanDel" = 1
WHERE "tbl_TaskRight"."ID" = '{00E928BC-AF61-4FE5-8E61-2ADAC846D671}';
[/sql]
Время выполнения запроса = 109ms

Значит где-то тормозит конфигурация. Как Вы определили что "тормозит" именно UpdateRecordField?
И еще:
В ф-ции UpdateRecordField там где идет Execute:
[javascript]
...
Log.Write(1, Connector.DBEngine.GetUpdateQuerySQLText(UpdateQuery));
UpdateQuery.Execute();
...
[/javascript]
И покажите какой запрос идет.

А что за поле CanDel?

[javascript]
[08.09.12 13.35.23.240] (W) До UpdateAccessRecord2
[08.09.12 13.35.23.255] (W) UPDATE "tbl_TaskRight"
SET "CanRead" = :CanRead,
"CanWrite" = :CanWrite,
"CanDelete" = :CanDelete,
"CanChangeAccess" = :CanChangeAccess,
"CanDel" = :CanDel
WHERE
('{F0FD6878-9F79-4273-9D73-7B63FFDDD08B}' = :ID)
[08.09.12 13.35.27.772] (W) После UpdateAccessRecord2
[08.09.12 13.35.27.803] (W) До UpdateAccessRecord2
[08.09.12 13.35.27.803] (W) UPDATE "tbl_TaskRight"
SET "CanRead" = :CanRead,
"CanWrite" = :CanWrite,
"CanDelete" = :CanDelete,
"CanChangeAccess" = :CanChangeAccess,
"CanDel" = :CanDel
WHERE
('{BAC3ABC0-C71A-4DC2-9874-565A9D4B94BB}' = :ID)
[08.09.12 13.35.32.445] (W) После UpdateAccessRecord2
[/javascript]
CanDel такое же булевское поле как и остальные Can...

Проблема решена.
В UpdateQuery было условие параметр = параметр
:)

Сразу не заметил - у Вас ошибка в фильтре ID. В каждой части у Вас параметр причем один и тот же. И Вы обновляли все(!) записи таблицы tbl_TaskRight. Надо одну из частей заменить на поле tbl_TaskRight.ID
А зачем это поле CanDel? В таблицы прав строго не рекомендуется вносить изменения, т.к. при обновлении версий и т.п. Вы потеряте его, даже более того - при снятии/установке в таблице tbl_Task - Администрируется по записям.

3.0 дальше развиваться не будет.
А переходить на новую версию мы не собираемся, так как это требует покупки лицензий и внесение изменений в базовую конфигурацию снова.
CanDel нужно для того, чтобы указать может ли владелец записи удалять данную запись прав доступа.
Нам не нужно чтобы сотрудник мог удалять из доступа своего начальника.
И кроме как внесение изменений в tbl_TaskRight я не придумал решения.

Ну можно было использовать CanChangeAccess - она в принципе почти для этого и придумывалась. В Вашем случае можно было ее анализировать.

Не совсем так.
Мне нужно было убрать только возможность удаления права чтения.
Остальные права автор может менять как ему нужно.

Но это в принципе не важно.
Внесены также изменения в большое количество сервисов.

Показать все комментарии