2015-07-17 2 views
2

Я создал пользователя mysql с разрешениями на уровне таблиц.Отменить MySQL Привилегии больше не существуют Таблица

Эта таблица удаляется через некоторое время, но разрешение в mysql.table_priv все еще существует.

Есть ли способ (возможно, StoredProcedure) удалить все записи в mysql.table priv, которые ссылаются на не существующие таблицы?

Вот способ, чтобы воспроизвести его:

CREATE DATABASE test; 
USE test; 
CREATE TABLE test (Col1 INT(10)); 
GRANT SELECT ON test.test TO [email protected]'%' IDENTIFIED BY 'test'; 
DROP TABLE test; 


SELECT * FROM mysql.tables_priv WHERE user = 'test'; # 1 row 

Привет Andre

ответ

0

Вы можете использовать следующий запрос, чтобы найти все привилегии для пользователей на таблицы, которые больше не существуют:

SELECT tables_priv.* FROM mysql.tables_priv 
LEFT JOIN information_schema.tables ON (db=table_schema AND tables_priv.table_name=tables.table_name) 
WHERE tables.table_schema IS NULL; 

После этого вы можете использовать DELETE удалить привилегии:

DELETE mysql.tables_priv FROM mysql.tables_priv 
LEFT JOIN information_schema.tables 
    ON (db=table_schema AND tables_priv.table_name=tables.table_name) 
WHERE tables.table_schema IS NULL; 
FLUSH PRIVILEGES; 

Надеюсь, мне не нужно это говорить, но используйте с особой осторожностью.

0

Если пользователь также может быть удален вы можете использовать

DROP USER test

Если это не вариант Я думаю, вам нужно удалить соответствующие запросы от mysql.tables_priv. Для этого вам нужны правильные привилегии. И не забывайте очищать привилегии после изменения.

DELETE FROM mysql.tables_priv 
WHERE Table_name LIKE "test" 
    AND User Like "test" 
    AND Host LIKE "%" 
    AND Table_priv LIKE "Select"; 

FLUSH PRIVILEGES; 

В качестве альтернативы, вы можете использовать REVOKE Команда:

REVOKE 
    priv_type [(column_list)] 
    [, priv_type [(column_list)]] ... 
ON [object_type] priv_level 
FROM user [, user] ... 

Будьте осторожны в этой таблице!

+0

Я хочу сохранить пользователя так, чтобы ПОЛЬЗОВАТЕЛЬ DROP не был вариантом. У меня около 1000 пользователей mysql и не знаю, какие таблицы удалены за последний месяц. – Andre

+0

Я вижу. Ну, тогда вам, вероятно, нужна функция или процедура, которая очищает ее. – luksch

Смежные вопросы