LoginSignup
0
4

More than 5 years have passed since last update.

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

Posted at

はじめに

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

概略図

001.png
こんな感じ。
ちなみに今回はAccessユーザーには最低限の権限しか与えたくなかったので、接続用のユーザー「access」を作成し、細工をすることとしました。
なお、クライアント側マシンは64bitであったとしても、MySQLドライバー自体は32bitを使用しないと

[ODBC] エラー:指定されたDSNには、ドライバーとアプリケーションとのアーキテクチャの不一致が含まれています

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

事前準備

ODBCドライバーのインストール

Windows側クライアントにODBCドライバーをインストールします。
公式サイトからダウンロード可能です。
この際に、先述した理由から「x86, 32-bit」のドライバーをダウンロードします。

ICOPY060.png

ICOPY061.png

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

データソースの設定

ICOPY062.png
スタートボタン右クリック→設定と選択する。

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

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

ICOPY068.png
システムDSN→追加と進んでいく。

ICOPY065.png
「MySQL ODBC 5.3 Unicode Driver」を選択して完了をクリック。

ICOPY066.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
無事にパスしたら「OK」をクリックしてデータソースの登録を行う。

Access側からテーブルにアタッチしてみる

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

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

ICOPY073.png
適当にリンクしたいテーブルを選択して、「パスワードの保存」にチェックを入れて保存。
これしとかないと開くたびにパスワードを要求されてしまいます。が。
噂によるとMDBファイルをバイナリエディタで開くとパスワードが解析されてしまうとか・・・?

ICOPY074.png
こんな感じでテーブルの中身が見えていたら成功です。

ユーザーの機能制限

なるべくならAccessからコネクトしに来るユーザーに対しては権限を与えたくないです。
というわけでaccessユーザーを作成して、権限を変える設定を行っていきます。
昔の記事でも軽く触れてはいますが、再度。
この辺り(ユーザーの作成権限の設定)を参考にさせていただきました。ありがとうございます。

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

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'@'%' |
+------------------------------------------------------------------------+

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

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

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

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

所感

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

0
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
4