在MySQL中,我有一个带有一个模式的数据库。在Microsoft Sql Server中,建议使用“租户视图过滤器”,因此在Microsoft Sql Server中,这正是我所需要的。
CREATE VIEW TenantEmployees AS
SELECT * FROM Employees WHERE TenantID = SUSER_SID()
在MySQL中实现相同目标的最佳方法是什么?如果表现良好,则相当于“租户视图过滤器”将起作用。
谢谢!
答案 0 :(得分:2)
您建议的查询(我可以在MSDN中查找)之后的文本会解释其确切的假设。特别是,它提到它假定Employees
表中行的“所有者”是在根据您正在分区的用户的SID填充的TenantID
字段中指定的。对
这意味着只要您有明确定义的数据分区并确切知道如何将其与创建视图的表相关联,您就可以以任何方式复制相同的想法。
特别是,如果您配置系统以便每个分区都使用自己的凭据访问数据库,则可以使用MySQL的CURRENT_USER
或USER
结构作为定义分区和查询的ID创建视图与使用SUSER_ID
替换CURRENT_USER
的MSDN中建议的视图基本相同。
但是如果您使用相同的用户从所有分区访问,那么建议的方法在任一数据库服务器上都无关紧要。
答案 1 :(得分:0)
由于您需要使用tenantId
值来执行过滤,因此表值用户定义的函数将是理想的,因为视图通常不接受参数。不幸的是,与许多其他数据库产品MySQL doesn't support table-valued functions不同。但是,有MySQL hacks that claim to emulate parametrized views。这些可能对你有用。
答案 2 :(得分:0)
在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/