MySQL предоставляет все привилегии для базы данных, кроме одной таблицы
Я не смог найти разумное решение для достижения следующего:
Я хочу иметь пользователя, у которого есть ВСЕ-привилегии в базе данных (или серии баз данных с той же схемой), кроме для одной таблицы, к которой у них будут только привилегии SELECT.
По сути, я хочу, чтобы пользователь имел свободное владение над базой данных, но не мог обновлять определенную таблицу.
До сих пор я пытался, безрезультатно:
-
Предоставление всех привилегий в этой базе данных (db_name. *), а затем предоставление только привилегий выбора в этой желаемой таблице (надеясь, что она перепишет "все", глупо, я знаю).
-
Предоставление всех привилегий в этой базе данных (db_name. *), а затем аннулирование вставки, обновления и удаления. Но это вызвало ошибку, говоря, что для db_name.table_name не было правила предоставления.
Из того, что я смог собрать, мне придется индивидуально предоставлять все привилегии для каждой таблицы базы данных, кроме таблицы только для чтения.
Пожалуйста, скажите мне, что есть более простой способ
Примечание. Я запускаю MySQL 5.1. Последняя версия доступна на Ubuntu 10.04.
Ответы
Ответ 1
Я знаю, что это старый пост, но я думал, что добавлю к вопросу @tdammers, чтобы другие видели. Вы также можете выполнить SELECT CONCAT на файлах information_schema.t для создания ваших команд гранта и не писать отдельный script.
Сначала отмените все привилегии от этого db:
REVOKE ALL PRIVILEGES ON db.* FROM [email protected];
Затем создайте свои заявления GRANT:
SELECT CONCAT("GRANT UPDATE ON db.", table_name, " TO [email protected];")
FROM information_schema.TABLES
WHERE table_schema = "YourDB" AND table_name <> "table_to_skip";
Скопируйте и вставьте результаты в свой клиент MySQL и запустите их все.
Ответ 2
AFAIK, да, вам нужно предоставлять индивидуально за стол. Но эй, у тебя есть компьютер. Компьютеры отлично подходят для автоматизации повторяющихся задач для вас, так почему бы вам не сделать script, который делает следующее:
- Получить список всех таблиц в базе данных (
SHOW TABLES;
)
- Для каждого элемента списка укажите все разрешения
- Отменить разрешения для специальной таблицы
Или, альтернативно:
2. Для каждого элемента в списке проверьте, является ли он специальной таблицей; если это не так, укажите все разрешения
Причина, по которой я не даю код, заключается в том, что это можно сделать на любом языке сценариев с возможностями MySQL, даже shell script; используйте то, что вам наиболее удобно использовать.
Ответ 3
Вот проект того, что я использую для предоставления ролей в MariaDB.
Возможно, создание СОБЫТИЯ сделало бы его более прохладным: -)
DELIMITER $$
DROP PROCEDURE IF EXISTS refreshRoles $$
CREATE PROCEDURE refreshRoles ()
COMMENT 'Grant SELECT on new databases/tables, revoke on deleted'
BEGIN
DECLARE done BOOL;
DECLARE db VARCHAR(128);
DECLARE tb VARCHAR(128);
DECLARE rl VARCHAR(128);
DECLARE tables CURSOR FOR
SELECT table_schema, table_name, '_bob_live_sg' FROM information_schema.tables
WHERE table_schema LIKE '%bob\_live\_sg' AND
( false
OR table_name LIKE 'bundle%'
OR table_name LIKE 'cart%'
OR table_name LIKE 'catalog%'
OR table_name LIKE 'url%'
);
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=true;
CREATE ROLE IF NOT EXISTS '_bob_live_sg';
REVOKE ALL, GRANT OPTION FROM '_bob_live_sg';
OPEN tables;
SET done = false;
grant_loop: LOOP
FETCH tables INTO db, tb, rl;
IF done THEN
LEAVE grant_loop;
END IF;
SET @g = CONCAT('GRANT SELECT ON `', db, '`.`', tb, '` TO ', rl);
PREPARE g FROM @g;
EXECUTE g;
DEALLOCATE PREPARE g;
END LOOP;
CLOSE tables;
END $$
DELIMITER ;
CALL refreshRoles;