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