链表只读

ako*_*ako 9 permissions ms-access ms-access-2007 linked-tables

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

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

Nig*_*nan 8

有了这个答案的游戏后期,但这是MS-Access开发人员偶尔需要做的事情......

...而且它是神秘的,因为我们将使用带有内部定义的连接字符串的只读查询,并且"查询属性"窗口不能完全按照您的预期执行操作.

实际上,我认为该窗口不会影响实现"源连接字符串"属性的Microsoft开发人员所做的任何事情.

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

  1. 首先,在本地表上创建一个新查询.无论什么表或哪些字段都无关紧要,你无论如何都要丢弃SQL.
  2. 在查询窗口的标题栏中单击鼠标右键,然后选择" SQL视图 "
  3. 粘贴此SQL,覆盖其中的任何内容:

__PRE__
显然,您正在使用自己的数据库地址和表名; 你可能不需要密码条款.

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

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

  1. 在查询窗口标题栏中单击鼠标右键,然后选择" 设计视图 "
  2. 右键单击上部窗格的背景区域 - 显示表格的MDI窗口 - 并选择"属性..."
  3. 你可能会得到一个带有两个字段的'Property Sheet'弹出窗口:'Alias and Source' - 这是表的属性表,你想要查询的属性表...
  4. ...因此,再次左键单击上部窗格的MDI背景,以获取查询的完整属性表.
  5. 将"Recordset Type"属性设置为"Snapshot"
  6. 在查询窗口标题栏中单击鼠标右键,然后单击"保存".
  7. 您已完成查询窗口.这里不做任何其他事情,只关闭窗口..

你可以将查询重命名为表名,或者不是:它仍然可以在任何查询中使用,就好像它是一个表一样,如果你给它一个明确表明这不是一个名字,你可能只会保留一些混淆实际上是一张桌子 这在任何需要DAO TableDef对象的代码中都很重要,并且包含为您重新链接外部表的任何代码.

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

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

另外:请务必记录您所做的事情:用于重新连接链接表的大多数工具都不会接收带有外部源的查询,而这是一个等待试图在"DEV","测试"和"生产'数据库.


Han*_*sUp 5

您可以将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';
Run Code Online (Sandbox Code Playgroud)

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

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';
Run Code Online (Sandbox Code Playgroud)

这些是将值设为只读的简单转换。但是您可以酌情使用其他技术。例如,如果表包含日期/时间字段,则可以使用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
Run Code Online (Sandbox Code Playgroud)

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