在 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 存储过程而不在传递查询中保存密码的主要内容,如果未能解决你的问题,请参考以下文章

oracle存储过程里调用存储过程

如何在ORACLE存储过程中调用WEBSERVICE函数

在 Oracle 中从另一个存储过程调用一个存储过程

将变量从 Access(前端)传递到 Oracle(后端)存储过程

ORACLE存储过程里可以声明过程和函数吗

oracle函数和存储过程有什么区别