【问题标题】:how to grant MySQL privileges only to a specific row如何仅将 MySQL 权限授予特定行
【发布时间】:2020-05-18 09:05:19
【问题描述】:

假设有一个学生表
student(id,name,city)
我想创建一个用户 A 并仅授予更新 id=10 的记录的权限。

CREATE USER A ;
GRANT UPDATE ON student TO A WHERE student.id=10;

我试过了,但它不起作用。

【问题讨论】:

  • 我在文档中找不到任何表明这是可能的内容。是什么让您认为它是 - 您是否被设置了一些任务来限制问题所暗示的方式?

标签: mysql sql mariadb privileges


【解决方案1】:

不是单行,而是包含单行的视图,该行反过来会更新实际的真实表。

这可以通过每个学生的特定表视图来完成(是的,这将是一个混乱的数据库结构)。仅在仅选择/更新的情况下授予此用户对视图的访问权限,并且主键将不可更新。主表会在视图更新时自行更新。

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 完全同意!您能否提供避免使用视图的答案?并合并成一个表。也许使用触发器?这个级别的细粒度安全应该在应用程序而不是数据库级别实现。但是,嘿,每个人都有自己的!
  • 这实际上不是一个实际的场景。我在大学里发现了一些重新评分的问题。我已经搜索了所有地方以找到解决此类安全授予的方法。我认为这是我们可以做到的方式。意见会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 2013-01-27
  • 2020-10-23
  • 2010-10-20
  • 1970-01-01
相关资源
最近更新 更多