为多用户访问设置一个MS-Access数据库

我们正在考虑为多个用户“增长”一些MS-Access数据库,并提供一些表格,表单和查询。 (使用不同的后端是另一个,但更长期的select,不幸的是目前不能接受。)
大多数用户将是只读的,但会有一些(当前是一两个)用户必须能够进行更改(而只读用户也使用数据库)。 我们没有太在意安全方面的问题,而是关于以下一些问题:

  • 我们如何确保写入用户可以在其他用户使用数据的同时对表格数据进行更改? 读取的用户是否在桌子上放置了锁? 写入用户是否必须将locking在桌子上? Access是否为我们做这个或者我们必须明确地编码这个?
  • 是否有任何我们应该知道的“MS Access交易”的常见问题?
  • 我们可以在表单,查询等工作时使用吗? 我们如何“编程”而不妨碍用户呢?
  • MS Access中的哪些设置会影响事情的处理方式?
  • 我们的背景大多是在Oracle中,Access在处理多个用户方面有哪些不同? 在Access中有没有“隔离级别”的东西?

任何提示或有用的文章指针将不胜感激。

我觉得这个问题的答案是有问题的,混乱的和不完整的,所以我会努力做得更好。

Q1:我们如何确保写入用户可以在其他用户使用数据的同时更改表格数据? 读取的用户是否在桌子上放置了锁? 写入用户是否必须将locking在桌子上? Access是否为我们做这个或者我们必须明确地编码这个?

没有人真正以完整的方式回答这个问题。 有关在Access选项中设置locking的信息与读取locking和写入locking无关。 没有锁与所有logging与编辑logging是如何设置WRITES的默认logginglocking。

  • 没有锁意味着你正在使用OPTIMISTIClocking,这意味着你允许多个用户编辑logging,然后在事实之后通知他们自从他们开始编辑之后logging已经改变。 乐观locking是你应该开始的,因为它不需要编码来实现它,而对于小用户群体,它几乎不会引起任何问题。

  • 所有logging意味着整个表在任何时候编辑启动时都被locking。

  • 编辑logging意味着更less的logging被locking,而不pipe它是单个logging还是多个logging取决于数据库是否设置为使用logging级locking(首先添加到Jet 4中)或页级locking。 坦率地说,我从来没有想过要设置logging级别的locking是值得的,因为乐观locking处理大部分问题。

有人可能会认为你想使用logging级别的悲观locking,但事实是,在绝大多数应用程序中,两个用户几乎从不编辑同一个logging。 现在,很明显,某些types的应用程序可能是例外情况,但是如果我遇到了这样的应用程序,我可能会尝试通过重新devise架构来devise它,以便两个用户编辑相同的logging(通常是进行某种forms的交易编辑,而不是编辑现有数据,而是通过添加logging进行更改)。

现在,对于您的实际问题,有许多方法可以将某些用户限制为只读,并授予其他用户写权限。 Jet用户级别的安全性是为了这个目的而devise的,只要它对这个术语的任何有意义的定义是“安全的”。 一般来说,只要你使用的是Jet / ACE数据存储,你将得到的最好的安全性就是Jet ULS提供的。 这是可以破解的,是的,但是你的用户会犯一个可怕的进攻,所以这可能就足够了。

我倾向于根本不实现Jet ULS,而只是构build数据编辑表单,以便检查用户的Windowslogin,并根据哪些用户应该获得哪些访问权限将表单设置为只读或可写。 无论是否要在数据表中logging组成员资格,或者为此目的维护Windows安全组,都由您决定。 您也可以使用Jet工作组文件来处理它,并为写入用户提供不同的system.mdw文件。 只读用户将作为pipe理员以透明方式login,而以admin身份login的用户将被授予只读访问权限。 写入用户将以其他用户身份login(透明地,在提供启动应用程序的快捷方式中,不提供密码),然后用于将表单设置为读取或写入。

如果你使用Jet ULS,它可以变得真正毛茸茸的得到它的权利。 它涉及将所有表格locking为只读(或者甚至不是这样),然后使用RWOP查询来提供对数据的访问。 在我14年的专业Access开发中,我还没有完成一个这样的应用程序。

总结我对你问题部分的回答:

我们如何确保写入用户可以在其他用户使用数据的同时对表格数据进行更改?

我会build议在应用程序中执行此操作,根据用户login将表单设置为只读或可编辑。 最简单的方法是将表单设置为只读,并在写入用户打开表单时更改为可编辑状态。

读取的用户是否在桌子上放置了锁?

没有任何意义。 Jet / ACE确实有读锁,但它们仅用于维护各个视图的状态以及为用户刷新数据。 他们不locking任何types的写操作,尽pipe从理论上追踪它们的开销会减慢速度。 担心是不够的。

