如何在 Access 项目和 SQL Server 2000 Desktop Edition 中使用应用程序角色

文章翻译 文章翻译
文章编号: 308312 - 查看本文应用于的产品
高级:要求具有高级编程、互操作性和多用户技能。

本文只适用于 Microsoft Access 项目 (.adp)。

展开全部 | 关闭全部

概要

本文解释了在 Microsoft Access 项目 (ADP) 中使用 Microsoft SQL Server 应用程序角色的能力、限制和变通方法。

更多信息

在 SQL Server 中,您可以创建数据库角色,以更方便地管理数据库中的权限。您不用为每一个用户分别授予权限,而是可以通过使具有相同权限需要的用户成为同一常规数据库角色的成员而将他们分组,然后向数据库角色本身授予权限。成员用户将得到授予此数据库角色的权限,除非在别的位置明确拒绝了某一特定权限。

常规数据库角色在您希望用户能够执行他们自己特定的数据库查询或更新的情形中非常有用,但它们并不总是适用。有时,您可能希望用户在其使用一个特定的应用程序时只具有某些权限,并且您不希望他们能够查看或修改此应用程序之外的数据。

此问题的一个常用变通方法是,只将必要的权限赋予一个 SQL Server 用户帐户。实际的用户可能有权连接到数据库但不能查看或修改任何数据。在用户使用其自己的帐户连接到数据库之后,ADP 就会以程序化方式使用有权限的用户帐户的凭据重新连接。这一做法很有效,但它无法让您区分数据库中的用户或确定哪一用户执行了哪一特定操作。

应用程序角色正好可以变通解决此限制。与常规数据库角色不同,应用程序角色本身没有成员,用户要使用其自己的凭据登录到 SQL Server 并连接到一个数据库。此时,将通过使用 sp_setapprole 存储过程将一个应用程序角色的安全上下文以程序化方式应用于现有连接。在 SQL Server 中将仍能够区别各个用户,但是对于一个特定连接可用的权限限制为该应用程序角色的权限。将不再考虑用户自己的权限,不管它是更大还是更小。

创建应用程序角色

Access 2002 或 Access 2000 项目都不具有任何可用来创建 SQL Server 安全对象(如应用程序角色)的可视化设计工具。Microsoft 建议您使用包含在 SQL Server 或 Microsoft Office XP Developer 常规版本中的客户端工具创建应用程序角色并指派其权限。不过,您仍可以通过使用 ADP 中的 Transact-SQL (T-SQL) 创建应用程序角色并赋予其必要的权限。但完整讲解 SQL Server 安全机制已超出了本文的范围,您可以在 SQL Server 联机图书或在以下 Microsoft MSDN Web 站点上的文章中查到更多信息。
Microsoft SQL Server 2000 安全机制
以下步骤向您展示了如何以程序化方式创建应用程序角色并向该新角色赋予“选择”权限:
  1. 启动 Access。
  2. 帮助菜单上,指向示例数据库,然后单击罗斯文示例 Access 项目
  3. 在“数据库”窗口中,单击对象下的模块,然后单击新建以在“Visual Basic 环境”打开一个新模块。
  4. 将以下代码键入或粘贴到该新模块:
    Public Function AddNewAppRole(RoleName As String, PW As String) As Boolean
    On Error GoTo EH:
    If CurrentProject.IsConnected Then
    Dim sTSQL As String
        'Create the command
    sTSQL = "EXEC sp_addapprole '" & RoleName & "','" & PW & "'"
        'Send the command
    Application.CurrentProject.Connection.Execute sTSQL
    AddNewAppRole = True
    Else
    AddNewAppRole = False
    End If
    Exit Function
    EH:
    MsgBox Err.Number & ": " & Err.Description, vbCritical
    AddNewAppRole = False
    End Function
    					
  5. 保存此模块,然后退出 Visual Basic 环境。
  6. 创建“客户”表的一个副本,然后将其另存为 tNewTable
    1. 在“数据库”窗口中,右键单击客户表,然后在快捷菜单上单击另存为
    2. 另存为对话框中的 Save Table 'Customers' To(将表“客户”保存到)框中键入 tNewTable,然后单击确定以完成新表创建。
  7. 在“数据库”窗口中,单击对象下的窗体,单击新建,然后单击确定以在“设计”视图中打开一个新窗体。
  8. 向新窗体中添加命令按钮。
  9. 将该新命令按钮的 OnClick 属性设置为以下事件过程:
    On Error GoTo EH:
    'Code only works if ADP is connected.
    If CurrentProject.IsConnected Then
        Dim bNewAppRole As Boolean, strTSQL As String
        Dim strRoleName As String, strPW As String
        strRoleName = "AppRoleName"
        strPW = "Password"
        'Call function to create app role.
        bNewAppRole = AddNewAppRole(strRoleName, strPW)
        'Test to see if it failed.
        If bNewAppRole = False Then
            Exit Sub
        End If
        MsgBox "New Application role '" & strRoleName & "' created", vbInformation
        'Create command to grant permissions.
        strTSQL = "Grant Select on tNewTable to " & strRoleName
        'Send the command.
        Application.CurrentProject.Connection.Execute strTSQL
        MsgBox "Select permissions granted on tNewTable for " & strRoleName
    Else
    MsgBox "ADP must be connected to SQL Server"
    End If
    Exit Sub
    EH:
    MsgBox Err.Number & ": " & Err.Description, vbCritical
    					
  10. 关闭 Visual Basic 环境以返回到窗体。
  11. 保存此窗体,然后将此窗体切换到“窗体”视图。
  12. 单击此命令按钮以运行底层代码。请注意,您会收到指出运行成功的两个消息框。第一个在创建应用程序角色之后收到,第二个在赋予对 tNewTable 的新的角色权限之后收到。

