MySQL:如何进行行级安全性(如Oracle的虚拟专用数据库)?

时间:2011-04-03 02:10:05

标签: mysql database oracle database-design

假设我有销售各种产品的供应商。因此,在基本级别,我将使用以下表格:vendorproductvendor_product

如果vendor-1将Widget 1添加到product表,我只希望vendor-1看到该信息(因为该信息由vendor-1“拥有”)。供应商-2也是如此。假设vendor-2添加Widget 2,只有vendor-2应该看到该信息。

如果vendor-1尝试添加已由vendor-2输入的Widget 2,则不应在Widget 2表中创建product的重复条目。这意味着,不知何故,我需要知道vendor-2现在也“拥有”Widget 2

拥有一条信息的多个“所有者”的问题是如何处理所有者编辑/删除数据。也许供应商-1不再希望{/ 1}}可供他/她使用,但这不一定适用于供应商-2。

最后,我希望能够将(?)某些记录标记为“是的,我已经审查了这些数据并且它是正确的”,以便随后可供所有供应商使用。假设我将Widget 2标记为良好数据,现在所有供应商都应该看到该产品。

似乎解决方案是行级安全性。问题是我不太熟悉它的概念或如何在MySQL中实现它。任何帮助都非常感谢。感谢。

注意:此问题在此处有所讨论:Database Design: use composite key as FK, flag data for sharing?。当我问这个问题时,我不确定如何很好地表达这个问题。希望这次我能更好地解释我的问题。

3 个答案:

答案 0 :(得分:5)

Mysql本身不支持表上的行级安全性。但是,您可以使用视图来实现它。因此,只需在表上创建一个视图,该视图仅公开您希望给定客户端看到的行。然后,仅提供该客户端对这些视图的访问权限,而不是基础表。

请参阅http://www.sqlmaestro.com/resources/all/row_level_security_mysql/

答案 1 :(得分:1)

您已经建议了供应商,产品和vendor_product映射表。您希望供应商共享同一产品,如果他们都想使用它,但您不想要重复的产品。正确?

如果是,那么在标识产品的自然键上定义一个唯一的索引/约束(产品名称?)。

如果供应商添加了产品,但该产品不存在,请将其插入产品表,然后通过vendor_product表将其映射到该供应商。

如果产品已存在但已映射到其他供应商,请不要在产品表中插入任何内容,并添加将新供应商映射到现有产品的另一个映射行(以便现在将产品映射到两个供应商)

最后,当供应商删除产品而不是实际删除产品时,只需删除映射两者的vendor_product引用。最后,如果没有其他供应商仍在引用产品,则可以删除该产品。或者,您可以定期运行脚本,删除不再有供应商引用它们的所有产品。

最后,在产品表上有一个标记,说明您已经查看了产品,然后使用类似的东西来查询给定供应商可查看的产品(我们会说供应商ID为7):

select product.*
from product
left join vendor_map
on vendor_map.product_id = product.product_id
where vendor_map.vendor_id = 7
or product.reviewed = 1;

最后,如果某个产品由多个供应商所有,那么您可以禁止编辑,也可以在其中一个拥有供应商尝试编辑该产品时将其“拆分”为新的唯一产品,并允许他们编辑自己的产品副本。他们可能需要修改产品名称,除非你想出一些其他自然键来建立你的独特约束。

答案 2 :(得分:0)

这听起来我想要规范化您的数据。你拥有的是1(产品)到许多(供应商)的关系。对于大多数情况,这种关系是1:1而对于某些情况只有1:n并不重要我会说 - 一般来说它仍然是1:n因此你应该以这种方式设计你的数据库。基本布局可能是这样的:

Vendor Table
VendorId    VendorName    OtherVendorRelatedInformation

WidgetTable
WidgetId    WidgetName    WidgetFlag     CreatorVendor   OtherWidgetInformation

WidgetOwnerships
VendorId    WidgetId      OwnershipStatus     OtherInformation

更新:允许谁执行什么是业务问题的问题,因此您需要制定所有规则。在上面的结构中,您可以标记创建窗口小部件的供应商。在所有权中,您可以标记所有权的状态,例如

  • CreatorFullOwnership
  • SharedOwnership
  • ...

您必须根据业务规则制作标记,然后相应地设计业务逻辑和数据访问部分。