如何仅授予特定行的MySQL权限

4
假设有一个学生表格
学生(id,姓名,城市)
我想创建一个用户A,并授予只能更新id为10的记录的权限。 CREATE USER A ;
GRANT UPDATE ON 学生 TO A WHERE 学生.id=10; 我尝试了这个方法,但它并没有起作用。

我在文档中找不到任何表明这是可能的内容。你怎么想到它的 - 你被分配了一些任务以限制问题所示的方式吗? - P.Salmon
1个回答

6

不是单独的一行数据,而是包含单独一行数据的视图,该视图将会更新实际的真实表格。

可以通过为每个学生创建特定的表视图来完成这个过程(是的,数据库结构可能会乱)。只允许此用户对视图进行选择/更新,并使主键不可被更新。当视图被更新时,主表将自动更新。

CREATE SCHEMA `example` ;

CREATE TABLE `example`.`student` (
      `id` INT NOT NULL,
      `name` VARCHAR(45) NULL,
      `email` VARCHAR(45) NULL,
      PRIMARY KEY (`id`));

INSERT INTO `example`.`student` (`id`, `name`, `email`) VALUES ('1', 'bob', 'bob@bob.com');


USE `example`;
CREATE 
     OR REPLACE SQL SECURITY DEFINER
VIEW `student_1` AS
    SELECT 
        `student`.`id` AS `id`,
        `student`.`name` AS `name`,
        `student`.`email` AS `email`
    FROM
        `student`
    WHERE
        (`student`.`id` = '1');

CREATE USER 'student_1_user'@'localhost' IDENTIFIED BY 'user_password';

    GRANT SELECT,UPDATE ON example.student_1 TO student_1_user@localhost IDENTIFIED BY 'user_password';

UPDATE example.student_1 SET email='newemail@bob.com'; // note no primary key needed or allowed

那很聪明,但是让我们明确一点——这不是良好的数据库实践,并且在多个用户方面它没有可扩展性。更好的方法是使用第二个用户和权限表来实现此类业务逻辑,并使用实际的业务逻辑。 - vy32
@vy32 完全同意!你能提供一个避免使用视图的答案吗?并将其合并到单个表中。也许使用触发器?这种粒度级别的安全性应该在应用程序而不是数据库级别实现。但是,每个人都有自己的想法! - Oliver Hale
1
这实际上不是一个实际的场景。我在大学里发现了一些关于此的问题。我已经到处搜索,以找到这种安全授权的解决方案。我认为这是我们可以做到的方式。意见会有所帮助。 - Shakthi Sachintha
2
https://mariadb.com/resources/blog/protect-your-data-row-level-security-in-mariadb-10-0/ - Georg Richter
这个问题本身实际上是一个没有共享解决方案的错误解决方案。 - Jacob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接