Tho*_*ten 25 ms-access database-design multi-user
我们正在考虑"增加"一个MS-Access数据库,其中包含一些用于多个用户的表,表单和查询.(使用不同的后端是另一个,但更长期的选择,遗憾的是目前是不可接受的.)
大多数用户将是只读的,但会有一些(当前一两个)用户必须能够进行更改(而只读用户也使用数据库).我们并不关心安全方面,而是关注以下一些问题:
任何有用文章的提示或指示将不胜感激.
Dav*_*ton 51
我发现这个问题的答案有问题,令人困惑和不完整,所以我会努力做得更好.
没有人真正以完整的方式回答这个问题.有关在Access选项中设置锁定的信息与读取与写入锁定无关.无锁定与所有记录与编辑记录是如何设置WRITES的默认记录锁定.
没有锁意味着您正在使用OPTIMISTIC锁定,这意味着您允许多个用户编辑记录,然后在事件发生之后通知他们,因为他们启动了自己的编辑后记录已经更改.乐观锁定是你应该开始的,因为它不需要编码来实现它,对于小用户群,它几乎不会引起问题.
所有记录意味着每次启动编辑时都会锁定整个表.
编辑记录表示锁定的记录较少,但是它是单个记录还是多个记录取决于您的数据库是否设置为使用记录级锁定(首先在Jet 4中添加)或页级锁定.坦率地说,我从来没有想过设置记录级锁定是值得的,因为乐观锁定可以解决大多数问题.
有人可能会认为你想要使用记录级别的悲观锁定,但事实是在绝大多数应用程序中,两个用户几乎从不编辑相同的记录.现在,显然,某些类型的应用程序可能是例外,但如果我遇到这样的应用程序,我可能会尝试通过重新设计架构来设计它,以便两个用户编辑它们是非常罕见的记录(通常通过某种形式的事务编辑,通过添加记录而不是编辑现有数据进行更改).
现在,对于您的实际问题,有许多方法可以将某些用户限制为只读并授予其他用户写权限.Jet用户级安全性旨在用于此目的,并且对于任何有意义的术语定义的"安全性"都可以正常工作.通常,只要您使用Jet/ACE数据存储,您将获得的最佳安全性是由Jet ULS提供的.它是可以破解的,是的,但是你的用户会通过打破它来实现可行的攻击,所以它可能就足够了.
我倾向于根本不实现Jet ULS而只是构建数据编辑表单,以便他们检查用户的Windows登录并使表单成为只读或可写,具体取决于哪些用户应该获得哪些访问权限.是否要在数据表中记录组成员身份,或者为此目的维护Windows安全组取决于您.您还可以使用Jet工作组文件来处理它,并为写入用户提供不同的system.mdw文件.只读用户将以管理员身份透明地登录,以管理员身份登录的用户将只被授予只读访问权限.写入用户将以其他用户名登录(透明地,在您为启动应用程序提供的快捷方式中,不提供密码),这将用于将表单设置为读取或写入.
如果你使用Jet ULS,它就会变得非常毛茸茸.它涉及将所有表锁定为只读(或者甚至不是那样),然后使用RWOP查询来提供对数据的访问.在我14年的专业Access开发中,我还没有完成一个这样的应用程序.
总结我对你问题各部分的回答:
我建议在应用程序中执行此操作,将表单设置为在运行时读取/仅可编辑,具体取决于用户登录.最简单的方法是将表单设置为只读,并在写入用户打开表单时更改为可编辑.
没有任何意义.Jet/ACE确实有读锁定,但它们仅用于维护单个视图的状态以及为用户刷新数据.它们不会锁定任何类型的写操作,尽管理论上跟踪它们的开销会减慢速度.担心这还不够.
与Jet/ACE结合使用会自动为您执行此操作,特别是如果您选择乐观锁定作为默认值.这里的关键点是Access应用程序是数据绑定的,因此只要加载表单,记录就会有一个读锁定,一旦编辑了记录,它是否被其他用户写入锁定是由无论您是使用乐观还是悲观锁定.同样,这是Access在绑定表单中使用其默认行为为您处理的事情.在遇到问题之前,您不必担心任何问题.
基本上,除了在运行时设置可编辑性(根据谁具有写访问权限),如果您使用乐观锁定,则无需编码.随着悲观锁,你不要有代码,但你几乎总是需要,因为你不能一走了之用户坚持的默认行为和错误消息.
Jet/ACE支持提交/回滚事务,但我不清楚这是你在这个问题中的意思.通常,除了维护原子性之外,我不使用事务,例如,在创建发票或进行涉及多个表的任何更新时.它的工作方式与您期望的方式相同,但对于Access应用程序中的绝大多数操作而言并非如此.
也许这里的一个问题(特别是根据第一个问题)是你可能不太了解Access是为创建具有绑定到表单的数据的应用程序而设计的."事务"对于未绑定和无状态应用程序(例如,基于浏览器)非常重要,但对于数据绑定应用程序,编辑和保存都是透明的.
对于某些类型的操作,这可能会有问题,偶尔使用未绑定的表单编辑Access中的数据也是合适的.但根据我的经验,这种情况很少发生.并不是我不使用未绑定的表单 - 我使用大量的对话框等 - 只是我的应用程序不编辑带有未绑定表单的数据表.几乎没有例外,我的所有应用程序都使用绑定表单编辑数据.
现在,未绑定的表单实际上很容易在Access中实现(特别是如果您将编辑控件命名为与底层字段相同),但使用未绑定的数据编辑表单实际上是缺少使用Access的点,即绑定是一切都为你而做.未绑定的主要缺点是丢失了所有记录级表单事件,例如OnInsert,BeforeUpdate等.
这是一个很好解决的问题之一.应该拆分所有多用户或复制的Access应用程序,并且大多数单用户应用程序也应该是分开的.这是一个很好的设计,也使应用程序更稳定,因为只有数据表最终由多个用户一次打开.
"事情呢?" 什么东西?
我对Oracle没有任何具体的了解(即使他们想要,我的客户也无法负担得起),但要求对Access和Oracle进行比较,就会在某个方面出现根本性的误解.
Access是一种应用程序开发工具.
Oracle是一个工业级数据库服务器.
苹果和橘子.
现在,当然,Access附带了一个默认的数据库引擎,最初称为Jet,现在已经修改并重命名为ACE,但是Access和开发平台有很多级别可以完全与默认数据库引擎Jet/ACE分离.
在这种情况下,您选择使用Jet/ACE后端,这对于小用户群可能会很好,即25以下.喷射/ ACE也可以精细到50或100,特别是当只有很少有并发用户拥有写入权限.虽然Jet/ACE中的255个用户限制包括只读用户和写入用户,但是真正控制您可以支持多少个并发用户的写入用户数量,在您的情况下,您有一个主要是读取的应用程序 - 只有用户,所以设计一个没有后端问题的好应用程序应该非常困难.
基本上,我认为您的Oracle背景可能会导致您误解如何在Access中进行开发,其中预期的方法是将表单绑定到更新的记录源,而无需编写代码.现在,为了效率,将表单绑定到记录子集而不是整个表是个好主意,但即使在数据编辑表单后面的记录源中有一个完整的表,Access在编辑Jet /时也会非常有效.只要您的数据表被有效编入索引,ACE表(关于将整个表拉过电线的古老神话仍然存在).
记录锁定是你最不应该担心的原因之一,其中一个原因是由于绑定编辑,表单始终知道后端发生了什么(嗯,每隔一段时间一次)第二个,默认刷新间隔).也就是说,它不像是一个网页,您可以在其中检索数据副本,然后在完全与原始数据检索操作无关的事务中将编辑内容发布回服务器.在像Access这样的绑定环境中,后端数据文件上的锁定文件总是会跟踪某人打开记录进行编辑的事实.这可以防止用户编辑踩踏别人的编辑,因为Access知道状态并通知用户.这一切都是在开发人员没有任何编码的情况下发生的,并且是绑定编辑模型的一大优势(除了不必编写代码来发布编辑).
对于那些熟悉第一次访问Access的其他平台的经验丰富的数据库程序员,我强烈建议像最终用户一样使用Access.尝试所有点击功能.运行表单并报告向导并查看它们生成的结果.我不能保证所有这些都证明了良好的做法,但它们肯定证明了Access的使用方式背后的默认假设.
如果您发现自己编写了大量代码,那么您可能会忽略Access的重点.