por que precisa selecionar privilégios em *. * para usar o modo de exibição?

2

Eu tenho um problema usando o modo de exibição com o servidor MySQL 5.0 (5.0.92)

Não consigo usar a visualização com um usuário concedido assim:

GRANT USAGE ON *.* TO 'testuser'@'' IDENTIFIED BY PASSWORD '**********';
GRANT ALL PRIVILEGES ON 'testuser'.* TO 'testuser'@'';

Registre na tabela do banco de dados do mysql:

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

Estou conectado assim:

mysql> SELECT USER(),CURRENT_USER();
+-------------------------+-----------------+
| USER()                  | CURRENT_USER()  |
+-------------------------+-----------------+
| [email protected]      | testuser@       | 
+-------------------------+-----------------+

Eu posso criar o modo de exibição, mas quando tento selecionar, tenho estas mensagens:

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

Eu posso mostrar a visão:

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'

Ver se refere apenas à tabela chamada "t" que está no mesmo banco de dados:

show create table testuser.t;
| t     | CREATE TABLE 't' (
'qty' int(11) default NULL,
'price' int(11) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 | 

Preciso de GRANT SELECT ON *.* TO 'testuser'@'' para selecionar o trabalho na exibição.

Por quê?

Você conhece uma solução para usar o VIEW sem os privilégios selecionados em . ?

Muito obrigado pelas suas respostas.

    
por profy 29.06.2012 / 17:11

3 respostas

1

Isso depende inteiramente de como você autenticou

Você deve executar o seguinte

SELECT USER(),CURRENT_USER();

Com toda a probabilidade, testuser @ '' não é um usuário com o qual você possa se conectar explicitamente. Os privs para testuser @ '' seriam concedidos a um usuário anônimo.

Você pode precisar tentar manipular o mysql.db. Execute isto

SELECT COUNT(1) FROM mysql.db WHERE LEFT(db,4)='test' AND user='';;

Se você obtiver uma resposta diferente de zero, execute SELECT * FROM mysql.db\G e atualize as colunas de que precisa. Em seguida, execute FLUSH PRIVILEGES;

Em qualquer caso, é bom lembrar que uma VIEW é uma tabela em information_schema.tables ONDE a coluna do mecanismo é NULL. Portanto, certifique-se de que a necessidade adequada de priv para acessar as tabelas subjacentes no banco de dados testuser esteja acessível.

Você precisa ajustar o nível SECURITY_TYPE da visualização.

    
por 03.07.2012 / 12:33
1

Para ver o conteúdo de uma visualização não é diferente de ver o conteúdo de uma tabela normal - você precisa executar uma consulta de seleção nela. Segue, portanto, que você deve conceder ao usuário o direito de selecionar antes que o usuário possa executar um select em relação a uma visão.

    
por 05.07.2012 / 12:51
0

O testuser . t é uma exibição que faz referência a tabelas em outro banco de dados ao qual o usuário não teria acesso?

Você poderia ter algo assim:

testuser.v -> testuser.t -> otherdatabase.table

Mostra-nos o resultado de SHOW CREATE TABLE testuser.t \G

    
por 08.07.2012 / 04:30

Tags