gpt4 book ai didi

mysql - 为除一个/几个表之外的所有表授予 [几乎] 所有 mySQL 权限

转载 作者:可可西里 更新时间:2023-11-01 07:37:47 26 4
gpt4 key购买 nike

问题:

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

详情:

如果我有一个数据库,

  • 生活

和三个表

  • 密码
  • friend
  • 爱好

我如何给这个用户,例如,以下权限:

  • 插入
  • 更新
  • 删除
  • 创建
  • 放弃
  • 改变

关于前三个,我会从这样的事情开始:

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';

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

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 表移动到另一个数据库来改变我的方法?

先谢谢你。

最佳答案

@TheScrumMeister 建议使用单独的数据库的替代方法是定义一个包装 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 权限。

您也可以为数据库做类似的事情。

关于mysql - 为除一个/几个表之外的所有表授予 [几乎] 所有 mySQL 权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10201913/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com