写入用户是否必须将locking在桌子上?

与Jet / ACE结合使用可以自动执行此操作,特别是如果select乐观locking作为默认值。 这里的关键是Access应用程序是数据绑定的,所以一旦表单被加载,logging就有一个读locking,一旦logging被编辑,它是否被其他用户写locking是由无论您是使用乐观还是悲观locking。 同样,这也是Access以其绑定forms的默认行为为您处理的事情。 直到遇到问题时,您都不用担心。

Access是否为我们做这个或者我们必须明确地编码这个?

基本上,除了在运行时设置可编辑性(根据谁有写入权限),如果您使用乐观locking,则不需要编码。 悲观locking,你不必编码,但你几乎总是需要,因为你不能让用户坚持默认的行为和错误消息。

Q2:我们应该注意到“MS Access事务”有没有什么共同的问题?

Jet / ACE支持提交/回滚事务,但是在这个问题中,我不清楚这是什么意思。 一般来说,除了维护primefaces性外,我不使用事务,例如创build发票时,或者进行涉及多个表的更新。 它的工作方式是你所期望的,但对于Access应用程序中的绝大多数操作来说并不是真正必需的。

也许这里的一个问题(尤其是第一个问题)是因为你可能并不完全了解Access是为创build具有绑定到表单的数据而devise的应用程序而devise的。 “交易”是一个非绑定和无状态应用程序(例如,基于浏览器的)非常重要的话题,但对于数据绑定的应用程序,编辑和保存都是透明的。

对于某些types的操作,这可能是有问题的,偶尔在Access中使用非绑定表单编辑数据是合适的。 但根据我的经验,这种情况很less见。 这并不是说我不使用未绑定的表单 – 我使用了大量的对话框等 – 这只是我的应用程序不能使用未绑定的表单编辑数据表。 几乎没有例外,所有我的应用程序编辑绑定forms的数据。

现在,非绑定的表单在Access中实际上相当容易实现(特别是如果您将编辑控件的名称与基础字段相同),但使用未绑定的数据编辑表单实际上缺less使用Access的要点,即绑定是全部为你完成。 解绑的主要缺点是你失去了所有的logging级表单事件,比如OnInsert,BeforeUpdate等等。

Q3。 我们可以在表单,查询等工作时使用吗? 我们如何“编程”而不妨碍用户呢?

这是已经得到很好解决的问题之一。 所有多用户或复制的访问应用程序应该被拆分,并且大多数单用户应用程序也应该是。 这是很好的devise,也使应用程序更稳定,因为只有数据表最终被一个以上的用户打开。

Q4。 MS Access中的哪些设置会影响事情的处理方式?

“事情呢?” 什么东西?

Q5。 我们的背景大部分是在Oracle中,Access在处理多个用户方面有什么不同? 在Access中有没有“隔离级别”的东西?

我对甲骨文没有什么特别的了解(即使他们愿意,我的客户也没有能力负担得起),但是要求比较甲骨文和甲骨文,这显然是一个根本性的误解。

Access是一个应用程序开发工具。

Oracle是一个工业级的数据库服务器。

苹果和桔子。

当然,现在,Access提供了一个默认的数据库引擎,最初名为Jet,现在已经修改并重命名为ACE,但是Access的开发平台可以与Jet / ACE(默认数据库引擎)完全分离。

在这种情况下,您已经select使用Jet / ACE后端,对于小型用户群,也就是25岁以下的用户来说,Jet / ACE也可以达到50或100,特别是当只有一个很less有同时在线的用户有写权限。 虽然Jet / ACE中的255个用户限制包括只读和写入用户,但是写入用户的数量确实控制了你可以支持的同时用户数量,在你的情况下,你有一个主要读取 – 只有用户,因此,devise一个好的应用程序,在后台没有问题,应该是非常困难的。

基本上,我认为你的Oracle背景可能会导致你误解如何在Access中开发,预期的方法是将你的表单绑定到更新的logging源上,而不需要编写代码。 现在,为了提高效率,将表单绑定到logging的子集而不是整个表是一个好主意,但即使在数据编辑表单后面的logging源中使用整个表,Access也将在编辑Jet /只要你的数据表被有效地索引,ACE表格(关于把整个表格拉过来的旧的神话仍然存在)。

logginglocking是你大多不应该有任何担心的原因,其原因之一是由于绑定编辑,其中forms总是知道在后端发生了什么事情(好,每隔一段时间第二个分开,默认刷新间隔)。 也就是说,它不像一个网页,您可以检索数据的副本,然后在与原始数据检索操作完全无关的事务中将您的编辑发回服务器。 在像Access这样的绑定环境中,后端数据文件上的locking文件总是跟踪某人有logging打开进行编辑的事实。 这可以防止用户的编辑跺脚别人的编辑,因为Access知道状态并通知用户。 这一切都是在开发人员没有任何编码的情况下发生的,并且是绑定编辑模型的一大优点(除了不必编写代码来发布编辑)。

