Firebird2.0, CRM X25 3.0.4.112
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();
}
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.
Почему так? Нельзя ли как-то быстро обновлять поля?
Нравится
Точную причину назвать не могу. Рекомендую более детально отладить работу функции 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]
И покажите какой запрос идет.
[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 - она в принципе почти для этого и придумывалась. В Вашем случае можно было ее анализировать.
Не совсем так.
Мне нужно было убрать только возможность удаления права чтения.
Остальные права автор может менять как ему нужно.
Но это в принципе не важно.
Внесены также изменения в большое количество сервисов.