Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
1

Работа с таблицами разделённой базы через экземпляры классов. Как?

18.11.2011, 13:31. Показов 3581. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Уважаемые форумчане, помогите разобраться в вопросе.
Стоит задача ограничить доступ к данным из базы.
Что сделано:
1) База разделена на файл таблиц и файл юзверя (формы, отчёты)
2) Файл с таблицами лежит в отдельной папке, защищённой средствами NTFS. Теперь без ста грамм и прав админа её не унесёшь.
3) Чтоб каждый имел доступ только к тем данным с которыми положено ему работать, в файле юзверя прилинкованы не все таблицы, а только те, что ему разрешены (пару общих таблиц и пару "персональных"). А чтоб сами не подключили остальные таблицы, файл с таблицами запаролен.
4) В файле юзверя нет запросов (как отдельных объектов) -- все запросы в свойствах форм/отчётов, их контролов и в коде VBA.
5) Файл юзверя окомпилирован -- сохранен в формате ".accde". Теперь не посмотришь код.
6) Срыть область переходов и сделать защиту от загрузки с "Shift". Хоть в этом смысла не вижу, всё же сделал (больше для галочки -- от чайников). Обходится на "раз, два, три". Достаточно положить файл в "ненадёжное место" (главное чтоб Access считал его таковым ) и всё -- защиты нет -- Access блокирует код VBA и защита не работает.

Из того, что предлагается на форуме осталось всего ничего -- сделать шифрование данных. Покурив форум с большего разобрался. Так что можно считать этот вопрос решённым . Спасибо HOUSE MD с его примерами.

Однако, осталось ещё одно узкое место в защите -- таблицы (особенно с учётом п.6).
Тут меня посетила мысль: самая лучшая защита -- отсутствие объекта, который нужно защищать Нет связанных таблиц -- нет проблем.
Значит, нужно что-то сделать, чтоб не болтались линки на таблицы в области переходов. Например, работать с таблицами через экземпляры классов и конектиться к файлу таблиц непосредственно при открытии форм. Поскольку не силён в работе с классами, требуется чья-нибудь квалифицированная помощь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.11.2011, 13:31
Ответы с готовыми решениями:

Как через VBA скрыть столбец в разделённой форме?
Здравствуйте! Подскажите, какая команда скрывает столбец в разделённой форме?

