Наши пользователи входят в производственную базу данных как пользователь довольно низкого уровня, с ВЫБОРОМ, предоставленным на уровне базы данных, и ВСТАВЛЯЮТ/ОБНОВЛЯЮТ/УДАЛЯЮТ предоставленный на определенных таблицах, к которым они нуждаются в доступе.
У них также есть полномочия составить временные таблицы (нам нужны они для некоторых более сложных запросов). Проблема состоит в том, что, пока они могут составить временные таблицы, у них нет доступа для ВСТАВКИ в них!
Обходное решение, которое мы нашли, должно создать "реальное" (персистентный?) таблица того же имени (но только с одним полем) и предоставляют доступ для них для вставки в это. Затем когда временная таблица будет составлена с тем же именем, система будет использовать это, не персистентную таблицу.
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'
При попытке предоставить доступ к таблице (на другой сессии, как корень), Вы не можете:
mysql> GRANT INSERT ON testdb.testing TO 'stduser'@'%';
ERROR 1146 (42S02): Table 'testdb.testing' doesn't exist
Таким образом, мой вопрос, в основном, можем мы предоставлять ВСТАВИТЬ/ОБНОВИТЬ/УДАЛИТЬ на временных таблицах, не имея "персистентной" таблицы того же бродящего вокруг имени?
Согласно справочнику MySQL :
MySQL позволяет вам предоставлять привилегии для баз данных или таблиц, которые не существуют. Для таблиц предоставляемые привилегии для должны включать привилегию CREATE .
Итак, попробуйте включить разрешение CREATE в оператор гранта выше.
Гранты MySQL не зависят от объекта, на самом деле существующего - вы можете предоставить доступ к таблицам, которые (пока) не существуют, и эти разрешения были бы назначены таблице, если бы она была создана. Это означает, что вы можете предоставить пользователю разрешение на создание определенной таблицы.
У меня возникнет соблазн создать базу данных только для временных таблиц (называемых, скажем, temp) и предоставить пользователям доступ к этой базе данных. Управлять разрешениями на основе базы данных намного проще, чем разрешениями для отдельных объектов.
Один из способов обойти это - создать специальную базу данных и предоставить пользователю доступ на запись к ней, а затем попросить его создать эти временные таблицы в этой специальной базе данных. .