在 MySQL 中,我有一个具有一个模式的数据库。在 Microsoft Sql Server 中,建议使用“租户视图过滤器”,因此在 Microsoft Sql Server 中,这正是我所需要的。
CREATE VIEW TenantEmployees AS
SELECT * FROM Employees WHERE TenantID = SUSER_SID()
在 MySQL 中完成相同任务的最佳方法是什么?如果性能良好,等效于“租户视图过滤器”将起作用。
谢谢!!
在 MySQL 中,我有一个具有一个模式的数据库。在 Microsoft Sql Server 中,建议使用“租户视图过滤器”,因此在 Microsoft Sql Server 中,这正是我所需要的。
CREATE VIEW TenantEmployees AS
SELECT * FROM Employees WHERE TenantID = SUSER_SID()
在 MySQL 中完成相同任务的最佳方法是什么?如果性能良好,等效于“租户视图过滤器”将起作用。
谢谢!!
您建议的查询(我可以在MSDN中找到)之后有文本,可以准确解释它的假设是什么。特别是,它提到它假设表中行的“所有者”是在根据您为其分区的用户的 SID 填充Employees
的字段中指定的。TenantID
这意味着您可以复制相同的想法,无论您决定以何种方式实现数据,只要您已明确定义数据分区并确切知道如何将其与您正在为其创建视图的表相关联。
特别是,如果您将系统配置为每个分区使用自己的凭据访问数据库,您可以使用 MySQL 的CURRENT_USER
orUSER
结构作为定义分区的 ID,并且创建视图的查询将与建议的基本相同在 MSDN 中替换SUSER_ID
为CURRENT_USER
.
但是,如果您使用同一用户从所有分区进行访问,那么建议的方法在任一数据库服务器上都无关紧要。
由于您需要使用您的tenantId
值来执行过滤,因此表值用户定义函数将是理想的,因为视图通常不接受参数。不幸的是,与许多其他数据库产品不同,MySQL 不支持表值函数。但是,有一些声称可以模拟参数化视图的 MySQL hack。这些可能对你有用。
这在 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/