设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 988|回复: 6
打印 上一主题 下一主题

如何用代码自动设定权限来刷新连接表(假定后端数据库已经屏蔽权限)

[复制链接]
跳转到指定楼层
1#
发表于 2002-9-22 21:01:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
'下面函数说明如何用代码自动设定连接表权限,运行此函数用户必须是管理组成员,此函数适用于ACCESS2.0/95/97/2000
'函数原理:先设定后端表权限,然后使用RefreshLink方法重连接后端表
'下面函数设定后端表读权限,后端数据库打开/运行权限,前端表及查询所有权限
'用法:登陆时运行此函数,确保正常登陆才能读后端数据,更好保护后端数据
'译自:Questions About Microsoft® Access Security  Trans. by gnoy

           
Function faq_SetPermissions (strTable As String, strSourceDB As String, strUsrName As String)

' 参数:
'       strTable
'           需要设定权限表名,假定前后端表名一
'       strSourceDB
'           后端数据库全名
'       strUsrName
'           欲刷新连接的用户组或用户名
'
    Dim db As Database
    Dim con As Container
    Dim doc  As Document
    Dim ws As WorkSpace
    Set ws = dbengine.workspaces(0)

    ' set default full permissions in destination
    ' (current) database for new tables
    Set db = CurrentDB()
    Set con = db.Containers("Tables")
    con.username = strUsrName
    con.permissions = DB_SEC_FULLACCESS

    ' set full permissions for the linked table
    ' in the destination database
    Set doc = con.Documents(strTable)
    doc.username = strUsrName
    doc.permissions = DB_SEC_FULLACCESS

    ' Set open database permissions for the source database
    Set db = ws.OpenDatabase(strSourceDB)
    Set con = db.Containers("Databases")
    Set doc = con.Documents("MSysdb")
    doc.username = "Users"
    doc.permissions = doc.permissions Or DB_SEC_DBOPEN

    ' Set read data permissions for the base table
    Set con = db.Containers("Tables")
    Set doc = con.Documents(strTable)
    doc.username = strUsrName
    doc.permissions = doc.permissions Or DB_SEC_RETRIEVEDATA
End Function
附刷新权限描述:
Minimum Permission Description for RefreshLink        Access 2.0 Constants        Access 95/97/2000
1. *The ability to create New Tables/ Queries in the destination database        DB_SEC_CREATE        DbSecCreate
2. *Read Design Permissions on the Table in the destination database        DB_SEC_READDEF        DbSecReadDef
3. *Read Data permissions on the table in the destination database        DB_SEC_RETRIEVEDATA        DbSecRetrieveData
4. Open/Run permissions for the source database        DB_SEC_DBOPEN        DbSecDBOpen
5. Read Data permissions on the table in the source database        DB_SEC_RETRIEVEDATA        DbSecRetrieveData
*Just set full permissions in the destination database        DB_SEC_FULLACCESS        DbSecFullAccess
'以上已经确保你有后端数据库表读权限,前端表及查询所有权限,现在我们就可以使用 RefreshLink方法重新连接后端表了.
'以下函数对后端数据库表有读权限以及对后端数据库有打开/运行的用户才能适用
Function faq_RefreshLink (strTable As String, strSourceDB As String)
'   参数:
'       strTable
'           欲刷新的表名
'       strSourceDB
'           后端数据库全名
'
    Dim ws As WorkSpace
    Dim db As Database
    Dim tdf As TableDef

    Set ws = dbengine.workspaces(0)
    Set db = CurrentDB()
    Set tdf = db.TableDefs(strTable)
    ' specify new location of source table
    tdf.Connect = ";DATABASE=" & strSourceDB
    ' refresh the link
    tdf.RefreshLink
End Function







[此贴子已经被gnoy于2002-9-22 13:01:24编辑过]

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

2#
发表于 2002-9-23 02:49:00 | 只看该作者
Good!!!
3#
发表于 2002-9-23 05:41:00 | 只看该作者
嗯,好狡猾的辦法!
4#
 楼主| 发表于 2002-9-23 06:13:00 | 只看该作者
ADO的产生这已经不那么用得上了。不过ACCESS要真的全用ADO好象又失去了它的优点了。这真是矛盾。现在看来如果窗体中没有子窗体ADO都可以实现啦即前端可以没有任何表这时ACCESS操作数据就好象其他语言操作数据一样了
5#
 楼主| 发表于 2002-9-23 06:40:00 | 只看该作者
以上介绍了用RefreshLink方法刷新连接后端表其唯一要求是对后端表必须要有读的权限还有以下3中方法对后端表权限简要说明如下:
1.通过菜单选项重新连接后端表其唯一要求是对后端表必须是读和设计的权限
2.通过代码用TransferDatabase方法要求是对后端表必须要有读的权限
3.通过DAO设定Connect属性则对后端表可以无任何权限 其函数如下
首先将前面介绍设定权限的函数其中的语句:doc.permissions = doc.permissions Or DB_SEC_RETRIEVEDATA 改为:doc.permissions = DB_SEC_NOACCESS
定义如下函数:
Function faq_ConnectLink (strTable As String, strSourceDB As String)
'     参数:
'       strTable
'           欲连接的表名
'       strSourceDB
'           后端数据库全名
'
On Error Resume Next
   
    Dim db As Database
    Dim tdf As TableDef

   
    Set db = CurrentDB()

    ' Delete the link if it already exists
    db.tabledefs.Delete strTable

    ' Create new link
    Set tdf = db.CreateTableDef(strTable)

    ' Set the properties of the new link
    ' and append to the tabledefs collection
    tdf.SourceTableName = strTable
    tdf.Connect = ";DATABASE=" & strSourceDB
    db.tabledefs.Append tdf
End Function

6#
 楼主| 发表于 2002-9-23 06:49:00 | 只看该作者
这时我们又可以偷看别人数据了,绕来绕去又回来了,对于高手你是没有办法保护数据的
我也不知微软这是在搞什么名堂

以上翻译仅作参考,不对请指正!!!
[此贴子已经被gnoy于2002-9-22 22:49:20编辑过]

7#
 楼主| 发表于 2002-9-23 07:12:00 | 只看该作者
TMTONY,我猜你也看到原文吧因为这里也有“In order to prevent users from reversing the property setting, you must set the fourth (DDL) parameter to True: ”

以上翻译是否正确?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-2 15:51 , Processed in 0.427103 second(s), 30 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表