web-dev-qa-db-ja.com

特定のプレフィックスを持つ複数のテーブルに特権を付与する

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

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

事前の注意:これは私の答えではありません。 http://lists.mysql.com/mysql/20261 で見つけ、簡単にするためにStephenCookにコピーして貼り付けました。

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_%に置き換えることができます

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

32
CogitoErgoSum

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

ドキュメントはここにあります: http://dev.mysql.com/doc/refman/5.5/en/grant.html

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

3
James C

bashの使用:

mysql -Ne "show tables from test like 'foo_%'" | xargs -I {} mysql -Ne "GRANT SELECT ON test.{} TO 'foouser'@'%'"
0
tilo

以下

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

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

0
Grynn