我一直在使用PostGresSQL作为我的一个应用程序的数据库。为了支持多租户,我对每个租户使用了模式和角色,以便在SQL注入的情况下限制访问并防止数据泄漏。我维护单个连接池,然后在确定租户上下文之后执行设置的角色,以便他只能访问自己的模式。这一切都运行得很好。然而,mySQL中的等效设计是什么呢?我看到mySQL没有“角色”,模式/数据库在概念上是相同的,我如何在mySQL中实现类似的东西?我这样问是因为我正在设计另一个应用程序,并且被告知要使用mySQL而不是PGSQL。
谢谢
发布于 2016-08-17 14:00:24
由于mysql没有角色的概念,您必须使用不同的mysql数据库用户和数据库来实现相同的数据逻辑分离。实际上,在确定上下文之后,您必须使用不同的myswl用户帐户和不同的默认数据库连接到mysql。缺点是,这种解决方案将使连接池变得惰性。幸运的是,在MySQL中建立到数据库的新连接很快,并且不需要太多资源。
或者,您可以使用单个数据库和mysql用户帐户,并在应用程序用户帐户级别上区分您的用户。显然,这意味着您的用户数据将不会像您当前拥有的那样具有相同的逻辑分隔,但您仍然可以使用连接池。
作为第三种选择,用户数量有限,您可以使用相同的mysql用户帐户和默认数据库连接到mysql,但将实际用户数据存储在单独的数据库中,只有使用单独的mysql用户帐户才能访问。但是,在默认数据库中,会为用户数据库中每个表创建单独的views。在create view语句中,将definer子句设置为可以访问存储表的给定数据库的mysql用户帐户,并将sql security子句设置为definer。通过这种方式,您仍然可以使用连接池,因为连接是使用到默认数据库的公共用户id建立的。客户端数据将在数据库中进行逻辑分离。缺点是,通过默认数据库中的视图,所有数据都将是可访问的,对底层数据结构的任何修改也必须反映在视图中。
https://stackoverflow.com/questions/38985974
复制相似问题