Microsoft Access - > SQL Server - 空白/默认架构

时间:2016-12-13 04:29:53

标签: sql-server database azure ms-access

我们有一个大型MS Access应用程序,它使用SQL Server作为数据库(大约200个表)。

我们希望将其转换为多租户数据库,我们将拥有一个大型SQL Server数据库。在数据库内部,每个客户端将在自己的模式中拥有自己的一组表。例如,十个客户端使用数据库 - 该数据库中有十个模式。

然后,我们将其迁移到Azure,并将MS Access应用程序作为Azure RemoteApp运行。

我们希望为每个客户端创建一个Active Directory用户组,并将其映射到该客户端的默认SQL Server架构。

我们的想法是将新用户添加到相关的AD用户组中,默认情况下会将其映射到正确的架构及其数据,

我们遇到的问题是MS Access链接表包含一个硬编码的显式Schema(默认为dbo)。

任何人都可以想到一种在MS Access中存储“源”/外部/链接表而无需指定架构的方法。例如。只是“tblSales”,而不是“dbo.tblSales”。

1 个答案:

答案 0 :(得分:0)

典型的重​​新链接代码是这样的(仅限剪辑):

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 是否是只读的。如果没有,可以调整:

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

如果它是只读的,则必须删除链接表并重新创建链接。

那就是说,我不确定你对每个客户的架构的想法是不是一个好主意。我们有类似的考虑,并决定只为每个客户创建一个数据库。如果没有别的,客户端备份和恢复将大大简化。