2016-12-13 2 views
0

У нас есть большое приложение MS Access, которое использует SQL Server для базы данных (около 200 таблиц).Microsoft Access -> SQL Server - пустая/стандартная схема

Мы хотим преобразовать его в базу данных с несколькими арендаторами, где у нас будет одна большая база данных SQL Server. Внутри базы данных каждый клиент будет иметь собственный набор таблиц в своей собственной схеме. Например, десять клиентов, использующих базу данных - десять схем в этой базе данных.

Затем мы перенесем его на Azure и запустим приложение MS Access в виде Azure RemoteApp.

Мы хотим создать группу пользователей Active Directory для каждого клиента и сопоставить ее по схеме SQL Server по умолчанию для этого клиента.

Идея заключается в том, что новые пользователи добавляются в соответствующем AD User Group, и по умолчанию получить карту в правом схему с их данными,

Проблемы мы имеем в MS Access Связанных таблицы содержат жесткую - закодированная явная схема (по умолчанию - dbo).

Может кто-нибудь подумать о способе хранения «Источника»/внешней/связанной таблицы в MS Access без необходимости указывать схему. Например. просто «tblSales», а не «dbo.tblSales».

ответ

0

Типичный код RELINK выглядит следующим образом (надрез только):

For Each tdf In dbs.TableDefs 
    strName = tdf.Name 
    If Asc(strName) <> Asc("~") Then 
     If InStr(tdf.Connect, cstrDbType) = 1 Then 
      tdf.Connect = strConnect 
      tdf.RefreshLink 
      Debug.Print Timer, tdf.Name, tdf.SourceTableName, tdf.Connect 
      DoEvents 
     End If 
    End If 
Next 

у меня нет другой схемы, чем DBO, чтобы проверить с, и я не уверен, если свойство SourceTableName является Read- только. Если нет, то она может быть скорректирована:

For Each tdf In dbs.TableDefs 
    strName = tdf.Name 
    If Asc(strName) <> Asc("~") Then 
     If InStr(tdf.Connect, cstrDbType) = 1 Then 
      tdf.Connect = strConnect 
      tdf.SourceTableName = strNewSchema & "." & Split(tdf.SourceTableName, ".")(1) 
      tdf.RefreshLink 
      Debug.Print Timer, tdf.Name, tdf.SourceTableName, tdf.Connect 
      DoEvents 
     End If 
    End If 
Next 

Если только для чтения, вы должны удалить связанную таблицу и восстановить связь.

Тем не менее, я не уверен, является ли ваша идея схемы для каждого клиента такой хорошей идеей. У нас были аналогичные соображения, и мы решили просто создать базу данных для каждого клиента. Если ничего другого, резервное копирование и восстановление по клику значительно упрощаются.

+0

Спасибо за ответ. Мы хотим иметь единую копию кода приложения с одной базой данных для многих клиентов. Это не очень практично или эффективно иметь несколько копий кода доступа, каждый из которых имеет другую внешнюю привязку к базе данных. С 200 таблицами это было бы нецелесообразно ни для Relink для каждого входа. Использование схем для поддержки базы данных с несколькими арендаторами должно работать, нам просто нужен способ выяснить, как обращаться с ним из интерфейса MS Access. –

+0

Вы, кажется, немного смущены. Вам понадобится один интерфейс только в любом случае, но вам придется повторно привязать его один раз для каждого клиента независимо от того, следует ли ему ссылаться на конкретную схему или конкретную базу данных. Когда (re) связано с конкретной схемой или базой данных, интерфейс остается таким, независимо от того, сколько раз пользователь входит в систему. Для просмотра доступен простой код ссылки, хотя для реального приложения вы предпочитаете обертывать его приличными формами и обработкой ошибок. – Gustav

Смежные вопросы