Предоставить разрешения для представлений, запретить выбор для таблиц


9

У меня есть пользователь MySQL, и я хочу, чтобы он просматривал ТОЛЬКО нужные мне представления, а не любую другую таблицу в базе данных. Я предоставил этому пользователю разрешения только для определенных представлений следующим образом:

GRANT SHOW VIEW ON `myDatabase`.`awesome_view` TO 'thisUser'@'%'

Если я сделаю show grants;заявление, я могу видеть только эти разрешения, как и ожидалось. Однако я бы хотел, чтобы этот пользователь просто запрашивал представления, а не таблицы, связанные с этими представлениями, но я не могу найти способ сделать это. Похоже, что если я хочу, чтобы пользователь сделал выбор в представлении, выбор также должен быть предоставлен для таблицы, или я ошибаюсь?

Если я отрицаю selectутверждение в остальных таблицах и в командной строке, я пытаюсь сделать выбор, я получаю следующее:

SELECT * FROM myDatabase.fordibenForYouTable;
ERROR 1142 (42000): SELECT command denied to user 'thisUser'@'localhost' for table 'fordibenForYouTable'

Это то, что я действительно хочу, но мне также отказали, если я выбрал представление данных.

Есть ли способ, которым я могу сделать доступными для пользователя только представления, а не таблицы?

Ответы:


6

Вы должны будете рассматривать представление как таблицу. Информация_схема уже делает

Если вы бежите

SELECT table_name FROM information_schema.tables
WHERE engine IS NULL;

Вы получаете все мнения.

Просто предоставьте пользователю SELECT для просмотра следующим образом

GRANT SELECT ON `myDatabase`.`fordibenForYouTable` TO 'thisUser'@'localhost' ;

Как только вы это сделаете, вы должны иметь доступ SELECT к таблице.

Чтобы убедиться, запустить SHOW GRANTS FOR 'thisUser'@'localhost';

Вы также должны видеть, какой доступ на уровне таблицы предоставляется 'thisUser'@'localhost'

SELECT * FROM mysql.tables_priv
WHERE user='thisUser' and host='localhost'\G

Вы также можете увидеть, что пользователь имеет доступ на уровне таблицы к myDatabase.fordibenForYouTable

SELECT * FROM mysql.tables_priv
WHERE db='myDatabase' and table_name='fordibenForYouTable'\G

ДАЙТЕ ЭТО ПОПРОБУЙТЕ !!!


Эй, ты сделал это! Спасибо! Я не мог найти решение для себя! Большое спасибо!
Метафаниэль

5

Я знаю, что это старо, но вот что решило эту проблему для меня ...

Ответ был с синтаксисом «SQL SECURITY».

В моем исходном определении представления SQL SECURITY был установлен как «INVOKER». Это означало, что пользователь был вынужден иметь разрешение на выбор как для представления, так и для таблицы.

Когда я изменил SQL SECURITY на «DEFINER», я мог дать пользователю право выбора только для представления.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.