假设我们有一个在mysql上运行的公共DNA数据库。数据库仅包含完整数据。在这种情况下,一些特殊用户希望将实验数据添加到数据库中,这可能不完整,或者他们不希望每个人都可以看到它。相反,他们希望实验数据仅对具有正确权限的用户可见。你会采取什么方法来实现这一目标?
答案 0 :(得分:1)
据推测,这些数据集很大,性能很重要。这意味着特权系统应该尽可能粗糙。
如果我这样做,我会创建一个" public"数据库,并使用MySQL GRANT命令允许访客用户在该数据库上进行SELECT。
例如:
CREATE USER 'guest'@'%' IDENTIFIED BY 'changethispassword';
GRANT SELECT ON public.* TO 'guest'@'%';
然后,对于非公共数据集,我将它们放入其他数据库中,并对用户GRANTed权限更具选择性。例如,这些GRANT为两个不同的用户提供对私人信息和公共信息的访问权。
CREATE USER 'venter'@'%' IDENTIFIED BY 'changethispassword';
GRANT SELECT ON public.* TO 'venter'@'%';
GRANT SELECT ON celera.* TO 'venter'@'%';
CREATE USER 'collins'@'%' IDENTIFIED BY 'changethispassword';
GRANT SELECT ON public.* TO 'collins'@'%';
GRANT SELECT ON hgp.* TO 'collins'@'%';
拥有SELECT权限的用户,比如public
数据库和celera
数据库,可以发出这样的查询,允许私有和公共数据的无缝(如果不是最佳表现)合并。
SELECT whatever
FROM public.AGCT
UNION ALL
SELECT whatever
FROM celera.AGCT
当然,结合这些数据集必须具有科学意义。那可能是也可能不是。
不要对创建多个数据库的想法感到震惊。它们实际上并不比计算机文件系统中的目录复杂。单个服务器可以毫无问题地提供数十个服务器。
MySQL绝对取决于这种安全性。托管服务提供商经常运行多租户服务器。
答案 1 :(得分:0)
我会考虑使用MariaDB(由MySQL的创始人编写的MySQL兼容数据库)而不是MySQL,因为它支持roles。
它们都不像Oracle那样支持Row Security,但您可以通过添加“owner”列来模仿它,该列包含可以选择/更新行的角色名称。
添加WITH CHECK OPTION视图,该视图检查current_user是否在该列中指定的角色中。
添加触发器以正确设置所有者值。
更新:如果您无法更改表格但可以添加新表格,请添加与原始表格相同的新密钥,并添加所有者列,并加入视图中的表格。
见
http://www.sqlmaestro.com/resources/all/row_level_security_mysql/