应对上述问题,大概有两种解决办法,
第一,用户实际登陆的账号没有任何察看和修改数据的权限,登陆以后,用程序来进行另外一个连接,而这个连接是用户不知晓的,并被授予相应的权限,更多的限制可能需要归到窗口控件级。但是,这个解决方案,在sql服务器仅使用trusted_connection的时候,是无能为力的,同时也很难区别不同的用户。
第二,使用sql服务器的应用程序角色。这个有一大堆东西可以讨论,但细节请自行察看sql帮助文档。应用程序角色,同其他普通角色不同,他们并不包含任何用户,相反,用户还是用他们自己的登陆方式登陆服务器,然后,通过执行sp_setapprole来激活这个特殊角色。在应用程序角色激活以后,用户本身的登陆在整个应用程序连接过程中完全失效,从而保证了用户不能从应用程序以外再次登陆服务器。
在Access ADP 中,基本程序(没有连接判断、错误控制句柄等)可能是这样的(首先在sql服务器中创建这个角色,例如testApp,密码mypass):
Private Sub ActivateAppRole()
Dim TSQL As String
TSQL = "EXEC sp_setapprole 'testApp', {Encrypt N 'mypass'}, 'odbc'"
Application.CurrentProject.Connection.Execute TSQL
End Sub
当然,可以用sp_addapprole, sp_dropapprole来编程创建应用程序角色,也同其他角色类型一样可以对其授权。