vba - 将 uid 和 pwd 文件调用到系统 dsn 的访问数据库中
问题描述
我有 5 个不同的 MS Access 2013 db 文件,它们连接到系统 dsn 文件(链接服务器)机器/系统 dsn 是基于 Oracle 的,但我遇到的问题是 1 我的密码没有加密,必须每 90 天更改一次2 我必须打开每个文件并在更改密码时多次保存我的密码。
我希望有一个安全的位置存储凭据并将其传递给访问,以便其他用户看不到它们,并且不必在每个访问文件上保存我的密码并重新链接它。
我已经用谷歌搜索了超过 2 天,但除了查看仍然无法解决问题的连接字符串之外找不到任何东西。我需要看什么来解决这个问题?
抱歉,我没有代码,因为我只是在 ms 访问中使用链接表向导。
@Albert DI 无法让您的代码正常工作,但我已经完成了以下操作,解决了表上的问题,但没有解决直通查询
创建了一个文件 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:\folderlocation\filename.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 连接。即使没有代码,您也可以创建这些连接!
甚至更好?如果服务器+数据库名称没有改变,但只有密码?您可以更改用户 ID + 密码,而无需重新链接表(非常适合您更改密码,但不更改服务器 + 数据库)。
更好更好?如果您采用一点“登录”代码,那么您不必将密码存储在表链接中!如果有人决定启动访问权限并说导入您的链接表,这意味着什么?好吧,首先,他们将无法打开表,甚至更好的是 uid/密码不是其中的一部分,也不是存储在每个链接表的连接字符串中。如前所述,因此,您可以更改 UID,而不必重新链接表。
第一步:首先,总是(但总是!)链接表时,使用 FILE dsn。这很重要,因为在访问中使用 FILE dsn 时,它们会自动为您转换为无 DSN 连接。
换句话说,如果您使用 FILE dsn 链接表,那么一旦重新链接表,您甚至可以删除或丢弃 DSN。这意味着您可以将链接数据库(前端)部署到任何工作站。您不必在该工作站上设置 DSN,实际上根本不需要设置任何东西。(您当然需要 oracle 数据库驱动程序)。
上面的意思是当密码被更新/更改时,你可以简单地推出一个新的前端。事实上,您的应用程序可能具有一些自动更新功能。(如果你不这样做,那么你可以(应该)拼凑一些代码来为你做这件事)。所以,你应该有一些方法来推出你的软件的新版本。毕竟,您真的必须像使用所有其他软件一样在每个工作站上安装“应用程序”,对吗???
因此,这里有两个部分: 为表链接采用 FILE dsn。如前所述,一旦执行此操作,您就不再需要 DSN。这非常适合分发到每个工作站。
还请确保在进行链接时,不要选中该框以保存密码。这是为了确保 uid/password 不会保存在连接字符串中。
那么,如果表没有 uid/密码,那么它们将如何工作?好吧,您所做的是在启动代码中对数据库执行“登录”。执行此登录后,所有链接表都将起作用!正是这段“小”代码可以读取您放置在外部文件中的 uid/密码。您放置此 uid/密码的位置取决于您。它可以嵌入在代码中,甚至可以嵌入到您在启动时阅读的一些外部文本文件中。它甚至可以是前端的本地表。(如果您在推出软件的下一个出色版本时有某种自动更新系统,这个想法会很有效。
因此,有了执行登录的能力,而不必重新链接表,我们就有了一种简单的方法来更改密码。
所以,你必须:去 dsn-less。值得庆幸的是,默认情况下访问会执行此操作,但前提是您使用 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,并在上面使用。您可能会拼凑一些代码来构建连接字符串。然后将一些代码添加到您的代码中以读取外部 ext 文件,或者在某个表中包含 UID/密码。上述登录代码必须在使用或触摸任何表单或链接表之前运行。
整个过程很简单,但前提是您将其分解为正确的步骤。
此登录技巧和示例代码的工作原理并不复杂,但此处概述了解释此方法的完整文章
电源提示:提高数据库连接的安全性
推荐阅读
- sql-server - 在 SQL Server 存储过程中,我需要写一个条件,当参数值在表中不可用时,它应该显示完整的数据
- mysql - Wordpress Docker:建立数据库连接时出错(MYSQL)
- regex - 如何使用正则表达式剪切字符串直到出现第一个数值
- css - 如何一次锁定一个方向的滚动捕捉?
- python - 为什么我找不到硒元素?
- java - 遍历 HashMap 的键范围
- axios - 各浏览器最不支持的 Axios 版本
- react-native - ArcGIS for React Native Expo?
- javascript - 有没有办法检查返回对象/数组的Javascript函数是否为空?
- php - 如何修复错误 pg_query() [function.pg-query]: Query failed: ERROR: column "" does not exist LINE 1: ...oad(filename, detail, folder, dateupload)