将多用户访问前端连接到SQL Server后端

一如既往地感谢您的帮助!

我已经构建了一个Access数据库,我们打算将其分发给大约100个最终用户 . 我目前正在为5个用户运行试点计划 . 我已将表迁移到SQL 2014 Server,但目前试验程序的后端位于共享网络文件夹(它们未知的位置) . 我通过将文件保存在该共享网络上并指示最终用户将副本保存到其桌面来分发Access前端(accde文件类型) . 飞行员工作正常,如果不是有点慢 .

我遇到的问题是:

我能够在我的机器上设置ODBC连接,并能够通过该连接连接到SQL Server后端 . 但是,我不知道如何让我的最终用户访问服务器上的表 . 我是否需要为服务器上的每个用户创建一个用户名并为其提供读写访问权限?我是否还需要在计划安装前端的每台计算机上创建ODBC连接?我宁愿不必在每台机器上创建ODBC连接,是否可以解决这个问题?谢谢!

访问版本:2013 SQL:2014致力于SSMS 2014

-Charlie

回答(3)

2 years ago

一些东西:

创建链接表时,只需使用功能区导入和链接 - 然后使用ODBC数据库 . 只需选择文件DSN即可 . 原因是DEFAULT的访问将使用无DSN连接 . 简单来说,这意味着当您链接表时,您可以将您的applcatation分发到每个工作站,而无需设置SYSTEM / Machine DSN .

所以请记住,使用默认文件DSN - 一旦Access创建到SQL Server的链接,那么这些链接是无DSN的,并且您不需要在每个工作站上进行任何设置 .

至于在SQL服务器上创建用户?好吧,除非你想为每个用户提供某种特殊的安全性,否则你可能不需要 . 如果您使用SQL登录,请确保在上述链接过程中“检查”保存密码选项 . 再一次,因为默认情况下链接表是DSN-less,然后每个用户实际上将使用同一个SQL用户/密码,因此这对每个用户都是透明的(他们不必登录) .

如果您使用Windows身份验证进行SQL登录,则安全性是使用Windows系统而不是SQL服务器设置的 . 在这种情况下,每个用户的Windows登录将用于控制(允许)使用SQL服务器 . 如果您不使用域控制器,那么您将使用SQL登录,并且可能只是您正在使用的一个登录就足够了 . 通常即使在企业环境中,因为我不想为每个登录和SQL服务器的权限调用IT管理员,那么我仍然选择SQL登录 . 因此,“曾经”IT管理员给予我足够的SQL服务器权限,然后我可以自由创建我自己的登录,或者只是为每个人使用“同一个”登录,因此不必浪费时间来打扰IT乡亲 .

还有一些额外的要点:忽略建议使用各种ADO和VBA代码和连接字符串等 - 它们不是必需的 . 实际上,在大多数情况下,您希望在应用程序中避免使用ADO代码 . 而且,对于SQL服务器(ADO倾向于依赖),oleDB正在被折旧 .

