Доброго времени суток.
Есть раздел Документы в нем есть различные статусы, сам документ формируется в другом разделе и в его деталь Файлы записывается pdf файл отчета FR (Экспорт отчета FastReport в деталь Файлы в формате PDF для выделенных записей в реестре), так вот задача в том что бы пользователи не видели этот прикрепленный к Документу файл до тех пор пока не установлен статус Утверждено (статус Документа).
Таблица tbl_Files администрируется по записям, следовательно можно ограничить доступ всем группам и пользователям после самой записи документа в деталь, проще всего сделать это через UpdateQuery
UpdateQuery.ColumnsValues.ItemsByName('CanRead').Value = 0;
UpdateQuery.ColumnsValues.ItemsByName('CanWrite').Value = 0;
UpdateQuery.ColumnsValues.ItemsByName('CanDelete').Value = 0;
UpdateQuery.ColumnsValues.ItemsByName('CanChangeAccess').Value = 0;
var Parameters = UpdateQuery.Parameters;
SetParameterValue(Parameters, 'RecordID', FileID);
UpdateQuery.Execute();
UpdateQuery:
SET [CanRead] = :CanRead,
[CanWrite] = :CanWrite,
[CanDelete] = :CanDelete,
[CanChangeAccess] = :CanChangeAccess
WHERE([tbl_FilesRight].[RecordID] = :RecordID)
Так вот если мы зайдем под пользователем не админом, посмотрим в детали Файлы -> Операции -> Права доступа, увидим что прав как бы и нет (не стоят галочки), а файл пользователь все равно видит и может открыть. Подскажите что делать.
Конфигурация 3.4.0.87
SQL Server 2008
Нравится
Решение:
Убивать с tbl_FilesRight записи которые сгенерились триггером tbl_Files
DeleteQuery
[sql]
DELETE FROM [dbo].[tbl_FilesRight]
WHERE([tbl_FilesRight].[RecordID] = :RecordID)
[/sql]
[javascript]
var DeleteQuery = Services.GetNewItemByUSI('dq_FileRightInDoc');
SetParameterValue(DeleteQuery.Parameters, 'RecordID', FileID);
DeleteQuery.Filters.ItemsByCode('RecordID').IsEnabled = true;
DeleteQuery.Execute();
[/javascript]
По изменению, писать раздавать досуп
iq_GiveRightToFile:
[sql]
INSERT INTO [dbo].[tbl_FilesRight] ([ID], [RecordID], [CanRead], [CanWrite], [CanDelete], [AdminUnitID])
VALUES (:ID, :RecordID, :CanRead, :CanWrite, :CanDelete, :AdminUnitID)
[/sql]
[javascript]
function dlDataOnDatasetAfterPost(Dataset) {
...
var FileInDocByIdSq = Services.GetNewItemByUSI('sq_FileInDocById');
FileInDocByIdSq.Parameters.ItemsByName('DocumentID').Value = Dataset('ID');
var DatasetFileInDocById = FileInDocByIdSq.Open();
var SelectQuery = Services.GetNewItemByUSI('sq_FileRightInDoc');
SelectQuery.Parameters('RecordID').Value = DatasetFileInDocById('FileID');
var DatasetSq = SelectQuery.Open();
if (Dataset('StateID') == '{670FDB86-A5EB-4AC0-9CCF-E303C5A8016E}' && (DatasetSq.RecordsCount == 0) )
{
var DocumentInsertQuery = Services.GetNewItemByUSI('iq_GiveRightToFile');
var ColumnsValues = DocumentInsertQuery.ColumnsValues;
ColumnsValues.Items(0).Value = Connector.GenGUID();
ColumnsValues.Items(1).Value = DatasetFileInDocById('FileID');
ColumnsValues.Items(2).Value = 1;
ColumnsValues.Items(3).Value = 1;
ColumnsValues.Items(4).Value = 1;
ColumnsValues.Items(5).Value = '{97490F89-2943-480D-9AFE-B1C95DE00010}'; //Все пользователи
DocumentInsertQuery.Execute();
}
DatasetFileInDocById.Close()
DatasetSq.Close();
}
[/javascript]
Тут нужно дописать цикл что бы пройтись по всему датасету FileInDocByIdSq (т.е для всех файлов в детали)