【发布时间】:2011-03-21 22:11:36
【问题描述】:
我正在构建一个包含公共、私人(仅限于内部)和机密数据(仅限于极少数)的数据库。它有非常具体的要求,即在数据库端管理数据的安全性,但是我在一个我无法直接控制权限的环境中工作,并且更改它们的请求会很耗时(2-3天)。
所以我创建了一个结构,可以满足我们的需求,而无需大量许可。我在同一台服务器上创建了两个数据库,一个是内部数据库,谁的表只能由我们网络某些子网中的某些用户编辑。第二个是公共数据库,使用管理员帐户,我创建仅限于内部数据库中表的公共字段的视图以公开公共数据,它似乎运行良好。但是,数据只能以一种方式流动,并且视图不应该能够写入源表。而且我不能将公共数据库锁定为只能选择,因为公共数据库用于我们公共网站的各种任务。
所以我需要创建视图来限制某些脚本对表中某些字段的访问。我需要确保这些视图无法在源表中插入、更新或删除数据。要创建我使用的视图:
CREATE ALGORITHM = UNDEFINED
VIEW `table_view` AS
SELECT *
FROM `table`
查看文档以防止更新视图需要具有聚合数据、WHERE 子句中的子查询和 ALGORITHM = TEMPTABLE。我会选择 TEMPTABLE,但手册不清楚它是否会影响性能。在一段the manual 中说:
它更喜欢 MERGE 而不是 TEMPTABLE 如果 可能的,因为 MERGE 通常是 更高效
然后立即声明:
选择 TEMPTABLE 的理由 明确的是锁可以 之后在基础表上发布 临时表已创建 在它被用来完成之前 处理语句。这有可能 导致更快的锁定释放比 MERGE 算法使其他 使用视图的客户不是 一直被屏蔽。
将在页面加载时查询视图以生成页面内容,MERGE 是否仍然是more efficient 或者较低的锁定时间会更好地为我服务?不,通过帐户权限处理这个问题并不是一个真正的选择,因为无法授予个别字段的权限以满足法律保密要求。为了满足这些要求,需要将每个表分成 2-3 个表,其中包含具有同质机密性的字段。
算法应该是 UNDEFINED 还是 TEMPTABLE,或者视图定义中是否有另一个设置会锁定视图。以及我将体验到的性能效果是什么。另外,如果我做一些事情来强制它不可编辑,比如包含 HAVING 1 以使其成为聚合函数,则会强制它成为 TEMPTABLE 并且算法的选择没有实际意义。
【问题讨论】:
标签: mysql locking readonly temp-tables