Grant privileges on several tables with specific prefix

后端 未结 4 1477
清歌不尽
清歌不尽 2020-12-08 02:56

I\'m using the table prefix method for having several clients use the same database. The number of tables created per client will be ~55. Instead of doing all of the grant

相关标签:
4条回答
  • 2020-12-08 03:25

    using bash:

    mysql -Ne "show tables from test like 'foo_%'" | xargs -I {} mysql -Ne "GRANT SELECT ON test.{} TO 'foouser'@'%'"
    
    0 讨论(0)
  • 2020-12-08 03:30

    I'm not sure if you can wildcard table names, you can definitely wildcard database names though. Watch out though as _ is a wildcard matching any single character (like . in a regular expression).

    The Documention is here: http://dev.mysql.com/doc/refman/5.5/en/grant.html

    The “_” and “%” wildcards are permitted when specifying database names in GRANT statements that grant privileges at the global or database levels. This means, for example, that if you want to use a “_” character as part of a database name, you should specify it as “\_” in the GRANT statement, to prevent the user from being able to access additional databases matching the wildcard pattern; for example, GRANT ... ON `foo\_bar`.* TO ....

    0 讨论(0)
  • 2020-12-08 03:46

    The following

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

    works fine (tested with MySQL 5.6.12 on Windows)

    0 讨论(0)
  • 2020-12-08 03:48

    Advance Note: This is not my answer. I found it at http://lists.mysql.com/mysql/202610 and have copied and pasted for simplicity credit to Stephen Cook

    You can use the INFORMATION_SCHEMA.TABLES view to generate the GRANT statements for you. Write a query along these lines:

    SELECT   CONCAT('GRANT SELECT ON test.', TABLE_NAME, ' to ''foouser'';')
    FROM     INFORMATION_SCHEMA.TABLES
    WHERE    TABLE_SCHEMA = 'test'
          AND TABLE_NAME LIKE 'foo_%'
    

    Then run it, copy the results, and run those results as a query or script. You can of course get as crazy as you want with this, for example if you do this for many users maybe write a stored procedure that takes a parameter for the username and can therefore be used as a tool whenever you need it.

    It isn't a syntax you asked for, but it is a nice trick that works.

    --

    Replace the table schema 'test' with the name of your database. foo_% can be replaced with the appropraite prefix_%

    I tried this on my own and it worked great.

    0 讨论(0)
提交回复
热议问题