21

複数のクライアントに同じデータベースを使用させるために、テーブル プレフィックス方式を使用しています。クライアントごとに作成されるテーブルの数は最大 55 です。手動でテーブルを一覧表示してすべての付与を行う代わりに、次のようなことを行うことはできますか?

GRANT SELECT,INSERT,UPDATE,DELETE ON database.prefix_* TO 'username'@'localhost' IDENTIFIED BY 'password';
4

4 に答える 4

42

事前注意: これは私の回答ではありません。私は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_% に置き換えることができます

私はこれを自分で試してみましたが、うまくいきました。

于 2011-05-04T17:06:01.487 に答える
4

テーブル名をワイルドカード化できるかどうかはわかりませんが、データベース名は確実にワイルドカード化できます。ただし、_任意の 1 文字に一致するワイルドカード (.正規表現など) と同様に注意してください。

ドキュメントはこちら: http://dev.mysql.com/doc/refman/5.5/en/grant.html

グローバル レベルまたはデータベース レベルで権限を付与する GRANT ステートメントでデータベース名を指定する場合は、「_」および「%」ワイルドカードを使用できます。これは、たとえば、データベース名の一部として「_」文字を使用する場合、GRANT ステートメントで「\_」と指定して、ユーザーが一致する追加のデータベースにアクセスできないようにする必要があることを意味します。ワイルドカード パターン。たとえば、 GRANT ... ON `foo\_bar`.* TO ....

于 2011-05-04T17:06:31.390 に答える
0

以下

GRANT SELECT , INSERT , UPDATE , DELETE ON ``database.prefix\_%``. * TO 'username'@'localhost'

正常に動作します (Windows 上の MySQL 5.6.12 でテスト済み)

于 2013-12-04T15:32:17.383 に答える
0

バッシュを使用:

mysql -Ne "show tables from test like 'foo_%'" | xargs -I {} mysql -Ne "GRANT SELECT ON test.{} TO 'foouser'@'%'"
于 2013-04-08T12:58:01.377 に答える