Есть ли лучший способ назначить разрешения для временных таблиц в MySQL?
Наши пользователи входят в производственную базу данных как пользователь довольно низкого уровня, с SELECT, предоставляемым на уровне базы данных, и INSERT/UPDATE/DELETE, предоставляемым для определенных таблиц, к которым им необходим доступ.
У них также есть разрешения на создание временных таблиц (они нужны нам для некоторых более сложных запросов). Проблема в том, что, хотя они могут создавать временные таблицы, у них нет доступа к INSERT в них!
Обходной путь, который мы нашли, состоит в том, чтобы создать "настоящую" (постоянную?) Таблицу с тем же именем (но только с одним полем) и предоставить им доступ для вставки в нее. Затем, когда временная таблица будет создана с тем же именем, система будет использовать ее, а не постоянную таблицу.
mysql> CREATE TEMPORARY TABLE `testing` (`id` INTEGER AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(30));
Query OK, 0 rows affected (0.04 sec)
mysql> INSERT INTO `testing` (`name`) VALUES ('testing');
ERROR 1142 (42000): INSERT command denied to user 'stduser'@'office.companyname.co.uk' for table 'testing'
Если вы попытаетесь предоставить доступ к таблице (в другом сеансе с правами root), вы не сможете:
mysql> GRANT INSERT ON testdb.testing TO 'stduser'@'%';
ERROR 1146 (42S02): Table 'testdb.testing' doesn't exist
Таким образом, мой вопрос, в принципе, можем ли мы предоставить INSERT/UPDATE/DELETE для временных таблиц, не оставляя "постоянную" таблицу с тем же именем?
3 ответа
Согласно справке MySQL:
MySQL позволяет вам предоставлять привилегии для баз данных или таблиц, которые не существуют. Для таблиц предоставляемые привилегии должны включать привилегию CREATE.
Поэтому попробуйте включить разрешение CREATE в приведенное выше заявление о предоставлении.
Одним из способов решения этой проблемы будет создание специальной базы данных и предоставление пользователю права на запись в нее, а затем создание временных таблиц в этой специальной базе данных.
Предоставления MySQL не зависят от реально существующего объекта - вы можете предоставить таблицы, которых (пока) не существует, и эти разрешения будут назначены таблице, если она будет создана. Это означает, что вы можете предоставить пользователю разрешение на создание определенной таблицы.
Я хотел бы создать базу данных только для временных таблиц (называемых, скажем, временными) и предоставить пользователям доступ к этой базе данных. Разрешения на основе базы данных гораздо проще управлять, чем разрешения для каждого объекта.