4

问题:

我怎样才能给新用户几乎所有的权限,但仍然保护一个或多个表/数据库不受它们的影响。

细节:

如果我有一个数据库,

  • life

还有三张桌子

  • passwords
  • friends
  • hobbies

如何授予该用户,例如,以下权限:

  • 插入
  • 更新
  • 删除
  • 创造
  • 降低
  • 改变

关于前三个,我将从以下内容开始:

GRANT INSERT, UPDATE, DELETE ON life.friends TO username@'localhost' IDENTIFIED BY 'password';
GRANT INSERT, UPDATE, DELETE ON life.hobbies TO username@'localhost' IDENTIFIED BY 'password';

但我对如何使用CREATEand感到困惑DROP。如果我像这样授予整个数据库的删除权限:

GRANT DROP ON life TO username@'localhost' IDENTIFIED BY 'password';

然后用户可以删除passwords我不想要的表。我可以改为根据如下表格授予它:

GRANT DROP ON life.friends TO username@'localhost' IDENTIFIED BY 'password';
GRANT DROP ON life.hobbies TO username@'localhost' IDENTIFIED BY 'password';

但是,如果我授予CREATE这样的权限会发生什么:

GRANT CREATE ON life TO username@'localhost' IDENTIFIED BY 'password';

这是否意味着用户甚至不能删除他/她创建的表?我的问题还与创建/删除数据库有关。如果我想允许用户创建和删除尽可能多的自己的数据库,而不是数据库,该life怎么办?

passwords我应该通过将表移动到另一个数据库来改变我的方法吗?

提前谢谢你。

4

1 回答 1

2

@TheScrumMeister 使用单独数据库的建议的替代方法是定义一个 wraps 的过程CREATE TABLE,但也授予调用用户对其的DROP权限:

DELIMITER ;;

CREATE PROCEDURE create_table(
  tbl_name VARCHAR(64) -- maximum length of a table name
) BEGIN
  DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
  START TRANSACTION;
    SET @usr = SUBSTRING_INDEX(USER(), '@', 1);  -- invoking username
    SET @tbl = REPLACE(tbl_name, "`", "``");     -- prevent SQL injection

    -- just create some dummy table initially - the user can modify it after
    SET @qry = CONCAT("
      CREATE TABLE `", @tbl, "` (
        id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
      );
    ");
    PREPARE stmt FROM  @qry;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

    -- now grant DROP to the invoking user but only from localhost
    SET @qry = CONCAT("
      GRANT DROP ON life.`", @tbl, "`
      TO CONCAT(?, \"@'localhost'\") IDENTIFIED BY 'password';
    ");
    PREPARE stmt FROM  @qry;
    EXECUTE stmt USING @usr;
    DEALLOCATE PREPARE stmt;

    -- clean up
    SET @qry = NULL;
    SET @usr = NULL;
  COMMIT;
END;;

DELIMITER ;

为了确保用户不会以任何其他方式创建表,他们不应该拥有该CREATE TABLE权限。

你也可以对数据库做类似的事情。

于 2012-04-30T16:23:32.787 回答