В одной таблице ведутся несколько журналов учета операций, потому что изначально не было разговора о разделенном доступе. А теперь встал такой вопрос. То есть пользователь заходит по логину/паролю и должен видеть/править только ему подобающий журнал операций. Если бы таблицы были разные - тогда через mdw на каждую доступ для конктретного пользователя поставил и все ОК. А как бы сделать, чтобы не пилить таблицу? Пока мысля шевелится такая: В таблице "Операции" уже есть поле "User" - в него автоматом заносится логин пользователя, который работает с таблицей. Когда пользователь открывает форму "Операции" в ней источник отфильтрован по его логину - стало быть он видит только свои дела. Он работает - его логин автоматом заносится в поле таблицы, стало быть новые записи, что он сделал, тоже только он потом увидит. Вроде все нормально, за исключением одного: если хитрый пользователь влезет в "Сервер" и поставит руками свой логин в поле таблицы "Операции", то ....
Умные люди посоветовали так:
· с таблицы убрать все права для пользователей, кроме владельца
· создать запрос на базе таблицы, с Where tbl.User = CurrentUser() и прописать открытие запроса с правами владельца
· вместо таблицы везде пользовать данный запрос
По сути это означает, что нужно сделать запрос и сохранить его под именем таблицы. То есть так:
SELECT ОПЕРАЦИИ.*
FROM ОПЕРАЦИИ IN IN '\\server\database\my.mdb'
WHERE ОПЕРАЦИИ.Изменил)=CurrentUser()
WITH OWNERACCESS OPTION;
Все работает, но осталась проблема – нужно подставлять в запрос путь к my.mdb. Сделал функцию в общем модуле, которая читает путь из таблицы, где он хранится
Public Function fCurrentPath() As String
fCurrentPath = DLookup("SystemPath", "tGlobalParam", "")
End Function
И переделал запрос
FROM ОПЕРАЦИИ IN ''' & fCurrentPath() & '''
Но в результате пишет, что не может найти Document and Settings и прочая и прочая. Лезет стало быть в Администратора, мои документы... И чего оно там забыло? Если колдовать с кавычками - все одно из двух: либо ошибка синтаксиса в FROM, либо опять администратор к столу зовет.
И в чем же тут ошибка?
Проще зашифровать имя пользователя простым алгоритмом, код спрятать в самой программе или прицепить к базе библиотеку.
Речь ведь не о простом разделении записей в таблице, а о запрете польозователю просматривать таблицу напрямую, минуя формы. Для этого таблица не доступна никому, кроме админа. А пользователи просматривают ее через специальный запрос, который приведен выше. Осталось только воткнуть в него путь к базе. Но продлема в том, что запрос такого рода нельзя прописывать как SQL - выражение в VBA. Работать не будет. Надо редактировать сам запрос.
вот о чем речь, там и макет базы прилагается http://www.sql.ru/forum/actualthread.aspx?tid=483538&pg=1
1. Ну и пусть он видит таблицу. Главное это то, что нужная информация (сумма, кому) зашифрована. Вообще в простых базах запланировано, что таблицы долны просматриваться. Например, если я вижу в таблице пароль - это не значит, что я могу зайти в базу данных под этим паролем (он же зашифрован). Более сложные базы данных типа SQL Server имеет разный доступ к записям, т.е. вы можете или назначить каждой записе пользователя или повесить триггер на SELECT. В этом случае, записи нельзя просматривать. В принципе есть и другие решения. Сделать ADO соединение с файлом mdb, и в форме заменить recordset на другой.
2. В данном случае, надо попытаться создать на этапе открытия формы новый источник записи ввиде текстовой переменной (без функций). Ее подставить в форму, тогда все будет работать.