授予MySQL视图更新权限(仅)

时间:2020-07-21 07:17:43

标签: mysql view

我在mysql中阅读了很多有关多租户结构的信息。因此,我尝试通过隐藏tenantId来测试解决方案。

例如,一个具有如下表: 表格:顺序(列:tenantId(VARCHAR),id(INT AutoInc),名称(VARCHAR),createdAt(DATETIME,TIMESTAMP ON CREATE))

然后我创建了一个名为“ USER_A1”的用户

类似的视图:

CREATE OR REPLACE VIEW order_view
  AS 
    SELECT id, name, createdAt
    FROM `order`
    WHERE tenantId = SUBSTRING_INDEX(SESSION_USER(), '@', 1);

也是触发器:

CREATE TRIGGER order_view_tenant_trigger 
     BEFORE INSERT ON `order`
        FOR EACH ROW 
            SET new.tenantId = SUBSTRING_INDEX(SESSION_USER(), '@', 1);

然后我为该用户设置权限

GRANT SELECT, UPDATE ON `my_schema`.`order_view` TO 'USER_A1'@'%' ;

因此,如果我与用户“ USER_A1”连接并且将“一切都插入”“ order_view”,我也可以SELECT * FROM order_view没问题,我只得到了tenantId的行。

但是(!)如果我尝试更新或删除该行,则会收到如下错误:

Error Code: 1143. SELECT command denied to user 'USER_A1'@'xxx.xxx.xxx.xxx' for column 'id' in table 'order_view'

所以我做了什么: 我检查了用户的喜好

SHOW GRANTS FOR 'USER_A1'@'%';

结果是:

GRANT SELECT, UPDATE ON `my_schema`.`order_view` TO 'USER_A1'@'%'

SELECT 
    table_name, 
    is_updatable
FROM
    information_schema.views
WHERE
    table_schema = 'my_schema';

结果:

order_view, YES

我还将mysql“ updatable_views_with_limit”的标志设置为“ 1”,也设置为“ 0”

我在gcloud托管mysql数据库。

引擎是innoDB

也许你们中的某人有一个主意?我真的不知道。

0 个答案:

没有答案