实施应用程序角色

在 Access 项目中使用应用程序角色时的主要问题是,Access 使用三个到 SQL Server 的连接来处理各种任务。理想情况下,若要将应用程序角色应用到整个项目,您必须在所有这三个连接的上下文中执行 sp_setapprole。由每一个连接处理的对象如下:

  1. 用于确定出现在“数据库”窗口中的对象和用于杂项数据库管理任务。

    用于打开表、视图、存储过程、函数和窗体及子报表(但不包括主报表本身)的记录源。

    用于获取组合框、列表框和报表的记录源。
  2. 用于打开表、视图、存储过程、函数和窗体及子报表(但不包括主报表本身)的记录源。

    用于获取组合框、列表框和报表的记录源。
  3. 用于获取组合框、列表框和报表的记录源。

尽管连接 #2 和 #3 可以相当方便地访问到,但没有方法可用来在连接 #1 的上下文中执行存储过程。不过幸运的是,连接 #1 是这三个连接中重要程度最低的一个连接,并且,通过构造自己的用户界面(例如,切换板式的窗体)来处理数据库对象,而不是依靠内置的数据库窗口进行处理,即可方便地变通解决此问题。

以下步骤使用 NorthwindCS 示例项目演示如何将应用程序角色应用到连接 #2 和 #3:

  1. 在“数据库”窗口中,单击对象下的窗体,单击新建,然后单击确定以在“设计”视图中打开一个新窗体。
  2. 在新创建的窗体中添加一个列表框,然后将此列表框的 Name 属性设置为 lst_AppRole
  3. 向窗体添加一个命令按钮。
  4. 将该新建命令按钮的 OnClick 属性设置为以下事件过程:
    On Error GoTo EH
        'This avoids a message that no records were returned.
    DoCmd.SetWarnings False
    Dim TSQL
    TSQL = "EXEC sp_setapprole 'AppRoleName', {Encrypt N 'Password'}, 'odbc'"
        'This sets the app role on Connection #2.
    Application.CurrentProject.Connection.Execute TSQL
        'This sets the app role on Connection #3.
    lst_approle.RowSource = TSQL
    lst_approle.Requery
    DoCmd.SetWarnings True
    MsgBox "The application Role is now in effect.", vbInformation
    Exit Sub
    EH:
    MsgBox Err.Number & ": " & Err.Description, vbCritical
    					
  5. 关闭 Visual Basic 环境以返回到窗体。
  6. 保存此窗体,然后将此窗体切换到“窗体”视图。
  7. 单击此命令按钮以运行底层代码。注意您会收到一个指出运行成功的消息框。
  8. 在“数据库”窗口中,单击对象下的,然后打开 tNewTable 表。
  9. 修改记录并尝试保存此更改。
