Мне нужно разрешить некоторым пользователям редактировать только отдельные поля (разделять таблицу на несколько с связью «один к одному» не подходит, поскольку в будущем планируется разрешать или запрещать редактировать поля из той же таблицы, а пересоздавать таблицы проблематично). Использую TIBQuery в связке с TIBUpdateSQL. Например, разрешено редактировать только поле field3, а есть поля field1, field2, field3 и BLOB-поле notes. Но если в ModifySQL записать
Код: Выделить всё
update "table"
set
"field1" = :"field1",
"field2" = :"field2",
"field3" = :"field3",
"notes" = :notes
where
"id" = :"OLD_id"
Код: Выделить всё
ibqQuery: TIBQuery;
ibusUpdateSQL: TIBUpdateSQL;
procedure TfrmForm.ibqQueryBeforePost(DataSet: TDataSet);
function SQLGetUpdatedField(Field: TField; out SQL: string): boolean;
begin
Result := Field.NewValue <> Field.OldValue;
if Result then
SQL := Field.Origin + '=:' + Field.FieldName;
end;
var
TmpStr: string;
begin
ibusUpdateSQL.ModifySQL.Clear;
ibusUpdateSQL.ModifySQL.Add('UPDATE "table" SET ');
if SQLGetUpdatedField(ibqQuery.FieldByName('field1'), TmpStr) then
ibusUpdateSQL.ModifySQL.Add(TmpStr + ', ');
if SQLGetUpdatedField(ibqQuery.FieldByName('field2'), TmpStr) then
ibusUpdateSQL.ModifySQL.Add(TmpStr + ', ');
if SQLGetUpdatedField(ibqQuery.FieldByName('field3'), TmpStr) then
ibusUpdateSQL.ModifySQL.Add(TmpStr + ', ');
ibusUpdateSQL.ModifySQL.Add('"notes" = :notes ');
ibusUpdateSQL.ModifySQL.Add('WHERE "id" = :OLD_id');
end;
1. Есть ли способ лучше?
2. В BLOB-поле проверка Field.NewValue <> Field.OldValue не работает (поэтому приходится разрешать его редактирование). Как тогда отследить изменялось ли оно?
3. Как можно оптимизировать приведенный код.
Заранее спасибо!
PS. Еще приходит мысль об использовании триггера, в котором проверяется имя пользователя. Но этот вариант тоже не совсем подходит.