我有5个不同的MS Access 2013数据库文件,它们连接到系统dsn文件(链接服务器)机器/系统dsn是基于Oracle的,但我遇到的问题是1我的密码没有加密,必须每90天更改一次2我必须打开每个文件,并在密码更改时多次保存密码。
我希望有一个存储凭据的安全位置,并将其传递给访问权限,这样其他用户就看不到凭据不必在每个访问文件上保存我的密码并重新链接。
我已经在谷歌上搜索了两天多,但除了查看连接字符串之外,找不到其他任何东西,这仍然不能解决问题。我需要看些什么来解决这个问题?
对不起,我没有代码,因为我只是在ms访问中使用链接表向导。
@Albert D我无法让你的代码工作,但我已经完成了以下操作,修复了表上的问题,但没有修复直通查询
创建了一个文件DSN,并将一些表链接到访问数据库。创建了一个Excel文件来存储我的用户名和密码,但我在直通查询中的凭据仍然显示我被卡住了?
Option Compare Database
Function Connections()
On Error Resume Next
'delete query if exists
DoCmd.DeleteObject acQuery, "PTQ"
Err.Clear
On Error GoTo 0 '"on error" statement here
'GET EXCEL LOGIN DETAILS
Set xlsApp = CreateObject("Excel.Application")
Dim WkBk As Excel.WorkBook
Set WkBk = xlsApp.WorkBooks.Open(FileName:="C:folderlocationfilename.xlsx")
Dim USERLIST As String
Dim PWDLIST As String
USERLIST = WkBk.Sheets(1).Range("A2").Value
PWDLIST = WkBk.Sheets(1).Range("B2").Value
If Not (xlsApp Is Nothing) Then xlsApp.Quit
'end excel stuff
Dim db As DAO.Database
Dim qdExtData As QueryDef
Dim strSQL As String
Set db = CurrentDb
'passthrough query statement
strSQL = "SELECT * FROM table"
Set qdExtData = db.CreateQueryDef("PTQ")
ServerName = "Server1"
qdExtData.Connect = "ODBC;DRIVER={Oracle in OraClient11g_home1};Server=" & ServerName & ";DBQ=Server1;UID=" & USERLIST & ";Pwd=" & PWDLIST & ""
qdExtData.SQL = strSQL
qdExtData.Close
db.Close
Set db = Nothing
End Function
然后我设置了一个名为AutoExec 的运行代码宏
好的,首先?我会避免(不使用)系统或用户DSN。原因有很多,但这些类型的DSN不仅需要外部引用,而且通常需要提升的注册表权限。更糟糕的是,你的密码会在众目睽睽之下。
最好的解决方案是使用所谓的无DSN连接。即使没有代码,您也可以创建这些连接!
甚至更好?如果服务器+数据库名称没有更改,但只更改了密码?您可以更改userID+密码,而无需重新链接表(非常适合更改密码的用户,但不适合更改服务器+数据库)。
更好更好?如果你采用了一点"登录"代码,那么你就不必将密码存储在表链接中!如果有人决定启动访问,并说导入您的链接表,这意味着什么?首先,他们将无法打开表,更好的是,uid/密码不是其中的一部分,也不会存储在每个链接表的连接字符串中。如前所述,因此,您可以更改UID,而不必重新链接表。
第一步:首先,链接表时,请使用FILE dsn。这一点非常重要,因为在访问中使用FILE dsn时,它们会自动转换为无dsn连接。
换句话说,如果您用FILE dsn链接表,那么一旦重新链接表,您甚至可以删除或丢弃dsn。这意味着您可以将链接数据库(前端)部署到任何工作站。您不必在该工作站上设置DSN,而且实际上根本不必设置任何内容。(当然,您将像以前一样需要oracle数据库驱动程序)。
上面的意思是,当密码被更新/更改时,你可以简单地推出一个新的前端。事实上,您的应用程序可能具有一些自动更新功能。(如果你不这样做,那么你可以(应该)拼凑一些代码来为你做这件事)。因此,您应该有一些方法来推出新版本的软件。毕竟,你真的必须像对待所有其他软件一样,在每个工作站上安装你的"应用程序",对吧???
因此,这里有两个部分:对表链接采用FILE dsn。如前所述,一旦完成此操作,就不再需要DSN了。这非常适合分发到每个工作站。
还要确保当你链接时,你不会勾选保存密码的框。这是为了确保uid/password不会保存在连接字符串中。
那么,如果表没有uid/password,那么它们将如何工作呢?好吧,您要做的是在启动代码中执行对数据库的"登录"。执行此登录后,所有链接的表都将工作!正是这个"小"代码可以读取您放置在外部文件中的uid/密码。这个uid/密码放在哪里由您决定。它可以嵌入到代码中,甚至可以是启动时读取的一些外部文本文件。它甚至可以是前端的本地桌子。(如果你有某种自动更新系统,当你推出下一个伟大的软件版本时,这个想法会很好
因此,有了执行登录的能力,而不必重新链接表,我们就有了一种简单的方法来更改密码。
因此,您必须:少去dsn。值得庆幸的是,访问在默认情况下会这样做,但前提是您使用FILE dsn。
获取/获取用于执行数据库登录的代码。事实上,你喜欢删除所有的表链接。退出Access,然后重新启动Access。现在,运行登录代码,然后重新链接表(使用您创建的FILE dsn)。
执行登录的代码如下:
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.
qdf.sql = "SELECT 1 "
qdf.Execute
TestLogin = True
Exit Function
TestError:
TestLogin = False
Exit Function
End Function
以上当然需要一个正确形成的连接字符串。
因此,为了使所有这些工作正常进行,您可以采用FILE dsn,并使用上面的。你会喜欢把一些代码拼凑在一起,为你构建一个连接字符串。然后在代码中添加一些代码来读取外部文本文件,或者在某个表中包含UID/密码。在使用或触摸任何表单或链接表之前,必须运行上述登录代码。
整个过程很简单,但前提是要将其分解为正确的步骤。
这种登录技巧和示例代码的工作原理并不复杂,但在这里概述了一篇完整的文章来解释这种方法
电源提示:提高数据库连接的安全性
https://www.microsoft.com/en-us/microsoft-365/blog/2011/04/08/power-tip-improve-the-security-of-database-connections/