注意,当您尝试提交更改时,您将收到一条指出没有足够权限的错误消息。发生这种情况是因为,您向新的应用程序角色赋予了对 tNewTable 表的“选择”权限,但是没有赋予“更新”权限。

在设计上,Access 只在“数据库”窗口中显示用户至少对其具有“选择”或“执行”权限的对象。Access 使用连接 #1 来确定用户对哪些对象有权限。在将应用程序角色应用到连接 #2 和 #3 之后,即使用户对所有对象可能不再拥有权限,或者可能具有对未显示的更多对象拥有权限,“数据库”窗口仍将显示它以前显示的那些对象。在使用“数据库”窗口时,这可能会导致发生意外行为。

例如,当您打开 tNewTable 表时,用户“看起来”有编辑和插入记录的权限。表底部的插入新记录图标已启用,用户能够在编辑模式下插入记录。您看不到任何明显的表明有异常的线索,直到您尝试提交编辑或插入时才会出现错误消息。Access 认为您有权限,但实际上您没有。

最有效的变通方法是为用户提供一个自定义界面并且不依靠此“数据库”窗口。通过使用切换板式的用户界面,您可以精确地控制用户可以访问的对象。

其他限制和安全注意事项

子窗体不工作

与其他数据库对象不同,Access 不总是使用同一个连接检索子窗体的数据源。Access 频繁地(但不总是)创建到 SQL Server 的连接,但只是为了处理子窗体记录集,或者检索将子窗体连接到主窗体的链接字段数据。因为没有将应用程序角色应用到此新连接,如果您没有对此数据库对象的明确权限,则可能会发生权限错误。不幸的是,这意味着在应用应用程序角色时没有可靠的办法来使用绑定子窗体。唯一有效的变通方法是,使用完全非绑定的子窗体,以程序化方式处理数据操作。这是在 Access 中使用应用程序角色时最严重的限制。

报表不工作

当您具有作为报表或子报表的记录源列出的对象(如表或视图名称)时,Access 在从 SQL Server 检索任何数据前将首先查看此对象是否列出在“数据库”窗口中。因为“数据库”窗口使用一个未应用应用程序角色的连接,所以如果您对底层的数据源没有明确的权限,则会发生错误。

为变通解决此问题,请总使用 Transact-SQL 语句作为窗体和报表的记录源。例如,使用“Select * from ViewName”而不是只使用“ViewName”,或者使用“Exec StoredProcedureName”而不是只使用“StoredProcedureName”。这样,Access 就将 Transact-SQL 直接传递到 SQL Server 并根据应用程序角色的权限检索数据。

公共数据库角色

应用程序角色获得了公共数据库角色的权限。在 NorthwindCS 中,默认情况下 Public 角色具有对多数对象的完全权限。因此,应用程序角色往往不够有效。当您在“创建应用程序角色”部分创建 tNewTable 表时,没有授予 Public 角色对此表的权限,并且随后您看到了应用程序角色的安全上下文在此表上的效果。不过,其他表在此应用程序角色下可能未显示出什么不同,原因是 Public 角色具有对这些对象的权限。

VBA 安全机制

因为应用程序角色的密码嵌入了调用它的应用程序,所以有经验的用户将能够从源代码中看出应用程序角色名称和密码,然后使用此信息从其他应用程序获取对 SQL Server 的访问。因此,将 ADP 编译成 ADE 文件以便看不到源代码不失为一种好办法。至少应在 VBA 项目上强制实施一个密码。

参考

有关本文的 Microsoft Access 2000 版本的其他信息,请单击下面的文章编号,查看 Microsoft 知识库中相应的文章:
318816 ACC2000:How to Use Application Roles with Access Projects and SQL Server 2000 Desktop Engine (MSDE 2000)

属性

文章编号: 308312 - 最后修改: 2003年11月4日 - 修订: 5.1
这篇文章中的信息适用于:
  • Microsoft Office Access 2003
  • Microsoft Access 2002 标准版
关键字:?
kbhowto KB308312
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com