10

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

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

4

2 回答 2

9

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

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

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

但是,无论是否神秘,这里是如何做一些像另一个 MS-Access 数据库中的只读链接表一样工作的事情:

  1. 首先,在本地表上创建一个新查询。不管是什么表或什么字段,你都在丢弃 SQL。
  2. 右键单击查询窗口的标题栏并选择“ SQL View
  3. 粘贴此 SQL,覆盖其中的任何内容:

选择 *
  FROM tbl客户
    IN "" [MS Access;PWD=WTF_En_Clair;DATABASE=\\MyServer\MyShare$\Subfolder\MyDB.accdb];

显然,您使用的是自己的数据库地址和表名;你可能不需要密码子句。

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

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

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

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

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

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

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

于 2015-09-10T10:29:04.460 回答
5

You could store the db file in a shared folder where the other users have read-only permission. Then they should still be able to view, but not change, the data in the linked table.

If that suggestion is not satisfactory, you can use a query to limit them to read-only access. In the database you give the users, don't include a link to the source table in your other database. Instead give them a query which finds the source table without a link ... in the form of FROM TableName IN '[path to db file]'

Here is a tested example:

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

However, that query result could still be editable. You can make the column values read-only with field expressions in place of the actual field values.

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';

Those were simple transformations to make the values read-only. But you can use other techniques as appropriate. For example, if the table includes a Date/Time field, you could use CStr() or Format().

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

Note I used an alias which was distinct from the field name with those functions. In some cases, Access will complain about a "recursive alias" when you attempt to re-use the field name as the alias. But just test your alias choices in the query designer to quickly find out which are acceptable.

于 2013-10-07T19:38:31.913 回答