保存从MS Access 2007到MS SQL服务器的ODBC连接的密码
我负责将旧的Access 2007项目迁移到MS SQL Server 2008 Express。第一阶段是将所有数据从MS Access数据库移动到SQL服务器,同时保留Access窗体和报告在客户端。保存从MS Access 2007到MS SQL服务器的ODBC连接的密码
因此,现在移动数据,创建一个SQL服务器用户(仅用于访问该特定数据库),并通过ODBC连接将这些表链接到Access数据库。然而,应该以某种方式解决一个麻烦:当打开Access数据库时Access会定期询问用户密码。
服务器PC和客户端PC上的用户都登录到他们的本地机器上,即他们的用户未在独立域服务器上验证。
我看到有几种方法如何解决这个问题:
- 1)配置集成的安全模式,以便用户可以登录,被他的Windows登录自动授权(即,使用“可信连接“)。由于服务器PC无法识别来自客户端PC的用户,我不确定如何做到这一点。如果我现在尝试执行此操作,则会出现用户从不受信任域连接的错误。
- 2)在客户端存储SQL服务器用户密码。不过,我不确定这是可能的。我知道在某些配置文件中保留密码,或者在应用程序配置中存储混淆,应该考虑降低安全性,但对于给定的设置,这是可以接受的。
- 3)也许一些其他方式如何将SQL服务器表连接到Access?
最好的解决方案显然是使用Windows安全。
如果不适合,这里是一个可能的选择技巧,利用Access将记住所有打开的连接的事实,直到程序关闭:
- 复制你的一个表的连接字符串
- 创建一个passthru查询“ptqConnect”,并在其中输入任何快速的SQL语句,如
SELECT 1
- 将连接字符串粘贴到PTQ Connect属性中,并确保在其中添加了
PWD=something;
。 - 在您的应用的启动过程中请确保您打电话给PTQ。像
DCount("*", "ptqConnect")
就可以做。
就是这样。由于Access会记住打开的连接,直到关闭它为止,即使关闭了数据库,即使没有密码存储在链接表连接字符串中,现在也可以打开其他表格,而不会有任何大惊小怪。
如果您不想公开包含PWD的连接字符串,则可以从VBA启动连接,并通过提供MDE或密码保护代码来隐藏代码。
你可以找到这种行为的解释here。
通知用户贵组织的安全策略禁止存储密码。因此,他们每次打开数据库时都必须提供密码。解释此策略会拒绝未经授权的用户从授权用户的机器打开数据库的能力。如果密码以任何方式存储,歹徒可以简单地坐在无人看管的机器上并打开数据库。
由于您无法使用可信连接,因此这是最安全的方法。是的,用户每次打开数据库时都必须提供密码,但这是保证数据安全的原因。
编辑:由于您的选项#2是可以接受的,您可以将uid和pwd存储在ODBC链接表的连接字符串中。
Driver={SQL Server Native Client 10.0};
Server=myServerAddress;
Database=myDataBase;
Uid=myUsername;Pwd=myPassword;
复制一个例子,我拆分浏览器显示的单个行字符串。您还需要确定每个链接指向哪个表;检查你当前的链接连接字符串,看看如何完成。
uid和pwd将为纯文本,任何可以查看连接属性的人都可以看到。但我没有看到任何迹象表明这些是你的担忧。
这是一个很好的建议,但现在很可能我不得不将密码更改为一个字符。他们觉得设置中央域名服务器太麻烦了,以至于只能从另一台PC上的Access应用程序中使用SQL服务器数据。毕竟,我倾向于同意完全控制这个“不安全”SQL服务器用户的权限,并且连接也可能受服务器上的本地防火墙限制。 – Passiday 2012-02-01 20:03:48
防火墙问题已经过去了。如果防火墙允许从Bob的电脑到SQL Server的连接,它如何知道Bob是坐在Bob电脑上的人,而不是当Bob被意外拨出并忘记退出Windows会话时坐下的黑幕人物,或者锁定它? – HansUp 2012-02-01 21:41:12
不,我假设你最初想到在局域网中使用_another_ PC的一些黑幕字符。当然,你提到的场景是一个潜在的风险,但是如果黑幕人物偷偷摸摸地看到无人看管的用户计算机,公司就会遇到更严重的问题。 – Passiday 2012-02-01 22:31:27
刚刚遇到这个问题,远程连接到我的工作场所SQL服务器使用Access。我有Access 2013,但我认为它没有对2010年的ODBC连接这样基本的东西做任何更改。由于它不是可信连接,是的,每次连接时都必须登录到服务器数据库。这只是基本的安全性;想不到为什么你会想要一个应用程序只从一个不受信任的网络连接不受挑战。所以,我希望在打开数据库时必须登录。
什么是快把我逼疯了,然而,是每一位我试过一次打开表,我被要求输入密码,并不仅仅是一次,而是两次,我必须使用创建时随机生成的13个字符的密码!不用说,这是完全不能接受的。
访问保持sys表MSysOBjects中的连接信息,但我不存储密码,至少不存在。我使用存储在与我的桌面同步的云服务器上的访问数据库,因此我可以打开本地副本而不必远程访问我的工作桌面。这种方式快得多。
但是,在Access中使用db作为本地文件意味着我密切关注DSN连接名称。只要它们在所有计算机上都是完全相同的,它效果很好。因此,如果我在ODBC32 Windows工具中创建它时使用了DSN“ProductsDBIII”,那么在家中创建它时需要使用相同的名称。实际的连接字符串将会不同,但Access并不关心这一点。但是,这里有个诀窍:例如,当我第一次从家里访问数据库时,在工作一天后,我必须刷新Access链接表管理器中的连接。只需检查您需要的表格/视图,或“全部检查”,然后继续。 Access会建立连接 - 可能提示您登录 - 然后快速刷新MSysObjects表中的“连接”字符串字段,因为它们会不同,至少从可信访问切换。
瞧,每当我打开一张桌子时,没有更多的单一或双重挑战。当我第一次打开远程数据库中的表格时首次建立连接时,我会被问到一次,但就是这样。
希望这可以帮助别人。
Jim
重新使用Passthrough QAuery来设置ODBC连接。
在数据库选项中作为启动窗体引用的窗体将触发BEFORE自动执行。 因此,表格不能/不应该引用链接表, 或 不需要;并在autoexec中设置表单。
否则你仍然会被提示PWD ODBC连接
一个典型的问题情景中的链接数据库
我有过这样的问题,使用切换形式的表,与Access 2010,链接到SQL Azure,但它非常简单。链接表格时,每个表格都会有一个勾选框来保存密码。
重新链接你的表并检查这个选项将排序问题。它确实会给你警告,这可能不安全,但并非所有数据库都包含机密数据。
我没有保存密码复选框。而且,当我尝试手动更新连接字符串(TableDef.Connect = connectionString)时,它似乎忽略pwd设置。 – Hill 2017-03-02 23:01:13
这真的是最好的解决方案。美丽是你甚至不必在连接字符串中包含用户名+密码。一个小的登录框在启动时,执行小的通过,而PRESTO-所有链接表现在都可以工作。所以甚至不需要重新链接表格。当然,第一次链接需要DSN少连接和一些表链接代码,或者如果需要在测试服务器和生产服务器之间切换 – 2014-02-26 23:52:14
我必须添加步骤3在您的答案中您必须提供UID参数,而不仅仅是PWD 。 ODBC链接表不存储UID和PWD,因此必须由VBA代码提供,否则用户将面临SQL Server登录对话框。 – Passiday 2016-08-15 17:09:32