如何更新远程MS Access数据库?
我需要创建一个网页应用程序,用来展示和编辑一组数据。
这些数据存储在一个Access数据库文件里,这个文件被另一个桌面应用程序使用。
我正在考虑最好的方法来完成这个工作。
不幸的是,我想把数据迁移到其他数据库解决方案(比如MySQL或Postgres)这个想法被客户拒绝了。
现在的问题是,如何保持服务器和执行这个应用程序的桌面之间的数据完整性和同步。
我需要做的就是读取数据,存储编辑过的或新添加的数据,给授权用户一个界面来审核这些新插入的数据——也就是验证这些数据——然后把这些数据导入到原来的Access数据库中。
我找到了一些可能的解决方案(用来更新桌面的mdb副本),但每个方案都有优缺点:
- 远程访问Windows机器
- 这会让机器暴露在未授权的访问风险中
- 使用rsync保持文件同步(每天一次)
- 如果客户端的mdb被桌面应用程序编辑过,就会导致数据丢失
- 只有在所有数据都被验证后才能更新
- 在rsync运行之前,数据不会真正同步
- 客户端-服务器应用程序
- 可以使用安全层来保护数据免受攻击
- 需要在桌面上有一个第三方应用程序
- 同步需要授权用户使用这个第三方应用程序来导入数据(这个程序会查询远程数据库并更新本地mdb)
你知道还有其他方法可以帮助我完成这个任务吗?我倾向于使用客户端-服务器模型,虽然这会更贵,但这是我看到的唯一可行的方法。
你觉得这个方案还有其他优缺点吗?
我还没有选择开发这个的编程语言,但我在考虑使用PHP和/或Python。服务器的远程环境可以是Windows或*类Unix(更倾向于这个)。
谢谢。
3 个回答
我觉得这个事情的运作方式主要取决于身份验证的问题和需要查看数据的用户数量。
我为什么这么问呢?
你可以考虑使用Access 2010和Office 365。这让你可以把表格链接到云端,但实际上这些表格也会在你的Access桌面上缓存。这意味着数据会实时同步,而对于Access 2010来说,这个过程是自动的,所以你不需要写任何代码。
这意味着在使用Access桌面应用时,你可以断开网络连接,它仍然会继续运行。一旦你重新连接到WiFi或网络,之前在本地做的更改就会同步到Office 365上。更棒的是,你现在可以在Access中创建网页表单。
在Access中修改或编辑的数据(或者两边的新记录)会传输到你的本地电脑上。所以你在Access客户端添加记录,网页用户也会看到这些新记录。
所以Access 2010现在支持网页发布,并且可以和新的Office 365一起使用。价格从每月6美元起。如果用户不多,可以让他们都用同一个账户登录!这意味着你可以在比发这条信息更短的时间内把它全部搞定,而且每月花费不到10美元!
对于那些不知道的人,Access 2010支持网页发布。当你发布Access表单时,它们会被转换成.net表单(zammel/XAML)形式,代码也会转换成JavaScript。所以表单的代码实际上是在浏览器端运行的。
因为这个系统运行在Office 365上,所以理论上你可以使用一些强大的服务器,支持数百万用户。当你把Access应用发布到Office 365时,服务器端就不再使用mdb或Access文件,而是使用所谓的Access Web Services。实际上,这些表格变成了SharePoint列表的等价物。而在SharePoint 2010中,这些列表现在有了像级联删除这样的关系功能。
这个系统的真正美妙之处在于,你可以在Access中编写、创建和做所有事情,而不需要学习或接触任何服务器端的技术。这是我一个简短的视频,在视频中段我只用一个网页浏览器就运行了Access应用。
http://www.youtube.com/watch?v=AU4mH0jPntI
不需要ActiveX或Silverlight。事实上,我的Access应用在iPad上使用Safari浏览器运行得很好。
所以你可以考虑继续使用Access,只需利用Access 2010的新功能将你的应用发布到网上。
你可以使用两个数据库,并通过某种网络服务来同步它们之间的变化。可以把一个数据库放在网络服务器上(比如用现代的MySQL或其他数据库),另一个则是你现在用的Access数据库。
你应该建立一个类似于REST API的东西,通过GET方法返回新记录或已更改的记录,通过DELETE方法删除记录,等等。可以在HTTP请求中使用时间戳来处理这些操作。然后,你可以在每一边设置定时任务,去查询另一边的新记录(用JSON格式传输),这样就能保持记录大致同步。
为了安全起见,可以只在特定的端口上暴露应用数据库,并且只允许来自网络应用服务器IP地址的HTTP请求。同时,可以使用HTTP认证、哈希等方式来增强安全性。如果这个应用不是负载很重、并发很高的(我猜不是,因为你用的是Access数据库),这样做应该是可行的。
你可以用任何Python的网络框架来构建这种迷你API,比如Turbogears 2.1、Django,或者一些小框架,比如Bottle或Flask。
顺便说一下,如果你喜欢Python(那为什么不呢),就不要直接使用pyodbc,而是用Python的优雅ORM——SQLAlchemy会更好。
第一个想法:
exposes the machine to unauthorized access
这个说法其实并不太成立。你在网上发布的任何东西都是公开的。而且,这些内容是可以通过SSL/TLS进一步保护的。比如,远程桌面协议(RDP)也可以通过SSH隧道来加密保护。
在我看来,最简单、最优雅的方法是使用网络服务(SOAP)。你可以用Python或Java编写服务器代码,来对Access数据库进行插入或更新操作。然后从这个工作代码生成一个WSDL文件。通过这个WSDL文件,你可以为PHP或Python生成一个客户端。接下来,你只需要编写一个网页界面,使用这个PHP/Python客户端就可以了。
为了安全起见,使用SSL和基本认证就足够了(比如在Python中,SOAPpy就支持这个)。你可以用pyodbc
来连接Access数据库。