2014年7月10日木曜日

[MS Access] 読み取り専用のリンクテーブル

Microsoft Access のリンクテーブルからデータ編集を禁止したいという要望は稀にあるが、リンクテーブルに ReadOnly 設定は残念ながら無い、だだ対策はある。

1.データベースアカウントを参照権限に限定する

リンクテーブルからのデータ編集を防ぎたいというのは、セキュリティの観点からデータ操作を制限したいという意図のはず。もし外部の DBMS に接続しているリンクテーブルならば、データベースアカウントの権限から 挿入(INSERT)/更新(UPDATE) 権限を除きます。

Oracleならば、データを編集すると ORA-01031: 権限が不足しています エラーになります。

2.ビューにリンクする

読み取り専用の VIEW に対してリンクすれば、リンクテーブルからのデータ編集を防げます。
Oracleならば、WITH READ ONLY 句 を付けた VIEW のデータを編集すると、ORA-01732: このビューではデータ操作が無効です エラーになります。

3.ODBCデータソースを読み取り専用にする

ODBC データソース を使用しているリンクテーブルならば、使用するODBC データソースの「読み取り専用」設定を ON にする。これは「ODBC データソース アドミニストレーター」画面から設定を変更できます。

<画面の起動方法>
コントロールパネル > システムとセキュリティ > 管理ツール > データ ソース (ODBC)

4.リンクテーブルでなくパススルー クエリを使う

ODBC データソース を使用しているリンクテーブルならば、リンクテーブルを止めてパススルー クエリに置き換えれば、データを編集できません。

HOW TO: Base Subforms on SQL Pass-Through Queries in Access 2000
http://support.microsoft.com/kb/209116
SQL パススルー クエリは読み取り専用です

Access で SQL パススルー クエリを作成する方法
http://support.microsoft.com/kb/303968/ja

5.リンクテーブルでなくクエリを使う(ODBC データソース の場合)

(次第に変な対策になりつつありますが)編集できないクエリを使います。
ただしパススルー クエリを使わないならば、クエリの入力 Table としてリンクテーブルが必要になります。これだとリンクテーブルを使われることになる(元の課題に戻る)ので、リンクテーブルを「隠しオブジェクト」に設定します。

ただし「隠しオブジェクト」だからといって一切触れないわけではないです、ご注意を!

さらに、リンクテーブルのデータをそのまま表示するだけの単純なクエリだとデータが編集可能なので、クエリのプロパティを変更します。

<クエリのプロパティを変更>
クエリの「レコードセット」プロパティを「スナップショット」に変更

6.リンクテーブルでなくクエリを使う(外部の Access ファイルの場合)

Access ならばリンクテーブルが無くてもクエリの入力 Table として使えます。外部の Access ファイルをパススルークエリでリンクすることはできません。
(SQL例)
SELECT * FROM [社員] IN [C:\data\名簿.accdb]
FROM 句
http://office.microsoft.com/ja-jp/access-help/HA001231451.aspx

もしくは、テーブルを結合する時に便利な書き方
SELECT * FROM [C:\data\名簿.accdb].[社員]

これもデータを全て表示するだけの単純なクエリだとデータが編集可能なので、クエリのプロパティを変更します

<クエリのプロパティを変更>
クエリの「レコードセット」プロパティを「スナップショット」に変更

7.データベースファイルを読み取り専用にする(外部の Access ファイルの場合)

もちろんファイルを読み取り専用にしてしまうと一切更新できません!。ただリンク先のファイルを読み取り専用にしてしまえば、リンクテーブルからデータの編集を防ぐことはできます。