原始 KB 编号: 283228
注意
高级:需要专家编码、互操作性和多用户技能。 本文仅适用于 Microsoft Access 数据库 (.mdb 和 .accdb) 。
症状
尝试自定义工具栏或在“设计”视图中打开 Microsoft Access 窗体、报表、宏或模块时,会收到以下消息:
你目前没有对数据库的独占访问权限。 如果继续进行更改,则以后可能无法保存这些更改。
尝试保存对 Access 窗体、报表、宏或模块所做的设计更改时,会收到以下消息:
你目前没有对数据库的独占访问权限。 不会保存设计更改。
尝试保存新的数据访问页时,会收到以下消息:
无法创建指向此数据访问页的链接,因为无法以独占方式锁定数据库。
原因
- 您尝试在“设计”视图中打开窗体、报表、宏、模块或命令栏。
- 尝试将设计更改保存到其中一种对象类型或新页面链接,而其他用户打开相同的数据库。
若要保存对这些对象类型的设计更改,Access 必须能够获取数据库的排他锁。
解决方案
在多个开发人员同时设计 Access 应用程序的情况下,必须使用 Microsoft Access 的 Microsoft Visual SourceSafe 外接程序实现源代码控制。 或者,必须将数据库的本地工作副本分发给每个开发人员。 下面将讨论其中每个选项。
实现源代码管理
Microsoft Access Visual SourceSafe 加载项允许你在开发时将 Access 应用程序置于源代码控制之下。 如果将应用程序置于源代码控制之下,则可以跟踪和存储随时间推移对应用程序所做的更改。 通过使用 Microsoft Visual SourceSafe,可以查看对象的历史记录,然后还原到对象的早期版本。 可以在 Microsoft Access 应用程序中签出对象、修改对象或在其本地副本中创建新对象,然后在源代码控制下将其签回到主数据库中。 Microsoft Office XP Developer 提供 Microsoft Access Visual SourceSafe 加载项。 若要使用 Microsoft Access Visual SourceSafe 加载项,还必须单独安装 Microsoft Visual SourceSafe,该加载项也可用于 Microsoft Office XP Developer。
使用单个工作数据库
可以实现的另一个选项是将数据库应用程序的主副本保留在集中位置,然后在每个开发人员的计算机上使用该数据库的各个工作副本。 每个开发人员将在数据库的本地工作副本中开发应用程序的单个部分。 当开发人员想要对数据库应用程序中的对象进行更改时,他们会将对象从 master 数据库导入到本地工作数据库中。 然后,开发人员将对本地工作数据库中的对象进行所需的更改,并保存对象。 当开发人员准备好将更改提交到 master 数据库时,他们会将对象导出到 master 数据库,覆盖原始对象。
使用此方法的一个缺点是无法确定多个开发人员是否在本地同时处理同一对象。 当开发人员将对象导出到 master 数据库时,开发人员可以在不知不觉中覆盖另一个开发人员提交到 master 数据库的更改。
更多信息
若要保存对特定于 Access 的对象(例如窗体、报表、新页面链接、宏、模块和命令栏)的设计更改,Access 2002 必须能够在 保存 操作期间以独占方式锁定数据库。 表、查询和关系不受此限制,因为它们是特定于 Microsoft Jet 的对象。 Microsoft 将此要求用于 Access 2002 的原因有多种:
- 它提供与其他 Visual Basic 环境客户端应用程序的一致性。
- 它会停止对 Jet 数据库引擎的依赖。
- 它提高了特定于 Access 的对象的稳定性。
提供与其他 Visual Basic 环境客户端应用程序的一致性
由于 Access 2002 托管 Visual Basic 环境,因此 Microsoft Access 使用的保存模型必须与托管 Visual Basic 环境的其他应用程序保持一致。 Visual Basic 环境仅允许对不在源代码控制下的 Visual Basic 项目进行独占编辑和保存。 Visual Basic 6.0 以及托管 Visual Basic 环境的所有 Office 应用程序也是如此。
停止对 Jet 数据库引擎的依赖
Access 提供创建 Microsoft Access 项目的功能 (.adp) 文件以及 Microsoft Access 数据库 (.mdb) 。 通过使用 Access 项目,开发人员可以将 Microsoft SQL Server 用作 Microsoft Jet 的另一个数据库引擎。 过去,) 窗体、报表、宏、模块和命令栏 (所有 Access 特定对象都依赖于 Jet 数据库引擎进行存储。 这些对象存储在 Microsoft Jet 数据库中的特定于 Access 的系统表中。 由于 Access 可以使用 Microsoft SQL Server 作为 Microsoft Jet 的替代方案,因此 Microsoft 必须为不依赖于 Jet 数据库引擎的特定于 Access 的对象开发存储机制。
提高了特定于 Access 的对象的稳定性
项目存储模型提高了特定于 Access 的对象和 Visual Basic 项目的稳定性。 Visual Basic for Applications 从不允许在没有源代码控制的情况下对 Visual Basic 项目进行多用户编辑。 Microsoft Access 95 和 Microsoft Access 97 可以通过隐藏在多用户环境中对 Visual Basic for Applications 所做的项目更改,然后在稍后将其合并到项目中来规避此限制。 但是,这可能会影响 Visual Basic 项目的稳定性。 因此,Microsoft Access 在设计特定于 Access 的对象时需要排他锁,以确保项目只有一个编辑器。
在多用户环境中编辑 Access 对象
由于用户可以打开数据库进行独占或共享使用,Access 所表现出的保存行为取决于用户打开数据库的方式以及当前是否有多个用户正在访问该数据库。
如果开发人员打开数据库以供独占使用,则开发人员可以保存任何特定于 Access 的对象的设计,前提是开发人员可以打开数据库进行读/写访问,并且具有修改对象设计的正确权限。
如果用户打开数据库供共享使用,则用户可以保存任何特定于 Access 的对象的设计,前提是用户可以打开数据库进行读/写访问,具有修改对象设计的正确权限,并且 Access 可以获取数据库的独占锁。
锁升级
为了确保数据库的使用是独占的,Access 使用 Jet 数据库引擎的连接控制功能将用户的共享锁提升为独占。 当用户在“设计”视图中打开窗体、报表、宏或命令栏时,Access 会尝试将共享锁提升为排他锁。 Access 此时会尝试提升锁,以防止用户进行了多次设计更改,但后来才发现用户无法保存它们,因为 Access 无法获取排他锁。 通过在用户打开设计视图中的对象后立即尝试锁定提升,Access 可以在用户进行任何设计更改之前向用户发出警告(如果它无法获取排他锁)。 在设计视图中打开模块时,Access 不会尝试锁定提升;但是,一旦用户编辑数据库中的任何模块,它将立即尝试锁定提升。
Access 会保留排他锁,直到用户保存或丢弃所有脏对象,并且没有其他对象在设计视图中打开。 在此之后,如果数据库最初打开供共享使用,Access 会将锁定降级为共享。
如果用户在设计视图中打开对象时 Access 无法将锁提升为独占,Access 会向用户发出以下消息:
你目前没有对数据库的独占访问权限。 如果继续进行更改,则以后可能无法保存这些更改。
在此警告消息之后,Access 将在“设计”视图中打开对象,并允许用户进行设计更改。 如果用户尝试保存对象,Access 会尝试将共享锁提升为独占。 如果锁提升成功,Access 将保存对象并维护排他锁,直到用户保存或丢弃所有其他脏对象,并且设计视图中没有对象保持打开状态。 如果锁定提升失败,用户将收到以下消息:
你目前没有对数据库的独占访问权限。 不会保存设计更改。
如果用户尝试关闭脏对象并保存更改,则 Access 会提示用户使用关闭对象并放弃对对象所做的设计更改的选项,或者选择将其保持打开和未保存状态。
重现行为的步骤
在同一台计算机上启动两个 Microsoft Access 实例。
在这两个实例中打开示例数据库Northwind.mdb。
在 Microsoft Access 的第一个实例中,在“设计”视图中打开“客户”窗体。
收到消息:
你目前没有对数据库的独占访问权限。 如果继续进行更改,则以后可能无法保存这些更改。
单击“ 确定” 清除消息。
窗体将在 “设计 ”视图中打开。
向窗体添加文本框控件。
在“文件”菜单上,单击“保存”。
收到以下消息:
你目前没有对数据库的独占访问权限。 不会保存设计更改。
单击“ 确定” 清除消息。
关闭计算机上的 Access 的第二个实例。
在 Access 的第一个实例中,尝试再次保存表单。
表单已成功保存。