【问题标题】:linked table read only链接表只读
【发布时间】:2013-10-14 11:33:33
【问题描述】:

我有一个 2003 (mdb) 住房项目数据库,我每季度都会为我们当地的规划办公室更新一次。我们办公室的其他人可以从看到相同的数据中受益。我认为最简单的方法是给他们一个单独的访问数据库(无论是 2003 版还是 2007 版),从它链接到我更新的源表。但是,为了防止他们在查看时无意中更改了源数据,我想将链接表设为只读。

关于如何限制 Access 2007 链接表的访问权限的任何提示?

【问题讨论】:

    标签: ms-access permissions ms-access-2007 linked-tables


    【解决方案1】:

    这个答案迟到了,但这是 MS-Access 开发人员偶尔需要做的事情......

    ...这很神秘,因为我们将使用带有内部定义的连接字符串的只读查询,而“查询属性”窗口并没有完全按照您的预期进行。

    实际上,我认为该窗口也不会执行实现“源连接字符串”属性的 Microsoft 开发人员期望它执行的任何操作。

    但是,不管是否晦涩难懂,以下是如何执行类似于来自另一个 MS-Access 数据库的只读链接表的操作:

    1. 首先,在本地表上创建一个新查询。没关系 表或什么字段,无论如何您都在丢弃 SQL。
    2. 在查询窗口的标题栏中单击鼠标右键并选择“SQL 查看'
    3. 粘贴此 SQL,覆盖其中的所有内容:

    选择 * FROM tbl客户 IN "" [MS Access;PWD=WTF_En_Clair;DATABASE=\\MyServer\MyShare$\Subfolder\MyDB.accdb]; 显然,您使用的是自己的数据库地址和表名;你可能不需要密码子句。

    不要错过连接字符串前面的那些双引号:当您粘贴连接字符串时,内置属性对话框不会将它们放入其中,您确实需要它们。

    你还没有完成:它仍然是可读写的:

    1. 在查询窗口标题栏右击,选择'Design 查看'
    2. 右键单击上方窗格的背景区域 - MDI 出现表格的窗口 - 并选择“属性...”
    3. 您可能会看到一个“属性表”弹出窗口,其中包含两个字段:“别名” 和 Source' - 这是表格的属性表,您想要 查询的属性表...
    4. ...所以再次左键单击上方窗格的 MDI 背景 获取查询的完整属性表。
    5. 将“记录集类型”属性设置为“快照”
    6. 在查询窗口标题栏中单击鼠标右键并点击“保存”。
    7. 您已完成查询窗口。 这里不要做任何其他事情,只需关闭窗口。 .

    您可以将查询重命名为表名,也可以不重命名:它仍然可以在任何查询中工作,就好像它是一个表一样,如果您给它起一个清楚地表明这一点的名称,您可能会避免一些混乱实际上不是一张桌子。这在任何需要 DAO TableDef 对象的代码中都很重要,其中包括为您重新链接外部表的任何代码。

    您会在“源连接字符串”下的查询属性窗口中看到您的连接字符串(纯文本密码和所有密码)。说真的,不要编辑它:如果幸运的话,它只会用一对单引号替换 SQL 中的两个双引号,查询仍然可以工作。但是如果你粘贴一个新的连接字符串,你可能会丢失这些引号,这会破坏查询;并且没有任何错误消息和帮助页面会告诉您在原始 SQL 中需要这些神奇的引号。

    我怀疑在对外部对象的查询中存在其他未记录的“陷阱”:如果您将此 hack 传递给您的同事,我强烈建议您传递警告 '您已完成查询窗户。不要在这里做任何其他事情',因为这种类型的陷阱会浪费你和他们的时间。

    另外:请务必记录您所做的事情:大多数用于重新连接链接表的工具不会使用外部源进行查询,这是一个等待尝试在“DEV”之间跳转的人的错误,测试' 和 'Production' 数据库。

    【讨论】:

    • 你的回答太棒了!非常感谢!
    【解决方案2】:

    您可以将 db 文件存储在其他用户具有只读权限的共享文件夹中。然后他们应该仍然能够查看,但不能更改链接表中的数据。

    如果该建议不令人满意,您可以使用查询将其限制为只读访问。在您提供给用户的数据库中,不要在其他数据库中包含指向源表的链接。而是以FROM TableName IN '[path to db file]' 的形式向他们提供一个查询,以查找没有链接的源表...

    这是一个经过测试的示例:

    SELECT
        u.UserID,
        u.FName,
        u.LName,
        u.AccessLevelID
    FROM tblUser AS u IN 'C:\share\Access\loginexample.mdb';
    

    但是,该查询结果仍然可以编辑。您可以使用字段表达式代替实际字段值将列值设为只读。

    SELECT
        u.UserID + 0 AS UserID,
        u.FName + '' AS FName,
        u.LName + '' AS LName,
        u.AccessLevelID + 0 AS AccessLevelID
    FROM tblUser AS u IN 'C:\share\Access\loginexample.mdb';
    

    这些是使值只读的简单转换。但是您可以酌情使用其他技术。例如,如果表格包含日期/时间字段,您可以使用CStr()Format()

    CStr(date_field) AS date_field_as_text
    Format(date_field, 'yyyy-mm-dd hh:nn:ss ampm') AS date_field_as_text
    

    注意,我使用了一个别名,该别名与这些函数的字段名称不同。在某些情况下,当您尝试将字段名称重新用作别名时,Access 会抱怨 “递归别名”。但只需在查询设计器中测试您的别名选择,即可快速找出可接受的别名。

    【讨论】:

    • 第一个具有读取访问权限的建议似乎不起作用,因为 Access 在打开链接表时无法放置锁定文件。第二个建议,在查询中带有 [path to db file],很棒!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多