我一直在使用PostGresSQL作为我的某个应用程序的数据库。为了支持多租户,我为每个租户使用了模式和角色,以限制访问并防止SQL注入时数据泄漏。我正在维护一个连接池,然后在确定租户上下文后执行SET ROLE,这样他就只能访问自己的架构。这一切都运作良好。但是,mySQL中的等效设计是什么?我看到mySQL没有“角色”,架构/数据库在概念上是相同的,我怎样才能在mySQL中实现类似的东西?我问,因为我正在设计另一个应用程序,并被告知使用mySQL而不是PGSQL。
由于
答案 0 :(得分:1)
由于mysql没有角色的概念,你要么必须使用不同的mysql数据库用户和数据库来实现相同的逻辑分离数据。实际上,在确定上下文之后,您必须使用不同的myswl用户帐户和不同的默认数据库连接到mysql。缺点是该解决方案将使连接池变为惰性。幸运的是,在MySQL中建立与数据库的新连接很快,并且不需要太多资源。
或者,您可以使用单个数据库和mysql用户帐户,并在应用程序用户帐户级别上区分您的用户。显然,这意味着您的用户数据不会具有与当前相同的逻辑分隔,但您仍然可以使用连接池。
作为用户数量有限的第三种替代方案,您可以使用相同的mysql用户帐户和默认数据库连接到mysql,但将实际用户数据存储在只能使用单独的mysql用户帐户访问的单独数据库中。但是,在该默认数据库中,为用户数据库中的每个表创建单独的views。在create view语句中,将definer子句设置为mysql用户帐户,该用户帐户可以访问存储表的给定数据库,并将sql security子句设置为definer。这样,您仍然可以使用连接池,因为连接是使用普通用户ID连接到默认数据库。客户端数据将在数据库中以逻辑方式分隔。缺点是通过默认数据库中的视图可以访问所有数据,并且对底层数据结构的任何修改也必须反映在视图中。