我在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
也许你们中的某人有一个主意?我真的不知道。