在 ms 访问中调用 oracle 存储过程而不在传递查询中保存密码
Posted
技术标签:
【中文标题】在 ms 访问中调用 oracle 存储过程而不在传递查询中保存密码【英文标题】:calling oracle stored procedure in ms access without saving password in pass through query 【发布时间】:2015-02-04 11:52:08 【问题描述】:我正在使用 MS ACCESS 2003,我需要通过 ms 访问调用 oracle 存储过程。我正在使用 pass through 查询来调用该过程。我已经使用 Microsoft ODBC 驱动程序创建了用户 DSN,并且能够成功调用该过程。 ODBC;DSN=DSN_NAME;UID=USER_NAME;PWD=*******;DBQ=MY_SERVER
但我担心的是在直通查询中保存密码,有时密码会更改,然后我必须每次更改直通查询的连接字符串。
是否有任何其他方法可以通过 pass through 查询调用过程而不更改密码更改时的连接字符串,或者 vba 中是否有任何代码可以执行相同操作。我正在寻找动态方式,其中调用过程很容易,而无需通过转到其属性来更改每个 pass through 查询的密码。 谢谢 !!
【问题讨论】:
【参考方案1】:是的,这是可能的,但是您需要知道或者换句话说,能够在您的应用程序中以某种方式检索密码。在生产线应用程序中,您将使用用户(登录)密码创建连接字符串以访问后端表。
结构看起来类似于:
-
创建一个模块来托管与连接相关的公共功能。
创建新函数 GET_CONNECTION_STRING() 作为字符串:它将返回您的连接字符串,包括登录用户的密码。
遍历数据库中的表定义/查询定义并更新 .connect 属性。
在大多数情况下,您会更改 .connect 属性并使用 .RefreshLink 手动刷新/连接。
您需要添加一个新的引用才能使用 DAO 对象。 (Microsoft dao 对象、activex 数据对象或 ado 对象,无论您想使用哪种类型)
一些启动代码:
dim db as dao.database
set db = currentdb
dim tdf as dao.tabledef
For Each tdf In db.TableDefs
If tdf.connect <> vbNullString Then
tdf.connect = GET_CONNECTION_STRING & ";TABLE=" & tdf.name
'if you want to manually refresh uncomment below line
'tdf.refreshlink
End If
End If
Next tdf
将上述函数添加到启动宏将确保所有链接表(您需要执行额外的查询)都使用最新的连接字符串进行更新。
当您遇到困难时尝试发布您的代码。
【讨论】:
【参考方案2】:任何链接表以及在 Access 中包含“已保存”传递查询的表都不需要密码包含在该字符串中。如果您遗漏了密码,那么单次登录到 Oracle 数据库将允许所有链接的表并通过查询来运行并且无需密码即可。
第一步是将您的表设置为少 DSN,并且不要包含密码(您最好删除现有的链接表)。
使用上述链接但不包括密码意味着您首先必须登录数据库。完成后,您可以链接您的表格和传递查询。因此,作为 DSN 的一次性表格链接较少,您就可以参加比赛了。
完成上述操作后,任何和所有连接(包括直通查询)都将正常工作且无需包含用户名。
因此,以上意味着您不必为登录数据库的不同用户重新链接。
要运行传递查询,您可以使用这一行 VBA 代码:
CurrentDb.Execute.QueryDefs("MyPassQuery").execute
此处概述了如何使用无 DNS 进行链接: http://www.accessmvp.com/djsteele/DSNLessLinks.html
此处概述了如何“缓存”用户登录,并且在链接连接或用于传递的连接中不需要用户 + 登录:
电源提示:提高数据库连接的安全性
http://blogs.office.com/b/microsoft-access/archive/2011/04/08/power-tip-improve-the-security-of-database-connections.aspx
因此,您可以在启动时执行一次登录,或提示用户登录,然后在您的应用程序和 pass-=though 查询将在不需要密码的情况下运行。这也意味着您可以让不同的用户登录,而不必重新链接现有的表(和传递查询)。
【讨论】:
以上是关于在 ms 访问中调用 oracle 存储过程而不在传递查询中保存密码的主要内容,如果未能解决你的问题,请参考以下文章