Мучаюсь над проблемой получения информации о том есть ли права у пользователя на определённые команды к определённым таблицам. Например есть пользователь user и у него есть права на SELECT в таблице table1, а так же есть права на SELECT, DELETE в таблице table2. Как определить есть ли у пользователя права для удаления конкретно для таблицы table2?
Если использовать команду: "SHOW GRANTS FOR user; " то выводятся все привилегии пользователя, что в свою очередь трудно автоматически обработать(точнее я не представляю как из меняющегося вывода выбрать DELETE который будет относиться именно к таблице table2 и не перепутать с другими таблицами.)
Если использовать команду: "SELECT * FROM information_schema.user_privileges;" то выводятся не все привилегии(в моём случае выводится только одна привилегия "USAGE"),
Если использовать команду "USE information_schema; SELECT TABLE_NAME, PRIVILEGES FROM COLUMNS;" то привилегии выводятся только те, которые совпадают со списком "select,insert,update,references" т.е. в моём случае DELETE здесь нет.
Неужели никак нельзя узнать есть ли определённые права у пользователя?
Однострочником.$ mysql --batch -u root -p --execute="SHOW GRANTS FOR user;" | grep table2
MySQL - дeбильная база, не занимайся в ней сложностями. Если появились такие вопросы - время уходить на что-то другое.
> Однострочником.
> $ mysql --batch -u root -p --execute="SHOW GRANTS FOR user;" | grep
> table2
> MySQL - дeбильная база, не занимайся в ней сложностями. Если появились такие
> вопросы - время уходить на что-то другое.1. А есть ли возможность сделать это на PHP с правами пользователя у которого я хочу проверить права?
2. И ещё вопрос. В postgresql это такую выборку проще делать?
> 1. А есть ли возможность сделать это на PHP с правами
> пользователя у которого я хочу проверить права?Попробуй, должно сработать. В комментариях в документации v5.7 по SHOW GRANTS есть пример на Perl. PDO цельнотянутый с DBI, так что переведёшь и на PHP.
> 2. И ещё вопрос. В postgresql это такую выборку проще делать?
SELECT has_table_privilege('joe', 'table2', 'DELETE');