对于那些熟悉其他平台的经验丰富的数据库程序员来说,第一次接触到Access,我强烈build议像最终用户一样使用Access。 尝试所有的点击function。 运行表单并报告向导,并检查它们生成的结果。 我不能保证所有这些都certificate了良好的做法,但是他们肯定会展示Access准备使用的默认假设。

如果你发现自己写了很多代码,那么你可能会错过Access的观点。

第一件事(如果还没有完成的话)就是把你的数据库分成前端(所有的表格/报告等)和后端(包括所有的数据)。 第二件事是在前端设置版本控制。

我在很多数据库中完成的方式是让用户运行一个小的“跳线”数据库来打开主数据库。 这个跳线做以下的事情

•检查用户是否在C盘上有数据库

•如果他们没有安装并运行

•如果他们这样做,然后检查他们有什么版本

•如果版本号不匹配,请复制最新版本

打开数据库

这整个检查过程通常需要半秒钟。 使用这个模型,你可以在一个单独的数据库上完成所有的开发工作,然后当你准备好“发布”的时候,你只需要把新的mde放到networking共享上,下次用户打开跳线时,最新的版本就会被拷贝下来。

在多用户数据库中还有其他的事情要考虑,可能需要检查一些常见的错误,比如将表单绑定到整个表格等

我认为Access是您的案例的最佳select。 但是你必须拆分数据库,请参阅: http : //accessblog.net/2005/07/how-to-split-database-into-be-and-fe.html

•如何确保写入用户可以在其他用户使用数据时更改表格数据? 读取的用户是否在桌子上放置了锁? 写入用户是否必须将locking在桌子上? Access是否为我们做这个或者我们必须明确地编码这个?

没有读锁,除非你明确地把它们。 只要使用“无锁”

•我们应该注意到“MS Access事务”有什么共同的问题?

用1-2个写用户不应该有问题

•我们可以在表单使用时查询吗? 我们如何“编程”而不妨碍用户呢?

如果你拆分数据库 – 然后在FEdevise上工作没有问题。

•MS Access中的哪些设置对如何处理有影响?

你什么意思?

•我们的背景主要是在Oracle中,Access在处理多个用户方面有哪些不同? 在Access中有没有“隔离级别”的东西?

访问中没有隔离级别。 顺便说一句,如果你有很多的用户和大的数据库,你可以稍后将数据移动到oracle并保持访问前端。

在数据写入过程中,表或logginglocking在Access中可用。 您可以通过工具|控制默认logginglocking 选项| 高级选项卡:

  1. 没有锁
  2. 所有logging
  3. 编辑logging

您可以设置此窗体的logginglocking或在您的DAO / ADO代码以满足特定的需要。

如果正确使用它们,事务不应该成为问题。

最佳做法:将您的表格与其他所有代码分开。 给每个用户自己的代码文件副本,然后在networking服务器上共享数据文件。 处理代码的“testing”副本(以及指向testing数据文件的链接),然后分别更新用户的单独代码文件。 如果您需要更改数据文件(添加表格,列等),您将不得不让所有用户从应用程序中进行更改。

查看Oracle比较的其他答案。

Access是一个伟大的多用户数据库。 它有很多内置的function来处理多用户的情况。 事实上,它非常受欢迎,因为它是一个非常棒的多用户数据库。 对于有多less用户可以同时使用数据库同时进行更新和编辑(取决于开发人员对访问的了解程度以及数据库的devise方式),上限是从20位用户到大约50位用户。 可以构build一些访问数据库来处理多达50个并发用户,而许多访问数据库可以处理20或25个并发用户更新数据库。 对于已经使用了几年或更长时间的数据库,访问新闻组已经多次讨论过这些数据。

我发现在Vista中引入了SMB2协议来locking访问数据库。 它可以被以下registry项禁用:

Windowsregistry编辑器版本5.00

[HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ LanmanServer \ Parameters]“Smb2”= dword:00000000

构build数据存储在RDBMS中的客户端/服务器Microsoft Access应用程序的正确方法是使用链接表方法。 这确保了Microsoft Access客户端应用程序和RDBMS数据之间的数据隔离和并发性,而无需额外的不必要的编程逻辑和代码,这使得维护变得更加困难,并且增加了开发时间。

请参阅: http : //claysql.blogspot.com/2014/08/normal-0-false-false-false-en-us-x-none.html