AccessからLaravelプロジェクトで利用しているMySQLのテーブルを参照しに行く

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

#概略図
![001.png](https://qiita-image-store.s3.amazonaws.com/0/165355/c15afde5-dc52-abce-7896-02db9273bca5.png)
こんな感じ。
ちなみに今回はAccessユーザーには最低限の権限しか与えたくなかったので、接続用のユーザー「access」を作成し、細工をすることとしました。
なお、クライアント側マシンは64bitであったとしても、MySQLドライバー自体は32bitを使用しないと
>[ODBC] エラー：指定されたDSNには、ドライバーとアプリケーションとのアーキテクチャの不一致が含まれています

的なエラーが出る模様。こちらの環境の問題なのかな？

#事前準備
##ODBCドライバーのインストール
Windows側クライアントにODBCドライバーをインストールします。
[公式サイト](https://dev.mysql.com/downloads/connector/odbc/5.3.html)からダウンロード可能です。
この際に、先述した理由から「x86, 32-bit」のドライバーをダウンロードします。

![ICOPY060.png](https://qiita-image-store.s3.amazonaws.com/0/165355/a76e691a-2a77-a6bd-ab4a-6be69e4f1422.png)

![ICOPY061.png](https://qiita-image-store.s3.amazonaws.com/0/165355/499417e1-dd79-1075-969f-88495174474c.png)

あとはダウンロードしてきたmsiを展開して、通常通りインストールを行います。

##データソースの設定
![ICOPY062.png](https://qiita-image-store.s3.amazonaws.com/0/165355/d8c32183-cb29-f043-a007-0c1d396de822.png)
スタートボタン右クリック→設定と選択する。

![ICOPY063.png](https://qiita-image-store.s3.amazonaws.com/0/165355/1084e9da-a432-2056-09da-5bce533fc06f.png)
バージョン情報→その他の管理ツールと進んでいく。
いつの間にかコントロールパネルへのアクセスがしにくくなってて不便・・・多分プログラム名を直打ちしたら起動できるんだろうけど。
Windows10のインターフェースが徐々に某林檎に寄せてきてる感じがしてなんかアレですね。

![ICOPY064.png](https://qiita-image-store.s3.amazonaws.com/0/165355/0e258447-6501-b318-d93b-99fe5be97c04.png)
というわけで見慣れた画面。「ODBCデータソース（32ビット）」を選択する。

![ICOPY068.png](https://qiita-image-store.s3.amazonaws.com/0/165355/ca27d67d-2696-ad7f-9953-9af12ff89e51.png)
システムDSN→追加と進んでいく。

![ICOPY065.png](https://qiita-image-store.s3.amazonaws.com/0/165355/578a0bfa-c4f0-d067-cd4a-f3544c924fb8.png)
「MySQL ODBC 5.3 Unicode Driver」を選択して完了をクリック。

![ICOPY066.png](https://qiita-image-store.s3.amazonaws.com/0/165355/752a44fb-4b1c-9655-3689-2a2486a0772b.png)
囲っているところに入力を行う。

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

念のため「Test」からコネクションテストを行う。
![ICOPY067.png](https://qiita-image-store.s3.amazonaws.com/0/165355/49c9f6f5-6b24-fa72-8796-bc9c5d72c0e2.png)
無事にパスしたら「OK」をクリックしてデータソースの登録を行う。

##Access側からテーブルにアタッチしてみる
![ICOPY069.png](https://qiita-image-store.s3.amazonaws.com/0/165355/5d9bcd26-de16-1de8-9611-975bd5127b75.png)
適当にプロジェクトを作成して、「外部データ」から「ODBC データベース」を選択する。

![ICOPY070.png](https://qiita-image-store.s3.amazonaws.com/0/165355/c7901c67-fac0-8278-4536-757ac10f3b93.png)
「リンクテーブルを作成してソースデータにリンクする」を選択してOK。

![ICOPY073.png](https://qiita-image-store.s3.amazonaws.com/0/165355/523d478d-d1c9-60ee-2fe3-6a95b1e88d0d.png)
適当にリンクしたいテーブルを選択して、「パスワードの保存」にチェックを入れて保存。
これしとかないと開くたびにパスワードを要求されてしまいます。が。
噂によるとMDBファイルをバイナリエディタで開くとパスワードが解析されてしまうとか・・・？

![ICOPY074.png](https://qiita-image-store.s3.amazonaws.com/0/165355/9336f9e4-92f6-3e1a-0436-2703aa5ec5a7.png)
こんな感じでテーブルの中身が見えていたら成功です。

#ユーザーの機能制限
なるべくならAccessからコネクトしに来るユーザーに対しては権限を与えたくないです。
というわけでaccessユーザーを作成して、権限を変える設定を行っていきます。
[昔の記事](http://qiita.com/tosite0345/items/ff6103174254456aeeff)でも軽く触れてはいますが、再度。
この辺り（[ユーザーの作成](https://www.dbonline.jp/mysql/user/index6.html)、[権限の設定](https://www.dbonline.jp/mysql/user/index6.html)）を参考にさせていただきました。ありがとうございます。

まずはユーザーリストを確認します。
homesteadにssh接続して、``mysql -u homestead -p secret``コマンドを投入します。

```mysql:console
> 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'@'%' |
+------------------------------------------------------------------------+
```

注意事項としては、この手順でパーミッションを「カラムごとに設定」した場合、先ほどのリンクテーブルとしてアタッチすることができなくなります。
アタッチするときはテーブルの全ての項目を引っ張ってきているようで、許可された部分だけアタッチということができない・・・？

なお、権限設定をミスっちゃった場合の対応。

```mysql:console
> REVOKE ALL PRIVILEGES, GRANT OPTION FROM access;
/* ユーザーからすべての権限を削除する */

> REVOKE SELECT ON `laravel_db`.`users` FROM 'access'@'%';
/* 指定したデータベースあるいはテーブルから権限を削除する */
```

#所感
MySQL側からテーブルごと止まりではなく、カラムごとに権限を与えられるのは便利ですねぇ。
ただ、それをリンクテーブルとしてアタッチできないというのはなんとも・・・。
どのみちリンクテーブルとしてアタッチする場合はパスワードの問題があったり、エンドユーザーからも見えてしまったりするので、その辺りは構築方法によりけりなんでしょうけど。
文字コードの問題もあるので、その辺りも検証しないといけないですね。