Доброго времени суток.
Есть раздел Документы в нем есть различные статусы, сам документ формируется в другом разделе и в его деталь Файлы записывается 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
DELETE FROM [dbo].[tbl_FilesRight] WHERE([tbl_FilesRight].[RecordID] = :RecordID)
var DeleteQuery = Services.GetNewItemByUSI('dq_FileRightInDoc'); SetParameterValue(DeleteQuery.Parameters, 'RecordID', FileID); DeleteQuery.Filters.ItemsByCode('RecordID').IsEnabled = true; DeleteQuery.Execute();
По изменению, писать раздавать досуп
iq_GiveRightToFile:
INSERT INTO [dbo].[tbl_FilesRight] ([ID], [RecordID], [CanRead], [CanWrite], [CanDelete], [AdminUnitID]) VALUES (:ID, :RecordID, :CanRead, :CanWrite, :CanDelete, :AdminUnitID)
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(); }
Тут нужно дописать цикл что бы пройтись по всему датасету FileInDocByIdSq (т.е для всех файлов в детали)