はじめに
仕様の関係上、Laravelで利用しているDBをAccessから利用することになりました。
基本的にはLaravel関係なくて、AccessとMySQLの接続さえうまくいけば問題ないのですが。
備忘録的にメモを残しておきます。
概略図

こんな感じ。
ちなみに今回はAccessユーザーには最低限の権限しか与えたくなかったので、接続用のユーザー「access」を作成し、細工をすることとしました。
なお、クライアント側マシンは64bitであったとしても、MySQLドライバー自体は32bitを使用しないと
[ODBC] エラー:指定されたDSNには、ドライバーとアプリケーションとのアーキテクチャの不一致が含まれています
的なエラーが出る模様。こちらの環境の問題なのかな?
事前準備
ODBCドライバーのインストール
Windows側クライアントにODBCドライバーをインストールします。
公式サイトからダウンロード可能です。
この際に、先述した理由から「x86, 32-bit」のドライバーをダウンロードします。
あとはダウンロードしてきたmsiを展開して、通常通りインストールを行います。
データソースの設定

バージョン情報→その他の管理ツールと進んでいく。
いつの間にかコントロールパネルへのアクセスがしにくくなってて不便・・・多分プログラム名を直打ちしたら起動できるんだろうけど。
Windows10のインターフェースが徐々に某林檎に寄せてきてる感じがしてなんかアレですね。

というわけで見慣れた画面。「ODBCデータソース(32ビット)」を選択する。

「MySQL ODBC 5.3 Unicode Driver」を選択して完了をクリック。
| 名前 | 説明 | 
|---|---|
| Data Source Name | データソース名。 | 
| Description | 説明。入力任意。 | 
| TCP/IP Server | データベースのサーバーを入力。 | 
| Port | データベースのポートを入力。Homesteadは3306。 | 
| User | 最終的には「access」。接続テスト用:homestead | 
| Password | 接続テスト用:secret | 
| Database | 標準で利用するデータベースを選択。リンクテーブルとしてアタッチする場合は選択必須。多分DAOとかADOとかで繋ぐ場合はData Sourceだけ指定しといて都度DBを切り替えるようなことも可能だと思います。試してないけど。 | 
| 今回はDetailsの設定は行いません。SSLで接続したりなんだりの設定もできるっぽい? | 
念のため「Test」からコネクションテストを行う。

無事にパスしたら「OK」をクリックしてデータソースの登録を行う。
Access側からテーブルにアタッチしてみる

適当にプロジェクトを作成して、「外部データ」から「ODBC データベース」を選択する。

「リンクテーブルを作成してソースデータにリンクする」を選択してOK。

適当にリンクしたいテーブルを選択して、「パスワードの保存」にチェックを入れて保存。
これしとかないと開くたびにパスワードを要求されてしまいます。が。
噂によるとMDBファイルをバイナリエディタで開くとパスワードが解析されてしまうとか・・・?
ユーザーの機能制限
なるべくならAccessからコネクトしに来るユーザーに対しては権限を与えたくないです。
というわけでaccessユーザーを作成して、権限を変える設定を行っていきます。
昔の記事でも軽く触れてはいますが、再度。
この辺り(ユーザーの作成、権限の設定)を参考にさせていただきました。ありがとうございます。
まずはユーザーリストを確認します。
homesteadにssh接続して、mysql -u homestead -p secretコマンドを投入します。
> SELECT host, user FROM mysql.user;
/* 登録されているユーザーリストを表示 */
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| %         | homestead        |
| 0.0.0.0   | homestead        |
| 0.0.0.0   | root             |
| localhost | debian-sys-maint |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+
> CREATE USER access IDENTIFIED BY '(password)';
> SHOW GRANTS FOR 'access'@'%';
/* 新規ユーザーを作成して、権限を確認する */
+------------------------------------+
| Grants for access@%                |
+------------------------------------+
| GRANT USAGE ON *.* TO 'access'@'%' | /* 作成時は何も権限がない状態 */
+------------------------------------+
> GRANT SELECT (id, name, email) ON laravel_db.users TO access;
/* accessユーザーに対して、laravel_dbのusersテーブル内カラム「id, name, email」がSELECTできる権限を与える */
> GRANT SELECT ON laravel_db.users TO access;
/* accessユーザーに対して、laravel_dbのusersテーブル内カラムがSELECTできる権限を与える */
/* グローバルあるいはデータベース、テーブルごとに権限を設定していく */
> SHOW GRANTS FOR 'access'@'%';
/* 確認作業 */
+------------------------------------------------------------------------+
| Grants for access@%                                                    |
+------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'access'@'%'                                     |
| GRANT SELECT (id, name, email) ON `laravel_db`.`users` TO 'access'@'%' |
+------------------------------------------------------------------------+
注意事項としては、この手順でパーミッションを「カラムごとに設定」した場合、先ほどのリンクテーブルとしてアタッチすることができなくなります。
アタッチするときはテーブルの全ての項目を引っ張ってきているようで、許可された部分だけアタッチということができない・・・?
なお、権限設定をミスっちゃった場合の対応。
> REVOKE ALL PRIVILEGES, GRANT OPTION FROM access;
/* ユーザーからすべての権限を削除する */
> REVOKE SELECT ON `laravel_db`.`users` FROM 'access'@'%';
/* 指定したデータベースあるいはテーブルから権限を削除する */
所感
MySQL側からテーブルごと止まりではなく、カラムごとに権限を与えられるのは便利ですねぇ。
ただ、それをリンクテーブルとしてアタッチできないというのはなんとも・・・。
どのみちリンクテーブルとしてアタッチする場合はパスワードの問題があったり、エンドユーザーからも見えてしまったりするので、その辺りは構築方法によりけりなんでしょうけど。
文字コードの問題もあるので、その辺りも検証しないといけないですね。





