Access 局域网多用户使用及Sql server ODBC链接表的相关经验大全(Access高级技巧)

Access +链接表+Sql server 是Access数据库局域网多用户使用的最佳方式(早期的Access adp 在Access 2010之后不再支持),这种方式优点主要是:

1、Access 界面开发的短 平 快的优点
Excel与Access对比 区别 差异 优缺点及应用场景 - 知乎 (zhihu.com)

2、又使用sql server扩展了Access数据的容量不足 及又可使用sql server存储过程 触发器等优势

3、一套系统可同时兼容Access与sql server后台数据库

4、将Access之前 前后台拆分只能坚持10个用户并发 扩展到可实现多达上百个或更多用户并发使用

5、且借助sql server, 避免Access单数据库文件 直接拷走的安全问题。

6、可以使用odbc源 或非odbc源的方式进行链接

最近又折腾一下客户的Access ERP系统,准备升迁到Access 2016或Access 2019 Access 2021.

遇到不少坑,先总结一下,后面再慢慢补充

1、之前客户是使用ODBC 链接表,且使用的是sql server windows 用户信任 方式连接数据库的,这种方式比较简单,用程序创建ODBC再设置windows 用户权限即可。但缺点容易让用户可直接打开链接表内容,造成安全风险,现改成 不需要 odbc源这种方式,直接在代码中设置链接表的.connect属性 为:DRIVER=SQL Server;SERVER=sqlserver服务器名;DATABASE=erpdata;UID=tmtony;PWD=office交流网, 再在登录前 刷新下连接池(可不刷新表)快速打开所有链接表

2、发现有些链接表,一打开表,未输入用户名和密码就可直接打开,原因是因为添加链接表时保存了密码导致的,可删除这些链接表,再重新添加,不要保存链接表密码(后面用代码输入用户名和密码登录,用DAO打开一下数据库再关闭,连接就在ODBC连接池中了,链接表就能正常打开使用了。,保证链接表不被直接打开,保证数据安全)

保存过密码的连接字符串,在隐藏系统表MSysObjects 可看到这些密码,有安全隐患、

链接表是否保存密码估计是由 某个链接表属性决定的,要用程序代码修改这个属性 tdfs(i).Attributes = DB_ATTACHEDODBC + DB_ATTACHSAVEPWD ( office-cn.net )

MSysObjects 中的Flags 字段 值 537919488 ,而其它不保存密码 的链接表 flags 值为 1048576


3、有部分链接表,即使通过上述方式或odbc方式 创建链接表时 并未保存密码,还是可直接打开链接表 (未输入用户名和密码)

经过折腾才发现, 如果你把sqlserver服务关停,打开表时,会弹出这个窗口出来。才恍然大悟:

原来sqlserver是允许windows信任用户方式及Sqlserver用户名和密码 2种授权方式均可登录,而我的电脑本身是administrator 管理员登录,而administrator又刚好没有密码,所以默认打开所有表均可以自动使用windows信任用户administrator方式 打开表,而刚好密码又为空,所以就自动打开表了,即odbc链接表默认是以windows信任用户(当前用户名及密码)来打开链接表的,如果密码为空,且当前windows用户又恰好是管理员的话,就会发生这种情况(只要strConn中的 Database名称正常就可以了),这种假象很容易导致我以为 用户名和密码保存在表中什么位置或系统的全局设置中 , 其实并不是,只要把strConn 中的 database一改 就发现登录不了,或为administrator windows用户修改密码(或设置非空密码也行, 但管理员本地电脑还是可信任 登录,其它电脑则无密码登录不了) 或其它电脑打开mdb看看(但如果administrator密码为空还是会存在这个问题,但一般服务器管理员密码不会为空)

或者在sql server中直接把windows administrator信任权限删除(但可能导致不记得sa密码可能导致 sqlserver管理器无法打开了)

4、刷新链接表时要避开 非odbc链接表 及本地表及系统表

If tdfs(i).Attributes = DB_ATTACHEDODBC Or tdfs(i).Attributes = DB_ATTACHEDODBC + DB_ATTACHSAVEPWD Then

If Not (tdfs(i).Connect Like "*DSN=" & dbname & ";*") Then

' If Not mLike(tdfs(i).Connect, "*DATABASE=" & Dbname & ";*") Then

tdfs(i).Connect = strCnn

tdfs(i).RefreshLink

If err <> 0 Then

Tblname = tdfs(i).Name

gf_Msgbox "tmtony : Can't Link Table:" & Tblname

'Exit Function

End If

End If

End If

5、tdfs(i).Attributes 有可能在tdf添加到集合之后无法再修改(待测试一下)。最好在添加到链接表前修改。

6、如果链接表中有些是保存了密码,有些没有保存密码,则如果先打开未保存密码的表,则需要输入用户名和密码,如果先打开已保存密码的表,则再打开未保存密码的表也不需要输入用户名和密码了,即连接已经缓存在ODBC连接池中了。

7、只需要使用用户名和密码打开一个空表也行,连接一次(很快,并不是真正刷新所有表连接字符串),然后就可快速打开所有链接表了。(但前提是所有链接表之前的连接字符串 .connect 属性必须是正确的,服务器名及数据库名必须是正常的)


如果觉得不错,请帮忙 点赞 收藏 及关注我 @小辣椒高效Office

如果需要Access定制开发或咨询服务,可以

文章被以下专栏收录