【问题标题】:How can I provide public access to a subset of a database?如何提供对数据库子集的公共访问?
【发布时间】:2011-05-26 19:15:05
【问题描述】:

背景

我和我的研究小组正在开发一个database 来存储我们的数据,我们正在构建一个software tool 来简化对这些数据的访问。该数据库将包含已发布且我们希望提供的数据,以及尚未发布且属于其他研究人员的数据。

目标

我们希望我们的工作能够轻松重现,在这种情况下,我们需要允许公众对数据运行 SELECT 语句。三种可能的解决方案包括:

  1. 为每个出版物创建一个可免费下载的数据库子集(可能在虚拟机中,以便满足软件工具的依赖关系)
  2. 为每个发布创建一个多对多查找表,将数据记录链接到发布,然后提供公共SELECT 访问这些记录的权限。我们可以轻松复制数据库以供公众使用 参数化模块 上一代的自动化

但是,有人告诉我,即使允许通配符语句也会损害安全性,这就是为什么我认为选项 1 更合理的原因。选项 1 还使我们能够将数据库存档,因为它与特定出版物一起使用。

更新: 澄清一下,我希望用户能够重现整个计算工作流程,这需要使用可以将数据表与辅助数据(如协变量、实验细节)连接起来的 SELECT 语句) 在查找表中。

问题

提供对数据库子集的公共访问的最佳方式是什么?

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    您可以将数据子集分发作为 SQLite 数据库,也就是说,创建一个独立的数据文件,人们可以将其下载到自己的计算机上。许多学者、经济学家等都使用 SQLite 来共享数据集,因为它是自包含的并且安装很轻松(我应该补充一下,跨平台)。

    【讨论】:

    • 听起来是个不错的解决方案;您能否提供一个示例,说明如何将 MySQL 数据库的子集重现为 SQLite 数据库?
    • 笨拙但久经考验:为要导出的表子集创建视图;以 CSV 格式导出视图;将导出的 CSV 文件导入 SQLite。
    • @David:编写一个小程序(Python 是一种很好的语言)从现有的 MySQL 安装中提取记录,然后将它们重新插入到 SQLite 容器中,然后运行它每次需要导出新数据集的小程序。
    【解决方案2】:

    创建具有适当访问权限的视图,以及只能访问这些视图但不能访问基础表的用户。

    【讨论】:

    • @Mchi 我希望用户能够使用与我相同的软件复制整个分析。
    • 好的...所以名称与实际表不同的视图不允许这样做。所以我猜选项 1 会是这里最好的选项。
    • 用于内部或私有应用程序的数据库服务器在理想情况下不应被 Internet 上的主机节点访问。如果它们是可访问的,则应该仅在需要加密连接和强身份验证时使用。否则,这是一个很大的攻击向量:如果数据库软件有缓冲区溢出或(lol)堆栈溢出错误,使远程攻击者能够执行任意代码——或更糟,会发生什么?此外,最好将私有和公共内容放在不同的系统上,以便监控资源和带宽使用情况并保持隔离。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多