38

以下を達成するための合理的な解決策を見つけることができませんでした:

SELECT 権限のみを持つ 1 つのテーブルを除いて、データベース (または同じスキーマを持つ一連のデータベース) に対するすべての権限を持つユーザーが必要です。

基本的に、ユーザーがデータベースを自由に管理できるようにしたいのですが、特定のテーブルを更新できないようにしたいと考えています。

これまでのところ、私は試してみましたが、役に立ちませんでした:

  • そのデータベース(db_name.*)に対するすべての権限を付与し、次に、その目的のテーブルに対する選択権限のみを明確に付与します(「すべて」を上書きすることを望んでいます、ばかげています)。

  • そのデータベース (db_name.*) に対するすべての特権を付与してから、挿入、更新、および削除を取り消します。しかし、これにより、db_name.table_name に対する付与ルールがないというエラーが発生しました。

私が収集できたものから、読み取り専用テーブルを除くデータベースの各テーブルに対するすべての権限を個別に付与する必要があります。

もっと簡単な方法があると誰か教えてください

:MySQL 5.1を実行しています。Ubuntu 10.04 で利用可能な最新のもの。

4

4 に答える 4

7

私の知る限り、はい、テーブルごとに個別に付与する必要があります。でもねえ、あなたはそこにコンピューターを持っています。コンピューターは繰り返しの作業を自動化するのに優れているので、次のことを行うスクリプトを作成してみてはいかがでしょうか。

  1. データベース内のすべてのテーブルのリストを取得する ( SHOW TABLES;)
  2. リストの項目ごとに、すべての権限を付与します
  3. 特別なテーブルに対する権限を取り消す

または、次のようにします。 2. リストの各項目について、それが特別なテーブルかどうかを確認します。そうでない場合は、すべての権限を付与します

コードを提供しない理由は、MySQL 機能を備えた任意のスクリプト言語、シェル スクリプトでも実行できるからです。最も快適に使用できるものを使用してください。

于 2011-06-09T05:57:08.893 に答える
2

以下は、MariaDB でロールを付与するために使用するもののドラフトです。EVENTを設定すると、よりクールになるかもしれません:-)

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;
于 2016-03-05T19:39:54.070 に答える