【问题标题】:What is the best way to filter a multi-tenant MySQL database?过滤多租户 MySQL 数据库的最佳方法是什么?
【发布时间】:2012-05-26 11:42:20
【问题描述】:

在 MySQL 中,我有一个具有一个模式的单一数据库。在 Microsoft Sql Server 中,建议使用“租户视图过滤器”,因此在 Microsoft Sql Server 中,这正是我所需要的。

CREATE VIEW TenantEmployees AS 
SELECT * FROM Employees WHERE TenantID = SUSER_SID()

在 MySQL 中完成相同任务的最佳方法是什么?如果性能良好,等效于“租户视图过滤器”将起作用。

谢谢!!

【问题讨论】:

标签: mysql multi-tenant


【解决方案1】:

您建议的查询(我可以在MSDN 中找到)后面有文字,可以准确解释它的假设是什么。特别是,它提到它假定Employees 表中行的“所有者”在根据您要为其分区的用户的 SID 填充的 TenantID 字段中指定。

这意味着,只要您明确定义了数据的分区并确切地知道如何将其与您正在为其创建视图的表关联,您就可以以任何决定实现数据的方式复制相同的想法。

特别是,如果您将系统配置为每个分区使用自己的凭据访问数据库,则可以使用 MySQL 的 CURRENT_USERUSER 构造作为定义分区的 ID 和创建视图的查询与 MSDN 中建议的将SUSER_ID 替换为CURRENT_USER 基本相同。

但如果您使用同一个用户从所有分区进行访问,那么建议的方法在任一数据库服务器上都无关紧要。

【讨论】:

    【解决方案2】:

    由于您需要使用tenantId 值来执行过滤,因此表值用户定义函数将是理想的,因为视图通常不接受参数。不幸的是,不像许多其他数据库产品MySQL doesn't support table-valued functions。但是,有 MySQL hacks that claim to emulate parametrized views。这些可能对您有用。

    【讨论】:

      【解决方案3】:

      在MySQL中有点棘手,但可以做到:

      CREATE OR REPLACE VIEW {viewName}
          AS
              SELECT {fieldListWithoutTenantID}
              FROM {tableName}
              WHERE (id_tenant = SUBSTRING_INDEX(USER( ),'@',1))
      

      我写了一篇完整的博客文章,讲述了我如何在一个周末将单租户 MySQL 应用程序转换为多租户,并且只进行了最小的更改。 https://opensource.io/it/mysql-multi-tenant/

      【讨论】:

        猜你喜欢
        • 2011-03-28
        • 2020-08-02
        • 1970-01-01
        • 2019-04-23
        • 2011-02-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多