У меня проблема с использованием представления с сервером MySQL 5.0 (5.0.92)
Я не могу использовать представление с таким пользователем:
GRANT USAGE ON *.* TO 'testuser'@'' IDENTIFIED BY PASSWORD '**********';
GRANT ALL PRIVILEGES ON `testuser`.* TO 'testuser'@'';
Запись в таблице mysql db:
mysql> select * from db where user='testuser'\G;
*************************** 1. row ***************************
Host:
Db: testuser
User: testuser
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Execute_priv: Y
max_size: 1024
max_size_status: 0
Я связан вот так:
mysql> SELECT USER(),CURRENT_USER();
+-------------------------+-----------------+
| USER() | CURRENT_USER() |
+-------------------------+-----------------+
| testuser@10.X.X.X | testuser@ |
+-------------------------+-----------------+
Я могу создать представление, но когда я пытаюсь выбрать его, у меня появляются следующие сообщения:
ERROR 1356 (HY000): View 'testuser.v' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
Я могу показать вид:
mysql> SHOW CREATE VIEW testuser.v;
| View | Create View
| v | CREATE ALGORITHM=UNDEFINED DEFINER=`testuser`@`` SQL SECURITY DEFINER VIEW `testuser`.`v` AS select `testuser`.`t`.`qty` AS `qty`,`testuser`.`t`.`price` AS `price`,(`testuser`.`t`.`qty` * `testuser`.`t`.`price`) AS `value` from `testuser`.`t`
Просмотр относится только к таблице с именем «t», которая находится в той же базе данных:
show create table testuser.t;
| t | CREATE TABLE `t` (
`qty` int(11) default NULL,
`price` int(11) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
мне нужно GRANT SELECT ON *.* TO 'testuser'@''
чтобы выбрать работу с представлением.
Зачем ?
Знаете ли вы, как использовать VIEW без привилегий выбора на . ?
Большое спасибо за ваши ответы.
Это полностью зависит от того, как вы прошли аутентификацию.
Вы должны запустить следующее
SELECT USER(),CURRENT_USER();
По всей вероятности, testuser @ '' не является пользователем, с которым вы можете явно связаться. Привилегии для testuser @ '' будут предоставлены анонимному пользователю.
Возможно, вам придется попробовать манипулировать mysql.db. Запустить это
SELECT COUNT(1) FROM mysql.db WHERE LEFT(db,4)='test' AND user='';;
Если вы получили ненулевой ответ, запустите SELECT * FROM mysql.db\G
затем обновите те столбцы, которые вам нужны. Затем запустите FLUSH PRIVILEGES;
В любом случае хорошо помнить, что VIEW - это таблица в information_schema.tables, ГДЕ столбец механизма имеет значение NULL. Итак, убедитесь, что у вас есть права доступа к базовым таблицам в базе данных testuser.
Вам многим нужно настроить уровень SECURITY_TYPE представления.
Просмотр содержимого представления ничем не отличается от просмотра содержимого обычной таблицы - вам необходимо выполнить для него запрос выбора. Из этого следует, что вы должны предоставить пользователю право выбора, прежде чем пользователь сможет выполнить выбор для представления.
Является testuser
.t
само представление, которое ссылается на таблицы в другой базе данных, к которой у пользователя не будет доступа?
У вас могло быть что-то вроде этого:
testuser.v -> testuser.t -> otherdatabase.table
Покажите нам результат SHOW CREATE TABLE testuser.t \G