Работа с указателями на экземпляры классов
чтото не пойму. Я могу както создать указатель, который указывал бы ка экземпляр класса (а не...

Map, List, работа со ссылками на экземпляры классов
Здравствуйте! Есть такой вопрос: если ли разница в том, каким образом делать .push_back(buf) в...

Как использовать экземпляры классов МFC?
Такая проблема: С помощью MFC AppWizard создал проект, в котором редактируется некая...

17
545 / 375 / 16
Регистрация: 17.12.2009
Сообщений: 986
18.11.2011, 14:03 2
Работайте через АDO. Просто в модуле напишите общую процедуру линковки :

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Private Function RefreshLinks() 
Dim dbs As Database 
Dim tdf As TableDef 
 
strFileName = CurrentProject.Path & "\Tables_Stock.mdb" 
Set dbs = CurrentDb 
For Each tdf In dbs.TableDefs 
 
If Len(tdf.Connect) > 0 Then 
  tdf.Connect = ";DATABASE=" & strFileName 
  Err = 0 
  On Error Resume Next 
 
  tdf.RefreshLink 
    If Err <> 0 Then 
       RefreshLinks = False 
       Exit Function 
    End If 
End If 
 
Next tdf 
 
RefreshLinks = True 
End Function

В зависимости от назначения можете постоянно обращаться к данной функции, без всякой привязки таблиц в области переходов. То есть таблицы вообще будут отсутствовать в оболочке.
0
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
18.11.2011, 15:57  [ТС] 3
Цитата Сообщение от Сергей1980 Посмотреть сообщение
Visual Basic
1
2
3
4
5
6
7
8
9
   '...
strFileName = CurrentProject.Path & "\Tables_Stock.mdb" 
Set dbs = CurrentDb
For Each tdf In dbs.TableDefs 
   tdf.Connect = ";DATABASE=" & strFileName
   '...
   tdf.RefreshLink
   '...
Next tdf
Поскольку вы предлагаете по циклу обойти все таблицы в текущем проекте и перелинковать их, то надо полагать они всё таки должны присутствовать в текущем проекте как объекты, т.е. уже быть прилинкованными, чего хотелось избежать.

Но всё равно, спасибо.
Вечером ещё поковыряюсь с вашим кодом, может что полезное выйдет.
0
453 / 215 / 5
Регистрация: 16.05.2010
Сообщений: 420
18.11.2011, 16:13 4
Поковыряйте этот пример (конструкция не моя). В нем можно подключать выбраные таблицы. При завершении работы прилинкованые таблицы отключаются.
PS. Прочитали без пароля зашифрованные даные с моего примера
Вложения
Тип файла: rar al0612.rar (50.7 Кб, 70 просмотров)
0
177 / 62 / 3
Регистрация: 17.11.2011
Сообщений: 318
21.11.2011, 12:07  [ТС] 5
Цитата Сообщение от Сергей1980 Посмотреть сообщение
Работайте через АDO. Просто в модуле напишите общую процедуру линковки
Цитата Сообщение от HOUSE MD Посмотреть сообщение
Поковыряйте этот пример (конструкция не моя). В нем можно подключать выбраные таблицы. При завершении работы прилинкованые таблицы отключаются.
Спасибо за примеры. Но хотелось избежать линковки как такавой.
Не вдаваясь в подробности скажу, что если таблица прилинкована, то очень легко получить от туда данные.

Поковырявшись с ADO. Построил приблизительную модель работы с удалённой базой (см. прикреплённый архив).
Любителям покритиковать говорю сразу: это только модель, чтоп разобраться с технологией.

Что реализовано:
1) Получение данны и загрузка их в форму.
2) Добавление/изменение данных в базе.
3) Управление данными. В принципе, через объект ADODB.Command можно выполнять любые SQL инструкции, применительно к удалённой базе.

К сожалению не получилось добиться такой же динамичности работы как с прилинкованными/локальными таблицами.
Нельзя просто изменять данный в ленточной форме или перейти на последнюю строку и начать писать, чтоб добавить данные в базу. Приходится это делать через отдельное окошко. С другой стороны, так лучше "защита от дурака".

Вот только столкнулся с проблемой обновления данных на форме. Если это отдельная форма, то всё работает. Если форма подчинённая, то вылетает ошибка. Основная функция, ответственная за загрузку данных на форму: "LoadDataOnForm" -- в модуле. Основная проблема -- правильно передать ссылку на форму. Сейчас реализовано через строковую переменную -- передавает модальной форме имя формы, вызвавшей окно изменения данны. Передаётся как "OpenArgs" при выполнении инструкции "DoCmd.OpenForm". Можно было бы сделать это через объектную переменную, но "OpenArgs" может работать только с числами и строками, а глобальных переменных не хотелось бы использовать.

Может кто подскажет как решить проблему.
Вложения
Тип файла: rar accdb_NoLincs.rar (80.9 Кб, 37 просмотров)
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
1
SELECT * FROM [Excel 8.0;DATABASE=C:\Microsoft Office Excel.xls].[Лист1$B1:I30]
Вариант предложен Евгением Тесленко.

