Возможен ли временный просмотр MySQL? - PullRequest
4 голосов
/ 31 марта 2011

Это продолжение:

Разрешить пользователям только определенную информацию из базы данных

Я делаю представления как таковые (я уверен, что это можно оптимизировать):

db.php, которое включается:

$conn = mysql_connect("localhost","directory","dghgffhghf") or die(mysql_error());

mysql_select_db("directory", $conn) or die(mysql_error());  

mysql_query("CREATE or REPLACE VIEW {$user}_rooms AS SELECT * FROM rooms WHERE palace = '$user'") or die(mysql_error()); 
mysql_query("CREATE or REPLACE VIEW {$user}_users AS SELECT * FROM users WHERE palace = '$user'") or die(mysql_error()); 
mysql_query("CREATE or REPLACE VIEW {$user}_servers AS SELECT * FROM servers WHERE palace = '$user'") or die(mysql_error()); 
mysql_query("CREATE or REPLACE VIEW {$user}_online_servers AS SELECT * FROM online_servers WHERE palace = '$user'") or die(mysql_error()); 

Где пользовательский "каталог" должен иметь права SELECT, CREATE VIEW и DROP (DROP требуется, потому чтоиз or REPLACE).Я не хочу, чтобы у них были права доступа DROP, так как пользователь каталога будет находиться в файле PHP, принадлежащем apache, и они не ограничены этим с помощью dir - так что они могут просто просматривать пользователя и передавать.

Кроме того, я не хочу, чтобы пользователь просто использовал bob_rooms, когда он на самом деле joe.Я только хочу, чтобы представление было создано ТОЛЬКО для этого пользователя в этом конкретном соединении, и DROP, как только соединение исчезло.Я не могу полагаться на пользователя DROP для просмотра самостоятельно.

Кроме того, наличие временного представления с автоматическим удалением исключило бы использование or REPLACE, что означает, что я могу взять нечетное DROPразрешения для пользователя.

Я думаю, что в SQLlite это будет так просто:

CREATE TEMP VIEW ...

SqlLite может делать временные представления, но MySQL не может?

Ответы [ 2 ]

3 голосов
/ 31 марта 2011

Я не знаю о временных представлениях, но есть поддержка временных таблиц. Таким образом, вы можете сделать что-то, где вы создаете временные таблицы с такими же структурами, что и таблицы, которые они отражают, например, комнаты для комнат. Затем вставьте в временную таблицу выборку из реальной таблицы с соответствующими ограничениями, например ::10000

INSERT INTO temp_bob_rooms (SELECT * FROM rooms WHERE user='bob');

Затем, когда пользователь завершит сеанс, временная таблица будет автоматически удалена, поэтому пользователю каталога больше не требуется доступ DROP. Вы можете прочитать больше о временных таблицах здесь:

http://www.tutorialspoint.com/mysql/mysql-temporary-tables.htm

Недостатком этого подхода является то, что временная таблица не будет обновляться данными, вставленными в «реальную» таблицу во время открытия сеанса с временной таблицей.

Другой подход может состоять в том, чтобы просто написать сценарий, который будет генерировать пользователя mysql для каждого реального пользователя, соответствующих представлений и предоставлять разрешения для этих представлений соответствующим пользователям. Единственным недостатком этого подхода является то, что ваш файл db.php больше никому не будет полезен, поскольку каждый пользователь должен будет создать собственное соединение с правильным паролем и именем пользователя.

0 голосов
/ 25 июня 2014

Вы можете создать временную таблицу из запроса за один шаг с синтаксисом:

CREATE TEMPORARY TABLE temp_table_name SELECT ... ;

Предостережения к временным таблицам:

  • Они не проиндексированы--большие временные таблицы не работают хорошо.
  • Они существуют только в той области сеанса, в которой они созданы.
...