Подтвердить что ты не робот

MySQL предоставляет все привилегии для базы данных, кроме одной таблицы

Я не смог найти разумное решение для достижения следующего:

Я хочу иметь пользователя, у которого есть ВСЕ-привилегии в базе данных (или серии баз данных с той же схемой), кроме для одной таблицы, к которой у них будут только привилегии SELECT.

По сути, я хочу, чтобы пользователь имел свободное владение над базой данных, но не мог обновлять определенную таблицу.

До сих пор я пытался, безрезультатно:

  • Предоставление всех привилегий в этой базе данных (db_name. *), а затем предоставление только привилегий выбора в этой желаемой таблице (надеясь, что она перепишет "все", глупо, я знаю).

  • Предоставление всех привилегий в этой базе данных (db_name. *), а затем аннулирование вставки, обновления и удаления. Но это вызвало ошибку, говоря, что для db_name.table_name не было правила предоставления.

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

Пожалуйста, скажите мне, что есть более простой способ

Примечание. Я запускаю MySQL 5.1. Последняя версия доступна на Ubuntu 10.04.

4b9b3361

Ответ 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;