При данном запросе происходит выборка, прилинкованных таблиц явных и скрытых не видал. Возникла мысль, что наверняка есть подобные запросы и к таблицам родного собственно приложения аксесс. То есть выполняется чисто утилитарная выборка без подвязывания. Предполагаю, что это делается через тип запроса "к серверу" проверить пока не могу, так как пишу с мобильного устройства. Вероятно что и в обычном запросе на выборку можно забабахать нечто подобное, вписав в запрос SQL путь к таблицам. А в последствии этот запрос сделать источником данных формы, отчета , использовать в коде И так далее и.т.п.
P.S. Немного про accde Недостатком файла типа accde является невозможность настраивать и сохранять пользовательские настройки по размеру шрифта, столбцов, цвету. При закрытии файла и последующем его открытии все параметры вывода на экран, такие же как до компиляции. Это неудобно и меня это огорчает. В форме около 80 полей, каждому пользователю нужны свои данные. Он сгребает нужные ему поля в кучку, а после пере загрузки хоп, и все поля на прежнем месте. Копий сломал об эту проблему много. Но ответа не нашел(

Добавлено через 9 минут
Сейчас до дома доберусь, посмотрю, может и без VBA , просто тупо в SQL такой запросец создать можно. Заинтриговался.

Добавлено через 2 часа 58 минут
Добрался, поэкспериментировал с запросами.
Вот оказывается как просто обратиться запросом к таблицам , без линковки:

SQL
1
SELECT * FROM ВашаТаблица IN 'C:ВашПутьазаИсточник.mdb'
И плов готов. Причем в такой конструкции в открывшемся запросе без проблем можно изменять данные в удаленной базе с разделенными таблицами.

В VBA также отлично все работает. Сейчас посмотрю на наличие скрытой линковки. Визуально ничего не висит.

Добавлено через 22 минуты
не, ничего не видно. Юзер не поймет откуда данные беруццо.
2
Эксперт MS Access
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
Цитата Сообщение от Сергей1980 Посмотреть сообщение
Так юзеру вроде и не надо, автор ветки данной хочет сделать его совсем бесправным существом запаролить, зашифровать, линковки спрятать / убрать совсем))) лишить возможности использовать шифт итд и.т.п.)))
Эдак прямо в точку.
Нечего сотруднику, отвечающему за изготовление заказа, лазить по базе, где прописано откуда и по каким ценам приходят расходники и куда уходит готовый продукт. А то глядишь так через него скоро левачёк потечет не малым ручейком, а большой реченькой. Как тогда предложите затыкать этот фонтан.
По моему "профилактика" в этих вопросах имеет большое значение.

Добавлено через 14 секунд
Это всё не злобы ради, а профилактики для.

Добавлено через 6 часов 38 минут
Цитата Сообщение от Сергей1980 Посмотреть сообщение
В форме около 80 полей, каждому пользователю нужны свои данные. Он сгребает нужные ему поля в кучку, а после пере загрузки хоп, и все поля на прежнем месте.
А зачем давать сотруднику больше, чем ему надо.
Выдай каждому, так сказать, "по заслугам" -- только то, что ему необходимо для работы.
0
1406 / 1260 / 20
Регистрация: 09.08.2011
Сообщений: 2,319
Записей в блоге: 1
17.12.2011, 18:13 11
Цитата Сообщение от Сергей1980 Посмотреть сообщение
Вот оказывается как просто обратиться запросом к таблицам , без линковки:
Код SQL1 SELECT * FROM ВашаТаблица IN 'C:ВашПуть\БазаИсточник.mdb'
И плов готов. Причем в такой конструкции в открывшемся запросе без проблем можно изменять данные в удаленной базе с разделенными таблицами.
А как сюда вставить еще и пароль?
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
Вот появилось больше времени и решил отписаться.
Спасибо всем, кто помогал.
Хочу кое-что уточнить, может кому тоже пригодится.

В теме вылезла ветка:
Цитата Сообщение от Сергей1980 Посмотреть сообщение
Вот оказывается как просто обратиться запросом к таблицам , без линковки:
SQL
1
SELECT * FROM ВашаТаблица IN 'C:ВашПутьазаИсточник.mdb'
...
ничего не видно. Юзер не поймет откуда данные беруццо.
Цитата Сообщение от V_Monomax Посмотреть сообщение
А как сюда вставить еще и пароль?
Цитата Сообщение от Сергей1980 Посмотреть сообщение
Вопрос то стоял про то, чтобы в бд ничего не висело, не было таблиц линкованных.
К сожалению, пароль здесь действительно не пропишеш. Как и не пропишешь ConnectingString (а очень хотелось бы). Согласно справке, в предложении IN возможно указать только "адрес" и "тип" используемой базы.

