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