複数のクライアントに同じデータベースを使用させるために、テーブル プレフィックス方式を使用しています。クライアントごとに作成されるテーブルの数は最大 55 です。手動でテーブルを一覧表示してすべての付与を行う代わりに、次のようなことを行うことはできますか?
GRANT SELECT,INSERT,UPDATE,DELETE ON database.prefix_* TO 'username'@'localhost' IDENTIFIED BY 'password';
複数のクライアントに同じデータベースを使用させるために、テーブル プレフィックス方式を使用しています。クライアントごとに作成されるテーブルの数は最大 55 です。手動でテーブルを一覧表示してすべての付与を行う代わりに、次のようなことを行うことはできますか?
GRANT SELECT,INSERT,UPDATE,DELETE ON database.prefix_* TO 'username'@'localhost' IDENTIFIED BY 'password';
事前注意: これは私の回答ではありません。私はhttp://lists.mysql.com/mysql/202610でそれを見つけ、簡単にするためにコピーして貼り付けました。Stephen Cook の功績によるものです。
INFORMATION_SCHEMA.TABLES ビューを使用して、GRANT ステートメントを生成できます。次の行に沿ってクエリを記述します。
SELECT CONCAT('GRANT SELECT ON test.', TABLE_NAME, ' to ''foouser'';')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'test'
AND TABLE_NAME LIKE 'foo_%'
次に、それを実行し、結果をコピーして、それらの結果をクエリまたはスクリプトとして実行します。もちろん、これで好きなだけ夢中になることができます。たとえば、多くのユーザーに対してこれを行う場合、ユーザー名のパラメーターを受け取るストアド プロシージャを記述し、必要なときにいつでもツールとして使用できるようにすることができます。
これはあなたが要求した構文ではありませんが、機能する素晴らしいトリックです。
--
テーブル スキーマ 'test' をデータベースの名前に置き換えます。foo_% は適切な prefix_% に置き換えることができます
私はこれを自分で試してみましたが、うまくいきました。
テーブル名をワイルドカード化できるかどうかはわかりませんが、データベース名は確実にワイルドカード化できます。ただし、_
任意の 1 文字に一致するワイルドカード (.
正規表現など) と同様に注意してください。
ドキュメントはこちら: http://dev.mysql.com/doc/refman/5.5/en/grant.html
グローバル レベルまたはデータベース レベルで権限を付与する GRANT ステートメントでデータベース名を指定する場合は、「_」および「%」ワイルドカードを使用できます。これは、たとえば、データベース名の一部として「_」文字を使用する場合、GRANT ステートメントで「\_」と指定して、ユーザーが一致する追加のデータベースにアクセスできないようにする必要があることを意味します。ワイルドカード パターン。たとえば、 GRANT ... ON `foo\_bar`.* TO ....
以下
GRANT SELECT , INSERT , UPDATE , DELETE ON ``database.prefix\_%``. * TO 'username'@'localhost'
正常に動作します (Windows 上の MySQL 5.6.12 でテスト済み)
バッシュを使用:
mysql -Ne "show tables from test like 'foo_%'" | xargs -I {} mysql -Ne "GRANT SELECT ON test.{} TO 'foouser'@'%'"