Всем доброго времени суток.
Вопрос следующий:
Есть юзер test_user, мне нужно при помощи sql-запроса узнать, есть ли у него привилегии INSERT и UPDATE на определенную схему, скажем test_schema.
Запрос два столбца [priv] - название привилегии и [has] - соответственно 1- если привилегия есть и 0- если привилегии нет. Сочинил я что-то типа такого:
select
CONCAT_WS(' ', p.PRIVILEGE_TYPE, 'ON', CONCAT('test_schema', '.', '*')) AS priv
, if(ifnull(GRANTEE, 1), 0, 1) has
from (select 'INSERT' PRIVILEGE_TYPE union select 'UPDATE') p
left join
(select * from INFORMATION_SCHEMA.SCHEMA_PRIVILEGES WHERE
GRANTEE=CONCAT('\'',REPLACE(CURRENT_USER(),'@','\'@\''),'\'')
AND TABLE_SCHEMA = 'test_schema') up using(PRIVILEGE_TYPE);
Возвращает эта штука что-то типа такого:
priv | has
-----------------------------------------
'INSERT ON test_schema.*' | '1'
-----------------------------------------
'UPDATE ON test_schema.*' | '0'
----------------------------------------
Но вот проблема, этот запрос не покрывает унаследованных привилегий. Допустим если пользователю test_user выдать такую привилегию
GRANT UPDATE ON *.* TO 'test_user';
то во втором столбце второй строки все еще будет 0 хотя по факту он может апдейтить все что хочет.
Вопрос, как переписать данный запрос, чтобы он покрыл все кейсы, и возвращал 0 исключительно тогда, когда у пользователя нет прав апдейтить в схеме
test_schema. Или может есть в MySql какая-то волшебная умная функция типа
HAS_PERMS_BY_NAME в MS Sql.
Заранее благодарен.
Отредактированно bobanman (02.03.2016 17:01:53)