Ответ 1
GRANT SELECT ON database1.view1 TO 'someuser'@'somehost';
Следующий вопрос относится к MySQL 5.1.44
Скажем, у меня есть таблица с записями, вставленными разными пользователями моего приложения. Как я могу дать конкретному пользователю доступ только к его/ее записям в этой таблице? Я думал о создании VIEW
с его/ее записями, но я не знаю, как создать пользователя mysql, который может видеть только VIEW
.
Итак, возможно ли создать mysql-пользователя, который имеет доступ только к одному VIEW
? может ли этот пользователь также быть создан для доступа только для чтения к этому VIEW
?
Спасибо!
PS: То, что я называю пользователями в моем примере, действительно является дочерними офисами, которые хотят получить доступ к своим записям со своими собственными приложениями.
GRANT SELECT ON database1.view1 TO 'someuser'@'somehost';
Кроме того,
GRANT SELECT ON <database_name>.<view_name>
TO <user>@<host>
IDENTIFIED BY '<password>'
лучше также делать
GRANT SHOW VIEW
ON <database_name>.<view_name> TO <user>@<host>
IDENTIFIED BY '<password>'
чтобы инструмент SQL UI мог получить определение представления и работать соответствующим образом для представления.
GRANT SELECT ON <database name>.<view name>
TO <user>@<host> IDENTIFIED BY '<password>'
Источник: Документация по MySQL
Я считаю, что исходный вопрос действительно спрашивает, как ограничить строки теми, которые принадлежат данному пользователю. (Идея создания одного представления для пользователя, а затем предоставление только этого, похоже на обходное решение.)
Вы можете сделать это, вставив ссылку user() в таблицу данных, а затем отфильтровывая ее.
Использование MySQL 5.6. Создайте представление, которое ограничивает SELECT только записями, принадлежащими текущему пользователю:
-- 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;
Если вы хотите сделать только чтение, которое, как я подозреваю, вы делаете. Затем вы должны создать представление с предложением ALGORITHM = TEMPTABLE.
Это сделает просмотр только для чтения, потому что ему нужно создать временную таблицу.
Еще один способ добиться только чтения, и это зависит от ваших данных - придерживаться агрегатной функции. Например, если у вас есть представление, которое основано на таблице, и отображает все столбцы, вы можете привязать выделение к выбору.