web-dev-qa-db-fra.com

Accorder à un utilisateur l'autorisation de ne voir qu'une vue mysql

La question ci-dessous concerne MySQL 5.1.44

Disons que j'ai une table avec des enregistrements insérés par différents utilisateurs de mon application. Comment puis-je donner à un utilisateur spécifique le droit de ne voir que ses enregistrements dans cette table? J'ai pensé créer une VIEW avec ses enregistrements, mais je ne sais pas comment créer un utilisateur mysql qui ne peut voir que VIEW.

Alors, est-il possible de créer un utilisateur mysql qui n'a accès qu'à une seule variable VIEW? cet utilisateur peut-il également être créé pour qu’il ait un accès en lecture seule à cette VIEW?

Merci!

PS: Ce que j'appelle les utilisateurs dans mon exemple, sont en réalité des filiales souhaitant accéder à leurs archives avec leurs propres applications.

22
Nelson

GRANT SELECT ON database1.view1 TO 'someuser'@'somehost';

31
Naktibalda

Outre

GRANT SELECT ON <database_name>.<view_name>
TO <user>@<Host>
IDENTIFIED BY '<password>'

il vaut mieux faire aussi

GRANT SHOW VIEW
ON <database_name>.<view_name> TO <user>@<Host>
IDENTIFIED BY '<password>'

afin que de nombreux outils d'interface utilisateur SQL puissent obtenir la définition de la vue et fonctionner correctement pour la vue.

8
Dexin Wang
GRANT SELECT ON <database name>.<view name>
TO <user>@<Host> IDENTIFIED BY '<password>'

Source: Documentation MySQL

5
Anax

Je crois que la question initiale consiste en fait à savoir comment limiter les lignes à celles appartenant à un utilisateur donné. (L'idée de créer une vue par utilisateur, puis d'accorder cela, semble être une solution de rechange.)

Pour ce faire, insérez la référence user () dans la table de données, puis filtrez-la.

Utiliser MySQL 5.6. Créez une vue qui limite SELECT aux enregistrements appartenant à l'utilisateur actuel:

-- check the current user
select user();

create table t1 (myId int, mydata varchar(200), myName varchar(200));

insert t1 select 1, 'my data yes', user();
insert t1 select 2, 'my data yes2', user();
insert t1 select 3, 'my data no', 'joe';

select * from t1;

create or replace view v1 AS
select * from t1 where myName = user();

select * from v1;
3
Rich Fried

Si vous voulez que la vue ne soit lue que ce que je suppose que vous faites. Ensuite, vous devez créer la vue avec la clause ALGORITHM = TEMPTABLE.

Cela fera en sorte que la vue ne soit lue qu'en vertu de la nécessité de créer une table temporaire.

Une autre façon de réaliser en lecture seule et cela dépend de vos données est de coller une fonction d'agrégat. Par exemple, si vous avez une vue basée sur une table et affichant toutes les colonnes, vous pouvez coller une image distincte sur la sélection. 

0
Daniel Fisher