177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
|
|
1 | |
Работа с таблицами разделённой базы через экземпляры классов. Как?18.11.2011, 13:31. Показов 3581. Ответов 17
Метки нет (Все метки)
Уважаемые форумчане, помогите разобраться в вопросе.
Стоит задача ограничить доступ к данным из базы. Что сделано: 1) База разделена на файл таблиц и файл юзверя (формы, отчёты) 2) Файл с таблицами лежит в отдельной папке, защищённой средствами NTFS. Теперь без ста грамм и прав админа её не унесёшь. 3) Чтоб каждый имел доступ только к тем данным с которыми положено ему работать, в файле юзверя прилинкованы не все таблицы, а только те, что ему разрешены (пару общих таблиц и пару "персональных"). А чтоб сами не подключили остальные таблицы, файл с таблицами запаролен. 4) В файле юзверя нет запросов (как отдельных объектов) -- все запросы в свойствах форм/отчётов, их контролов и в коде VBA. 5) Файл юзверя окомпилирован -- сохранен в формате ".accde". Теперь не посмотришь код. 6) Срыть область переходов и сделать защиту от загрузки с "Shift". Хоть в этом смысла не вижу, всё же сделал (больше для галочки -- от чайников). Обходится на "раз, два, три". Достаточно положить файл в "ненадёжное место" (главное чтоб Access считал его таковым ) и всё -- защиты нет -- Access блокирует код VBA и защита не работает. Из того, что предлагается на форуме осталось всего ничего -- сделать шифрование данных. Покурив форум с большего разобрался. Так что можно считать этот вопрос решённым . Спасибо HOUSE MD с его примерами. Однако, осталось ещё одно узкое место в защите -- таблицы (особенно с учётом п.6). Тут меня посетила мысль: самая лучшая защита -- отсутствие объекта, который нужно защищать Нет связанных таблиц -- нет проблем. Значит, нужно что-то сделать, чтоб не болтались линки на таблицы в области переходов. Например, работать с таблицами через экземпляры классов и конектиться к файлу таблиц непосредственно при открытии форм. Поскольку не силён в работе с классами, требуется чья-нибудь квалифицированная помощь.
0
|
18.11.2011, 13:31 | |
Ответы с готовыми решениями:
17
Как через VBA скрыть столбец в разделённой форме? Работа с указателями на экземпляры классов Map, List, работа со ссылками на экземпляры классов Как использовать экземпляры классов МFC? |
545 / 375 / 16
Регистрация: 17.12.2009
Сообщений: 986
|
||||||
18.11.2011, 14:03 | 2 | |||||
Работайте через АDO. Просто в модуле напишите общую процедуру линковки :
В зависимости от назначения можете постоянно обращаться к данной функции, без всякой привязки таблиц в области переходов. То есть таблицы вообще будут отсутствовать в оболочке.
0
|
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
|
|
18.11.2011, 15:57 [ТС] | 3 |
Поскольку вы предлагаете по циклу обойти все таблицы в текущем проекте и перелинковать их, то надо полагать они всё таки должны присутствовать в текущем проекте как объекты, т.е. уже быть прилинкованными, чего хотелось избежать.
Но всё равно, спасибо. Вечером ещё поковыряюсь с вашим кодом, может что полезное выйдет.
0
|
453 / 215 / 5
Регистрация: 16.05.2010
Сообщений: 420
|
|
18.11.2011, 16:13 | 4 |
Поковыряйте этот пример (конструкция не моя). В нем можно подключать выбраные таблицы. При завершении работы прилинкованые таблицы отключаются.
PS. Прочитали без пароля зашифрованные даные с моего примера
0
|
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
|
|
21.11.2011, 12:07 [ТС] | 5 |
Спасибо за примеры. Но хотелось избежать линковки как такавой.
Не вдаваясь в подробности скажу, что если таблица прилинкована, то очень легко получить от туда данные. Поковырявшись с ADO. Построил приблизительную модель работы с удалённой базой (см. прикреплённый архив). Любителям покритиковать говорю сразу: это только модель, чтоп разобраться с технологией. Что реализовано: 1) Получение данны и загрузка их в форму. 2) Добавление/изменение данных в базе. 3) Управление данными. В принципе, через объект ADODB.Command можно выполнять любые SQL инструкции, применительно к удалённой базе. К сожалению не получилось добиться такой же динамичности работы как с прилинкованными/локальными таблицами. Нельзя просто изменять данный в ленточной форме или перейти на последнюю строку и начать писать, чтоб добавить данные в базу. Приходится это делать через отдельное окошко. С другой стороны, так лучше "защита от дурака". Вот только столкнулся с проблемой обновления данных на форме. Если это отдельная форма, то всё работает. Если форма подчинённая, то вылетает ошибка. Основная функция, ответственная за загрузку данных на форму: "LoadDataOnForm" -- в модуле. Основная проблема -- правильно передать ссылку на форму. Сейчас реализовано через строковую переменную -- передавает модальной форме имя формы, вызвавшей окно изменения данны. Передаётся как "OpenArgs" при выполнении инструкции "DoCmd.OpenForm". Можно было бы сделать это через объектную переменную, но "OpenArgs" может работать только с числами и строками, а глобальных переменных не хотелось бы использовать. Может кто подскажет как решить проблему.
0
|
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
|
|
11.12.2011, 16:12 [ТС] | 6 |
Может кому-то пригодится.
Здесь написано как правильно реализовывать то, что я пытался реализовать http://msdn.microsoft.com/en-u... L.90).aspx
1
|
545 / 375 / 16
Регистрация: 17.12.2009
Сообщений: 986
|
|||||||||||
12.12.2011, 00:05 | 7 | ||||||||||
Спасибо за ссылку! Посмотрел. Тут какая идея в голову пришла, на форуме как то проходил в примерах запрос к экселевскому файлу, где без всякой линковки можно было выбрать данные и показать в аксессе, вот примерный вид:
При данном запросе происходит выборка, прилинкованных таблиц явных и скрытых не видал. Возникла мысль, что наверняка есть подобные запросы и к таблицам родного собственно приложения аксесс. То есть выполняется чисто утилитарная выборка без подвязывания. Предполагаю, что это делается через тип запроса "к серверу" проверить пока не могу, так как пишу с мобильного устройства. Вероятно что и в обычном запросе на выборку можно забабахать нечто подобное, вписав в запрос SQL путь к таблицам. А в последствии этот запрос сделать источником данных формы, отчета , использовать в коде И так далее и.т.п. P.S. Немного про accde Недостатком файла типа accde является невозможность настраивать и сохранять пользовательские настройки по размеру шрифта, столбцов, цвету. При закрытии файла и последующем его открытии все параметры вывода на экран, такие же как до компиляции. Это неудобно и меня это огорчает. В форме около 80 полей, каждому пользователю нужны свои данные. Он сгребает нужные ему поля в кучку, а после пере загрузки хоп, и все поля на прежнем месте. Копий сломал об эту проблему много. Но ответа не нашел( Добавлено через 9 минут Сейчас до дома доберусь, посмотрю, может и без VBA , просто тупо в SQL такой запросец создать можно. Заинтриговался. Добавлено через 2 часа 58 минут Добрался, поэкспериментировал с запросами. Вот оказывается как просто обратиться запросом к таблицам , без линковки:
В VBA также отлично все работает. Сейчас посмотрю на наличие скрытой линковки. Визуально ничего не висит. Добавлено через 22 минуты не, ничего не видно. Юзер не поймет откуда данные беруццо.
2
|
7399 / 4536 / 295
Регистрация: 12.08.2011
Сообщений: 14,033
|
|
13.12.2011, 02:50 | 8 |
Это прокатывает даже с прилинкованными к той mdb таблицами, а юзеру зачем таблицы видеть?
p.s. это анекдот с бородой, не ожидал, что это может быть открытием. p.p.s. используется правда крайне редко.
1
|
545 / 375 / 16
Регистрация: 17.12.2009
Сообщений: 986
|
|
13.12.2011, 10:45 | 9 |
Так юзеру вроде и не надо, автор ветки данной хочет сделать его совсем бесправным существом запаролить, зашифровать, линковки спрятать / убрать совсем))) лишить возможности использовать шифт итд и.т.п.)))
0
|
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
|
|
16.12.2011, 08:29 [ТС] | 10 |
Эдак прямо в точку.
Нечего сотруднику, отвечающему за изготовление заказа, лазить по базе, где прописано откуда и по каким ценам приходят расходники и куда уходит готовый продукт. А то глядишь так через него скоро левачёк потечет не малым ручейком, а большой реченькой. Как тогда предложите затыкать этот фонтан. По моему "профилактика" в этих вопросах имеет большое значение. Добавлено через 14 секунд Это всё не злобы ради, а профилактики для. Добавлено через 6 часов 38 минут А зачем давать сотруднику больше, чем ему надо. Выдай каждому, так сказать, "по заслугам" -- только то, что ему необходимо для работы.
0
|
545 / 375 / 16
Регистрация: 17.12.2009
Сообщений: 986
|
|
17.12.2011, 19:06 | 12 |
Вопрос то стоял про то, чтобы в бд ничего не висело, не было таблиц линкованных.
0
|
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
|
||||||
15.01.2012, 07:58 [ТС] | 13 | |||||
Вот появилось больше времени и решил отписаться.
Спасибо всем, кто помогал. Хочу кое-что уточнить, может кому тоже пригодится. В теме вылезла ветка: К сожалению, пароль здесь действительно не пропишеш. Как и не пропишешь ConnectingString (а очень хотелось бы). Согласно справке, в предложении IN возможно указать только "адрес" и "тип" используемой базы. Зато можно сделать такой финт ушами. 1) Делаем, как обычно проект с разделением базы на два файла "таблицы" и "формы". 2) В отличие от стандартных рекомендаций поместить запросы вместе с файлами, помещаем все запросы вместе с таблицами. 3) В качестве источника данных формам, выпадающим спискам и везде где надо пишем почти так, как предложил Сергей. Только в предложении FROM пишем имя вашего сохранённого запроса (к запросам в другой базе можно обратиться так же как и к таблицам). Получаем буквально следующее:
5) Файл таблиц прячем и/или защищаем средствами NTFS (о последнем мелкасофты постоянно говорят в справке) в указанном месте. Что у нас получилось? Во-первых, источника данных действительно не видно и каждый человек будет работать нолько с тем набором данных, который ему выделен. Во-вторых, если вы решите изменить условия выборки -- расширить или уменьшить объём данных, доступных пользователю. Или захотите внести какие-то изменения в исходные таблицы. Вам не придётся переделывать "пользовательские" файлы и заново раздавать их. Достаточно будет подправить запрос, сохранённый вместе с таблицами.
2
|
545 / 375 / 16
Регистрация: 17.12.2009
Сообщений: 986
|
|
15.01.2012, 16:45 | 14 |
Ну да, все верно и хорошо)
0
|
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
|
|
17.01.2012, 00:39 [ТС] | 15 |
:cofee:
Уважаемые форумчане, наконец-то я нашёл то, что искал. Чуть выше я описал часть процесса. Теперь продолжим. Когда источник данных привели к виду, указанному в пункте 3, открываем окно Query window
(Query window: A window in which you work with queries in Design view, Datasheet view, SQL view, or Print Preview.) О том как открыть это окно смотрите прикреплённую картинку "1.png"
0
|
545 / 375 / 16
Регистрация: 17.12.2009
Сообщений: 986
|
|
17.01.2012, 14:36 | 16 |
Тоже ковырял подобные вещи, но в 2007м аксессе. До указанных свойств на картинках добирался в "Запрос к серверу". Самое вкусное в данной ситуации что все эти вещи которые написаны в свойствах запроса можно задать как переменные. В VBA access есть объект, так и называется QUERY. Его можно объявить даже как Dim as QUERY. После присвоения объекту необходимых методов в DAO и ADO можно вылезти программно на указанные на рисунках свойствах. Особую ценность вызывает способность заходить под паролем и использовать ограничения, которые прописаны именно на сервере а не в самой оболочке аксесс! Гуд!
1
|
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
|
|
17.01.2012, 21:37 [ТС] | 17 |
--> Сергей1980
Спасибо за то, как добраться до указанных свойств из VBA. Этого как раз не хватало.
0
|
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
|
||||||
22.01.2012, 15:35 [ТС] | 18 | |||||
Может кому пригодится код, чтоб быстро изменить адрес расположения базы, указанный в предложении IN
Кнопка
1
|
22.01.2012, 15:35 | |
22.01.2012, 15:35 | |
Помогаю со студенческими работами здесь
18
Как положить в массив экземпляры классов? Как сохранить экземпляры классов в один массив ? Как сериализовать/десериализовать экземпляры классов в файл Как случайным образом вывести экземпляры двух классов? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |