如何让 ms-access 以与其 Active Directory ID 不同的用户身份连接(通过 ODBC)到 ms-sql 数据库?

我不想在 ODBC 连接中指定帐户,我想在 ms-access 端执行此操作以对用户隐藏它。在 ODBC 连接中执行此操作将使我立即回到我试图避免的原始情况。

是的,这与之前的问题有关: http://www.stackoverflow.com/questions/50164/

有帮助吗?

解决方案

我认为如果您使用 “ODBC DSN-LESS 连接”

如果需要,请使用 Windows 身份验证将 ODBC DSN 保留在用户的计算机上。授予您的用户对数据库的只读访问权限。(如果他们创建一个新的 mdb 文件并链接表,他们将只能读取数据。)

创建一个对数据库具有读/写权限的 SQL 登录名。

编写一个 VBA 例程,循环遍历链接表并重置连接以使用 SQL 登录,但请务必使用“DSN-Less”语法。

"ODBC;Driver={SQL Native Client};" &
       "Server=MyServerName;" & _
       "Database=myDatabaseName;" & _
       "Uid=myUsername;" & _
       "Pwd=myPassword"

将此例程作为启动代码的一部分调用。

关于此方法的一些注意事项:

  • 从读/写更改为只读并尝试返回读/写而不关闭并重新打开数据库 (mde/mdb) 文件后,Access 似乎存在连接信息问题。如果您可以在启动时将其更改为读/写,并且在会话期间不更改它,则此解决方案应该有效。

  • 通过使用 DSN - Less 连接,您可以在代码中隐藏用户的凭据(假设您给他们一个 mde 文件,您应该没问题)。通常,硬编码连接字符串不是一个好主意,但由于您正在处理内部应用程序,因此您应该可以接受这种方法。

其他提示

我认为您必须在要用于连接的帐户下启动 MS Access 进程。有多种工具可以让您执行此操作,例如 CPAU. 。该工具还可以让您加密密码。

我们在这里承认您正在使用 ODBC 连接到数据库并启用集成安全性,因此您没有/不想在连接字符串中写入用户名/密码值(根据我的说法,这是正确的选择)。

在这种情况下,幸运的是,在连接数据时无法“模拟”另一个用户。跟我一起承认,能够做出这样的事情将是集成安全方面的巨大突破!

我从您之前的帖子中了解到,您希望用户能够更新或不更新数据,具体取决于他们使用的客户端界面。据我所知,这个想法是为每个表创建一个链接的“不可更新”视图。假设对于每个名为 Table_Blablabla 您创建一个名为的视图(= Access 中的查询) View_Table_Blablabla ...).

使用 Access 时,您可以在运行时决定是要打开可更新表还是只读视图。例如,这可以在运行时完成,在 form_Open 事件,通过将表单记录源设置为表或视图。

@菲利普
我假设你正在使用这个词 承认 大致相当于 理解 也许 同意;与相反的相反 否定.

我理解让所有用户使用一个 ID 和密码登录数据库(并将它们存储在应用程序中)的含义。对我来说,这比我现在面临的问题风险要小。
@离开

该问题的更多背景:我使用 Windwos NT 身份验证在每个用户工作站上设置了 ODBC 连接。大多数时候,用户使用 MDE 设置进行连接以使用 ODBC 连接 - 在这种情况下,他们始终能够添加/更新/删除数据。

问题是,一些用户接受了足够的 MS-Access 教育,可以创建新的 mdb 并将其链接到 MS-SQL 服务器。然后,他们可以直接在表中编辑数据,而不是通过执行一定量的验证和手动操作的应用程序。和他们 喜欢 这样做,但有时会把事情搞砸并给我带来问题。

我希望做的(我刚刚尝试过)是为每个表刷新数据库的链接,就像这样(注意:在本实验中,我已将 ODCB 连接切换到 SQL Server 身份验证,并将帐户添加到 SQL Server: 只读 - 无法进行任何更新,并且 读写 - 拥有该表的全部权限)。

myTable.Connect = _
                "ODBC;" & _
                "DATABASE=" & "MyTestDB" & ";" & _
                "UID=readonly;" & _
                "PWD=readonly_password;" & _
                "DSN=" & "MyTestDB" & ";"
myTable.RefreshLink

这阻止了他们编辑,但我无法让以后的读写工作

myTable.Connect = _
                "ODBC;" & _
                "DATABASE=" & "MyTestDB" & ";" & _
                "UID=readwrite;" & _
                "PWD=readwrite_password;" & _
                "DSN=" & "MyTestDB" & ";"
myTable.RefreshLink

似乎无论我首先连接哪个权限,都会永久保留。如果我开始读写然后转到只读,则该表仍具有读写权限

为什么不使用集成/Windows 安全性。您可以向 Active Directory 组授予您想要的用户权限,然后将用户帐户添加到该组。我相信除此之外,您还可以使用 sql server 的角色功能来根据所使用的客户端应用程序来限制功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top