mySQL 中的 postgres 模式和角色

postgres schemas and roles in mySQL

我一直在使用 PostGresSQL 作为我的一个应用程序的数据库。为了支持多租户,我为每个租户使用了架构和角色,以便在 SQL 注入时限制访问并防止数据泄漏。我正在维护一个连接池,然后在确定租户上下文后执行 SET ROLE,以便他只能访问他自己的模式。这一切都很好。但是, mySQL 中的等效设计是什么?我看到 mySQL 没有 "roles" 并且模式/数据库在概念上是相同的,我怎样才能在 mySQL 中实现类似的东西?我问是因为我正在设计另一个应用程序并且被告知使用 mySQL 而不是 PGSQL。

谢谢

由于mysql没有角色的概念,你要么使用不同的mysql数据库用户和数据库来实现相同的数据逻辑分离。实际上,在确定上下文后,您必须使用不同的 myswl 用户帐户和不同的默认数据库连接到 mysql。缺点是此解决方案会使连接池变得惰性。幸运的是,在 MySQL 中建立与数据库的新连接很快并且不需要太多资源。

或者,您可以使用单个数据库和 mysql 用户帐户,并在应用程序用户帐户级别区分您的用户。显然,这意味着您的用户数据将不会像您当前那样具有相同的逻辑分离,但您仍然可以使用连接池。

作为用户数量有限的第三种选择,您可以使用相同的 mysql 用户帐户和默认数据库连接到 mysql,但将实际用户数据存储在单独的数据库中,只能使用单独的访问mysql 个用户帐户。但是,在该默认数据库中,为用户数据库中的每个 table 创建单独的 views。在创建视图语句中,将定义器子句设置为可以访问存储 table 的给定数据库的 mysql 用户帐户,并将 sql 安全子句设置为定义器。这样您仍然可以使用连接池,因为连接是使用公共用户 ID 与默认数据库建立的。客户端数据将在数据库中逻辑分离。缺点是通过默认数据库中的视图可以访问所有数据,并且对底层数据结构的任何修改也必须反映在视图中。