связанная таблица только для чтения

У меня есть база данных access 2003 (mdb) по жилищным проектам, которую я обновляю для нашего местного офиса планирования на ежеквартальной основе. Другие люди в нашем офисе могли бы извлечь выгоду из просмотра тех же данных. Я думал, что самый простой способ-дать им отдельную базу данных access (будь то версия 2003 или 2007), связав ее с исходной таблицей, которую я обновляю. Однако, чтобы предотвратить непреднамеренное изменение исходных данных при просмотре, я хотел бы сделать связанную таблицу только для чтения.

любой подсказки о том, как ограничить права доступа для связанных таблиц в Access 2007?

2 ответов


вы можете сохранить файл БД в общей папке, где другие пользователи имеют разрешение только для чтения. Тогда они все равно смогут просматривать, но не изменять данные в связанной таблице.

если это предложение не является удовлетворительным, вы можете использовать запрос, чтобы ограничить им доступ только для чтения. В базе данных, которую вы предоставляете пользователям, не включайте ссылку на исходную таблицу в другую базу данных. Вместо этого дайте им запрос, который находит исходную таблицу без ссылки ... в виде 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 будет жаловаться на "рекурсивный псевдоним" при попытке повторно использовать имя поля в качестве псевдонима. Но просто проверьте свои варианты псевдонимов в конструкторе запросов, чтобы быстро узнать, какие из них приемлемы.


поздно в игру с этим ответом, но это то, что разработчикам MS-Access иногда нужно делать...

...И это тайна, потому что мы собираемся использовать запрос только для чтения с внутренней строкой соединения, и окно "Свойства запроса" не совсем делает то, что вы ожидаете.

на самом деле, я не думаю, что это окно делает все, что ожидает от него разработчик Microsoft, реализовавший свойство " исходная строка подключения, любой.

но, тайна или нет, вот как сделать что-то, что работает как связанная таблица только для чтения из другой базы данных MS-Access:

  1. сначала создайте новый запрос в локальной таблице. Неважно, что таблица или какие поля, вы все равно отбрасываете SQL.
  2. щелкните правой кнопкой мыши в строке заголовка окна запроса и выберите 'среда SQL Вид'
  3. вставить этот SQL в, перезаписывая все там:


SELECT *
  FROM tblCustomer 
    IN "" [MS Access;PWD=WTF_En_Clair;DATABASE=\MyServer\MyShare$\Subfolder\MyDB.accdb];

Очевидно, вы используете свой собственный адрес базы данных и имя таблицы; и вам может не понадобиться предложение password.

Не пропустите эти двойные кавычки перед строкой подключения: они не помещаются туда для вас встроенным диалогом свойств при вставке строки подключения, и они вам действительно нужны.

вы еще не закончили: это все еще читать-писать:

  1. щелкните правой кнопкой мыши в в строке заголовка окна запроса выберите"дизайн Вид'
  2. щелкните правой кнопкой мыши в фоновой области верхней панели-MDI окно, в котором отображаются таблицы-и выберите "Свойства"..."
  3. вы, вероятно, получите всплывающее окно "лист свойств" с двумя полями: "псевдоним и источник" - это лист свойств таблицы, и вы хотите, чтобы окно свойств запроса...
  4. ...поэтому щелкните левой кнопкой мыши на фоне MDI верхней панели снова, чтобы получить полную собственность лист для запроса.
  5. установите свойство "тип набора записей" в "снимок"
  6. щелкните правой кнопкой мыши в строке заголовка окна запроса и нажмите "Сохранить".
  7. вы закончили с окном запроса. не делайте здесь ничего другого, просто закройте окно. .

вы можете переименовать запрос в имя таблицы или нет: он все равно будет работать в любом запросе, как если бы это была таблица, и вы можете просто сохранить некоторую путаницу, если вы дадите ему имя, которое делает его ясно, что это не настоящий стол. Это имеет значение в любом коде, который ожидает объект DAO TableDef, и включает любой код, который повторно связывает внешние таблицы для вас.

вы заметите строку подключения (простой текстовый пароль и все) в окне свойств запроса в разделе "исходная строка подключения". Серьезно, не редактируйте его: если Вам повезет, он просто заменит ваши две двойные кавычки в SQL парой одинарных кавычек, и запрос все равно будет работать. Но ты, вероятно, проиграешь. эти кавычки, если вы вставляете новую строку подключения, и это нарушит запрос; и ни одно из сообщений об ошибках и страниц справки не скажет вам, что вам нужны эти волшебные кавычки в необработанном SQL.

Я подозреваю, что есть и другие недокументированные ловушки "gotcha" в запросах к внешним объектам: если вы передадите этот хак своим коллегам, я настоятельно рекомендую вам передать предупреждение"вы закончили с окном запроса. Не делайте здесь больше ничего потому что это типа ловушка может отнимать часы вашего и их времени.

также: обязательно документируйте то, что вы сделали: большинство инструментов для повторного подключения связанных таблиц не будут получать запрос с внешним источником, и это ошибка, ожидающая укуса того, кто пытается прыгать между базами данных "DEV", "Testing" и "Production".