您仍然需要将每个工作站上的前端程序放在一起 . 就像你在每个工作站或会计软件包上安装文字一样,既然你正在开发软件,那么你就像过去30年来IT行业那样在每个工作站上安装你的软件 . 您当然可以在共享文件夹上共享数据,但是您可以安装实际应用程序(word,Excel,或者在这种情况下,您在EACH工作站上的应用程序 . 并且您应该在任何部署之前将accDB编译为accDE .

因此,如果您对这些用户的部署位于同一网络上,那么在启动“连接”或“链接”到SQL服务器时,您并不需要任何特殊代码 . 如果您是“非现场”的开发人员或顾问,那么您可能需要在启动时添加一些代码以重新链接到他们的sql服务器,这无疑会与您在异地开发的服务器不同 . 因此,如果您无法在现场进行开发,或者您使用的SQL服务器是“复制”或“测试”,则需要一些能够重新链接到“不同”SQL服务器然后正在开发的SQL服务器的能力 . 正在使用的实际 生产环境 SQL服务器的版本 .

2 years ago

每台计算机上都不需要ODBC连接 . 您可以通过 DoCmd.TransferDatabase 使用ODBC连接字符串来创建连接 . 这是持久的,因此您只需在前端的开发副本上执行连接/更新,连接将存在并保留在您所创建的任何最终用户副本中 .

您必须处理身份验证问题 . 根据您的安全情况,您可以创建一个“数据库用户”,并在上述连接中包含用户名和密码 . 如果你在您可以使用AD环境进行身份验证 . 或者,您为每个用户或用户组创建单独的SQL帐户 . 无论您做什么,如果Access具有对它们的读/写权限,用户将能够查看和编辑表 . 您可以使用视图将它们链接到Access而不是表本身来保护单个表 .

我建议不要让用户制作前端的本地副本 . 这使得确保您的用户使用最新版本的前端成为一场噩梦 . 鼓励他们改为做捷径 . 除非你有每个用户的本地临时表或动态编辑表单/报告的代码,否则没有太多理由不让每个人都使用相同的前端文件 . 即使在这种情况下,也要创建一个部署批处理文件,为每个用户创建/覆盖前端副本 .

链接到SQL Server数据库的示例代码:

Public Sub LoadDatabase()

Dim MyDB As DAO.Database
Set MyDB = CurrentDb
Dim d As DAO.Recordset
Set d = MyDB.OpenRecordset("SELECT TableName FROM tblLinkTables")
d.MoveFirst
Do While Not d.EOF
    DoCmd.DeleteObject acTable, d!TableName
    DoCmd.TransferDatabase acLink, "ODBC Database", "ODBC;Driver={SQL Server};Server=MYSQLSERVERNAME;Database=MyDatabaseName;Uid=DatabaseUser;Pwd=DatabaseUserPassword", acTable, d!TableName, d!TableName, False, True
    d.MoveNext
  Loop
d.Close
Set d = Nothing

End Sub

要链接的表的列表存在于名为tblLinkTables的本地表上,其中每个表都要链接一个字段TableName . 这是一个非常简化的版本 . 我实际使用的那个能够具有与SQL表不同的本地表名,还可以链接视图并为它们创建主键(可选) .

2 years ago

以下是如何获取与SQL Server的连接的一个示例 . 它支持使用可信连接(Windows用户被授权访问,或者您可以指定sqlserver定义的用户ID和密码) .

' The following are some of the parameters the connection will use.
Global gv_DBS_SQLServer                 As ADODB.Connection
Global gvstr_SQLServer_Name             As String
Global gv_SQLServer_DSN                 As String
Global gvstr_SQLServer_Database         As String

'Call the GetConnection Function
' Pass Name of Server; Database Name; Connection Variable; adUseServer; True if using Password; False if not using a Trusted Connection;
' Sample
    If GetConnection(gvstr_SQLServer_Name, gvstr_SQLServer_Database, _
            gv_DBS_SQLServer, adUseServer, True, False) = False Then
        MsgBox "Unable to connect to SQL Server", vbOKOnly, "No Connection"
    End If


Public Function GetConnection(ByVal strDSN As String, _
        ByVal strDatabase As String, _
        ByRef cnLocal As ADODB.Connection, _
        ByVal CursorLoc As CursorLocationEnum, _
        ByVal UsePassword As Boolean, _
        ByVal blnTrusted As Boolean) As Boolean

Dim strConnectString    As String
Dim strDisplay          As String

    On Error GoTo ERROR_HANDLER
    GetConnection = False
Retry_Connection:
    If cnLocal Is Nothing Then Set cnLocal = New ADODB.Connection
    If cnLocal.State = adStateOpen Then
        Debug.Print "Connection already open -- -will not reopen!!"
        GetConnection = True
        GoTo Proc_Exit
    End If
    With cnLocal
        Debug.Print "Use TRUSTED CONNECTION (ABOVE)"
        If blnTrusted = True Then
            strConnectString = "Driver={SQL Server};" & _
                               "Server=" & strDSN & ";" & _
                               "Database=" & strDatabase & ";" & _
                               "Trusted_Connection=yes"
        Else
            strConnectString = "Driver={SQL Server};" & _
                               "Server=" & strDSN & ";" & _
                               "Database=" & strDatabase & ";" & _
                               "User Id=UUUUUUU;Password=" & DecryptString("PPPPPPPP") & ""

            strDisplay = "Driver={SQL Server};" & _
                         "Server=" & strDSN & ";" & _
                         "Database=" & strDatabase & ";" & _
                         "User Id=UUUUUU;Password=PPPPPPP"

        End If

         Debug.Print "Will use Conn String: " & strDisplay
        .ConnectionString = strConnectString
        .CursorLocation = CursorLoc
        .Open
    End With
    GetConnection = True
Proc_Exit:
    Exit Function
ERROR_HANDLER:
    Debug.Print Err.Number & vbCrLf & Err.Description
    Err.Source = "Module_Connect: " 
    DocAndShowError
    Resume Proc_Exit
    Resume Next
    Resume
End Function