Зато можно сделать такой финт ушами.
1) Делаем, как обычно проект с разделением базы на два файла "таблицы" и "формы".
2) В отличие от стандартных рекомендаций поместить запросы вместе с файлами, помещаем все запросы вместе с таблицами.
3) В качестве источника данных формам, выпадающим спискам и везде где надо пишем почти так, как предложил Сергей. Только в предложении FROM пишем имя вашего сохранённого запроса (к запросам в другой базе можно обратиться так же как и к таблицам). Получаем буквально следующее:
SQL
1
SELECT * FROM ВашЗапрос IN 'C:ВашПутьазаИсточник.mdb'
4) Компилируем файл форм.
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"
(см. "2.png"). У него есть два замечательных свойства: SourceConnectStr, SourceDatabase. Уже по названию понятно для чего они (подробнее можно почитать в стандартной справке). В SourceConnectStr собственно и прописываем пароль и прочие вкусности.
Миниатюры
Работа с таблицами разделённой базы через экземпляры классов. Как?   Работа с таблицами разделённой базы через экземпляры классов. Как?  
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
Кнопка
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Private Sub cmdGo_Click()
    Dim ctl As Control
    Dim objFrm As AccessObject
    Dim prp As Property
    Dim strFormName As String
    Dim strMeName As String
    Dim strSource As String
    
    Const coSourceFrom As String = "IN 'd:\.Programms\Office Access\accdb_ Предприятие\tables\Предприятие_таблицы.accdb';"
    Const coSourceTo As String = "IN 'd:\.Programms\Office Access\accdb_ Предприятие\tables\tables_in\Предприятие_таблицы.accdb';"
    
    On Error GoTo ErrorHandler
    
    strMeName = Me.Name
    ' отключаем обновление экрана
    Application.Echo False, "Идёт получение свойств. Это может занять значительное время. Подождите..."
    ' перечитываем все формы, сохранённые в базе
    For Each objFrm In CurrentProject.AllForms
        strFormName = objFrm.Name
        Select Case strFormName
            ' список форм, исключённых из обработки
            Case Is = strMeName, "Заставка", "frmAndmDeveloper", "frmAndmReLincTables" _
                                , "frmAndmSincCenter", "frmAndmSincro"
            Case Else
                ' открываем форму
                DoCmd.OpenForm strFormName, acDesign
                
                ' выбираем свойство "источник записей"
                Set prp = Forms(strFormName).Properties("RecordSource")
                ' изсеняем источник данных
                If Not IsNull(prp.Value) Then
                    strSource = prp.Value
                    prp.Value = Replace(strSource, coSourceFrom, coSourceTo)
                End If
                
                ' перечитываем элементы формы
                For Each ctl In Forms(strFormName).Controls
                    ' выбираем свойство "тип элемента"
                    Set prp = ctl.Properties("ControlType")
                    ' если это ComboBox
                    If prp.Value = 111 Then
                        ' выбираем свойство "источник строк"
                        Set prp = ctl.Properties("RowSource")
                        ' изсеняем источник данных
                        If Not IsNull(prp.Value) Then
                            strSource = prp.Value
                            prp.Value = Replace(strSource, coSourceFrom, coSourceTo)
                        End If
                    End If
                Next ctl
                
                ' закрываем форму с сохранением изменений
                DoCmd.Close acForm, strFormName, acSaveYes
        End Select
    Next objFrm
    
    ' включаем обновление экрана
    Application.Echo True, "Получение свойств завершено."
    MsgBox "Обработка окончена"
    Exit Sub
    
ErrorHandler:
    MsgBox "Error " & err.Number & " in " & err.Source & vbCr _
            & err.Description
    err.Clear
    Resume Next
End Sub
1
22.01.2012, 15:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.01.2012, 15:35
Помогаю со студенческими работами здесь

Как положить в массив экземпляры классов?
Здравствуйте! Есть задача. У меня есть 2 класса FixedMonthlyCostPaidService и ...

Как сохранить экземпляры классов в один массив ?
Ребята, привет. Подскажите, пожалуйста, как решить задачу. Есть абстрактный класс. Есть два...

Как сериализовать/десериализовать экземпляры классов в файл
Проблема следующая: Имеется три класcа: class Class1 { // Список полей и методов } class...

Как случайным образом вывести экземпляры двух классов?
Выходит ошибка о том что класс не может конвертироваться в инт public void StartRun(Driver...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru