从Access连接到远程服务器中的SQL Server



我们有一个服务器a和一个服务器B。
在服务器a中,我们的ERP是用Access和VBA制作的
在服务器B中,我们有一个SQL Server实例需要留在该服务器中
某些Access数据库需要链接到该SQL Server实例中的某些表,并且我不希望密码存储在MSysObjects表中,因此我无法通过检查"保存连接"选项手动链接这些表。

我将连接字符串保存在一个带有密码模糊的表中。使用该连接字符串,我在启动时重新链接表
实例是通过其IP访问的,而不是通过实例的名称访问的。如果我使用实例的名称,它将不起作用。

它适用于我,但不适用于除一个用户之外的其他用户。

SQL Server实例已正确配置为允许远程连接,端口已打开,规则已添加到防火墙。如果配置不正确,它对我和其他用户都不起作用,所以我对此很有信心。与Access中的连接字符串和建立连接的方法相同。

我尝试过的:

  1. 安装SQL Native Client 11.0
  2. 正在安装完整的SQL Server Express
  3. 已将SQL Browser服务配置为自动启动,而不是禁用

步骤1不适用于任何用户。步骤2对一个用户有效,但对其他用户无效。步骤3没有任何效果。对我来说,我一直把它安装在我的机器里,所以它不适用。

如果我尝试对局域网中的SQL Server实例执行同样的操作,它对每个用户都有效,但当实例位于远程服务器中时则无效。

注意:我的知识有限。也许我说了一些没有意义的话。

好的,有几件事:

安装SQL Native Client 11.0。

好的,然后你必须重新链接表-选择新的驱动程序。刷新链接表是不够的。这也意味着每个工作站现在都必须安装原生11个。如果你说决定使用原生17(一个更新得多的odbc驱动程序)进行链接,那么你必须在每个工作站上再次安装这个原生驱动程序。虽然您可以在每个工作站上安装多个sql驱动程序,但用于链接表的驱动程序也必须安装并存在于每个工作站上。

安装完整的SQL Server Express。

为什么?安装sql server的副本与您试图连接到的其他计算机上的OTHER sql server有什么关系?你认为在机器上安装sql服务器会影响在amazon.com上运行的sql服务器吗?因此,此举毫无意义。

您正试图连接到其他计算机上运行的sql server的某个实例。安装一些您不使用、不连接的sql server副本是没有意义的,也不会有帮助,这与此问题无关。

已将SQL浏览器服务配置为自动启动,而不是禁用。

哪里?浏览器服务设置为在安装和运行sql server的服务器和SAME计算机上运行和启动。所以,是的,毫无疑问,这两个sql服务器A和B肯定必须运行sql浏览器服务。该服务允许客户端计算机连接到sql server的运行实例。在过去,旧版本(以前)的sql server会允许默认连接,但现在几乎在所有情况下,您都必须确保sql浏览器服务在您试图连接的数据库所在的计算机上运行。

值得注意的是,实例是通过其IP访问的,而不是通过实例的名称访问的。

不,你可能有这个错误。有两部分。

服务器名称,然后是";实例";sql server正在运行。

虽然您可以交换(不使用)服务器名称,但仍然需要指定sql server实例。

因此,您可以使用以下格式:

myservernameSQLEXPRESS

或者,您可以用IP地址替换服务器,但仍然需要sql server实例。(默认情况下,它是SQLEXPRESS,但您必须检查sql server数据库的实例是什么)。

192.168.1.30SQLEXPRESS

因此,虽然你可以使用IP或服务器名称-使用IP地址通常更可靠,但这并不能让你摆脱必须指定连接到的sql实例的困境;默认";例如,并且您一般不必指定";例如";,但现在你做到了。而且要明确的是,当使用这样的实例时,sql服务器需要运行sql浏览器服务。(事实上,浏览器服务是将传入请求转换为给定且正确的sql server实例的服务)。

我不希望密码存储在MSysObjects表中,

您不必,事实上也不应该在连接字符串中包含uid/密码。事实上,没有任何理由这样做

您所做的是执行一次登录,然后在没有UID/密码的情况下链接表。这不仅是一个好主意,而且还意味着你的uid/密码不包括在连接字符串中,还意味着用户无法访问,甚至意外地查看/获取uid/密码。

这也意味着告诉某人在哪里启动访问副本,并从此应用程序导入链接表。当他们试图使用链接的表时,它们将不起作用。

那么,如果没有密码,链接表是如何工作的呢?(顺便说一句,这也可以使您在启动时不必重新链接表!!)。

它的工作方式是,在代码中,在启动时执行一次服务器登录。这意味着你可以:

提示用户输入他们的sql UID/密码。

代码中有uid/密码。(或者可能在你启动时读取的文本文件中。因此,你可以隐藏或加密该uid/密码。

然后在启动代码中,执行一次登录。完成此操作后,所有链接的表现在都可以工作,并且不需要uid/password即可工作。

由于您有两个服务器,因此需要执行两个登录,一个用于服务器A,一个为服务器B。但是,再一次,只要链接表存在,它们就会工作。

现在,有";较长的";关于如何使用这种登录思想的文章,然后不必包含或重新链接SQL uid/密码的表。

执行登录的基本代码如下:

Function TestLogin(strCon As String) As Boolean
On Error GoTo TestError
Dim dbs          As DAO.Database
Dim qdf          As DAO.QueryDef
Set dbs = CurrentDb()
Set qdf = dbs.CreateQueryDef("")
qdf.connect = strCon

qdf.ReturnsRecords = False
'Any VALID SQL statement that runs on server will work below.
' this does assume user has enough rights to query built in
' system tables

qdf.sql = "SELECT 1 "
qdf.Execute
TestLogin = True

Exit Function
TestError:
TestLogin = False
Exit Function
End Function

请记住,一旦您获得合法登录,即使是其他登录尝试也会返回true。

这通常不是什么大不了的事,但这意味着你提供了一个有效的连接到上面,如果它登录并工作,那么现在你所有的链接表(没有uid/密码)都会工作。

我注意到上面的问题,一旦你完成了登录,那么运行上面的所有第二次或更多次都会起作用(即使不好或不正确!!-不要忘记这个提示!!)。(这可能会让开发人员感到困惑,因为他们执行登录(或打开表)。然后他们用BAD uid/密码测试上述例程,它就工作了!!!

因此,您必须退出访问权限才能清除密码缓存——别无选择。

因此,请记住以上提示。

最新更新