Нет доступа к записи журнала tbl_DocumentLog

У пользователя (не являющегося администратором), создавшего запись в таблице tbl_Document, есть права на изменение этой запись в представлении vw_Document (проверяю с помощью MS SQL Server Management Studio), но нет прав на изменение соответствующей записи в журнале (представление vw_DocumentLog). В записи таблицы tbl_DocumentRight для этой записи и этого пользователя во всех столбцах CanXXX стоит 1.

При попытке обновления записи в журнале выводится сообщение:
TSObjectLibrary.UpdateQuery: The UPDATE permission was denied on the object 'vw_DocumentLog', database 'Terrasoft', schema 'dbo'

Что не так?

Нравится

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

Мне думается, что это нормальное положение дел. Какой смысл в журнале изменений, который можно редактировать???
По-умолчанию кнопок на детали изменений быть не должно. А на сервере не должно быть разрешений ни на что, кроме чтения, т.к. записи в лог добавляются триггером.

Смысл в том, что, при переводе документа в состояние Отменен, пользователь должен указать причину, которая затем записывается в журнал. Для пользователя-администратора это работает.

мне кажется, что журнал изменений создан скорее для того, чтобы была история изменения неких важных полей, которые Вы выбираете в настройках. При этом как верно написал Дмитрий вставка записей происходит триггером.
Причина закрытия документа у Вас хранится в tbl_Document ? или вы переписывали логику и хотели сделать так, чтобы причина писалась сразу в tbl_DocumentLog ?

Антон. Вижу для Вас два выхода - подправить триггер tr_tbl_Document_IU так, как Вам будет удобно. Либо дать права пользователям на vw_DocumentLog на Вставку. Ну или не переиначивать заложенную логику, а сделать как-то по-другому - например, при изменении стадии на Отменен делать видимым и обязательным поле "Причина отмены" (или типа того).
Для этого надо:
1) Добавить это поле edtCancelReason (или типа того) и сделать его невидимым и необязательным
2) В функцию function dlDataOnDataChange скрипта scr_DocumentEdit после

		case ('DocumentTypeID'):
			edtState.UnprepareDropDownList();
			break;

добавить

		case ('StateID'):
			edtCancelReason.IsVisible = Dataser.ValAsGUID('StateID') == '{сюда вписать ID из таблицы tbl_DocumentState для записи "Отменен" - фигурные скобки оставить}';
			DataField.IsRequired = Dataser.ValAsGUID('StateID') == '{сюда вписать ID из таблицы tbl_DocumentState для записи "Отменен" - фигурные скобки оставить}';
			break;

Спасибо, Виктория и Дмитрий. По ТЗ причина отмены должна записываться именно в Журнал изменений и там же отображаться. Триггер изменять не вариант, т.к. он автоматически перезаписывается при обновлении сервиса таблицы tbl_DocumentLog. Вдруг потом он будет кем-то обновлен, а случаи бывают разные :). Просто дам права на обновление vw_DocumentLog.

"Антон Батюк" написал:Просто дам права на обновление vw_DocumentLog

Антон, давать права на изменение таблицы или вью журнала я бы не рекомендовал. На то он и журнал, чтобы он был в режиме чтения. Лучше создайте хранимку и полностью контролируйте, что будет сделано с данными (например, нельзя менять какую-то колонку или записи, которые создал не я), и дайте права на ее запуск всем. Запускайте ее в том месте, где у вас в конфигурации кастомная логика.
С уважением, Александр

Да, Александр, это была моя первоначальная идея - с хранимой процедурой, запускаемой от имени администратора. Права тоже автоматически перезатираются при изменениях в клиенте в разделе Администрирование. Спасибо! Хранимая - "железный" вариант.

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