我有一个 2003 (mdb) 住房项目数据库,我每季度为当地规划办公室更新一次。我们办公室的其他人可以从看到相同的数据中受益。我认为最简单的方法是给他们一个单独的访问数据库(无论是 2003 版还是 2007 版),从它链接到我更新的源表。但是,为了防止他们在查看时无意中更改了源数据,我想将链接表设为只读。
有关如何限制 Access 2007 链接表的访问权限的任何提示?
我有一个 2003 (mdb) 住房项目数据库,我每季度为当地规划办公室更新一次。我们办公室的其他人可以从看到相同的数据中受益。我认为最简单的方法是给他们一个单独的访问数据库(无论是 2003 版还是 2007 版),从它链接到我更新的源表。但是,为了防止他们在查看时无意中更改了源数据,我想将链接表设为只读。
有关如何限制 Access 2007 链接表的访问权限的任何提示?
这个答案迟到了,但这是 MS-Access 开发人员偶尔需要做的事情......
...而且它很神秘,因为我们将使用带有内部定义的连接字符串的只读查询,而“查询属性”窗口并没有完全按照您的预期进行。
实际上,我认为该窗口也不会执行实现“源连接字符串”属性的 Microsoft 开发人员期望它执行的任何操作。
但是,无论是否神秘,这里是如何做一些像另一个 MS-Access 数据库中的只读链接表一样工作的事情:
选择 * FROM tbl客户 IN "" [MS Access;PWD=WTF_En_Clair;DATABASE=\\MyServer\MyShare$\Subfolder\MyDB.accdb];显然,您使用的是自己的数据库地址和表名;你可能不需要密码子句。
不要错过连接字符串前面的那些双引号:当您粘贴连接字符串时,内置属性对话框不会为您放入它们,您确实需要它们。
你还没有完成:它仍然是读写的:
您可以将查询重命名为表名,也可以不重命名:它仍然可以在任何查询中工作,就好像它是一个表一样,如果您给它起一个清楚地表明这不是表的名称,您可能会避免一些混乱实际上是一张桌子。这在任何需要 DAO TableDef 对象的代码中都很重要,其中包括为您重新链接外部表的任何代码。
您会在“源连接字符串”下的查询属性窗口中看到您的连接字符串(纯文本密码和所有密码)。说真的,不要编辑它:如果幸运的话,它只会用一对单引号替换 SQL 中的两个双引号,查询仍然可以工作。但是如果你粘贴一个新的连接字符串,你可能会丢失这些引号,这会破坏查询;并且没有任何错误消息和帮助页面会告诉您在原始 SQL 中需要这些神奇的引号。
我怀疑在对外部对象的查询中还有其他未记录的“陷阱”:如果您将此 hack 传递给您的同事,我强烈建议您传递警告“您已完成查询窗口。不要在这里做任何其他事情,因为这种类型的陷阱会浪费你和他们的时间。
另外:请务必记录您所做的:大多数用于重新连接链接表的工具不会使用外部源获取查询,这是一个等待尝试在“DEV”、“测试”和“测试”之间跳跃的人的错误。生产数据库。
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.