如何确保插入SQL视图的行将成为该视图的元素?

时间:2011-06-14 19:42:47

标签: mysql sql view triggers

以下是该方案:

我有一个简单的'库存'表。此表有三列:一个引用产品的外键,一个引用商店的外键,以及一个价格的数值。此表未指定可用产品的数量,它仅用于通知用户商店销售特定产品。

此库存表是可公开查看的(这是应用程序的全部要点:用户应该能够在各种可能不相关的商店之间搜索不同的产品)。商店需要能够更新自己的库存,而不会影响其他商店的库存。

现在,每个商店都有自己的用户帐户和视图。视图基本上设置如下:

CREATE VIEW MY_INVENTORY AS SELECT I.ProductID, I.StoreID, I.Price FROM Inventory I WHERE I.StoreID = id

每个商店都拥有自己的库存视图的完全权限,因此每个商店都可以向其库存添加商品,更新商品等。

以下是障碍:每个商店都可以使用与自己的StoreID不匹配的StoreID向此视图添加商品!通过这种方式,他们可以将商品添加到其他商店的库存中(这肯定是禁忌)。

我已经创建了一个用于访问数据库的前端应用程序,并且很容易以编程方式确保没有商店影响其他商店库存,但我想要更好的安全性。如何在数据库级别强制执行此操作?触发器?约束?我已经调查了两者,我不确定如何解决这个问题。

最后一件事:只有数据库根帐户和个别商店才能访问各个商店的视图。

2 个答案:

答案 0 :(得分:3)

我认为您可以通过使用WITH CHECK OPTION子句创建视图来获得所需内容。这将阻止任何人使用视图插入与视图的Where子句不匹配的信息,因此如果商店的视图是“Where StoreID = 500”,则它不能使用该视图插入商店501的记录。

根据MySQL文档here

  

可以为可更新视图提供WITH CHECK OPTION子句,以防止插入或更新行,但select_statement中WHERE子句为true的行除外。 WITH CHECK OPTION子句在MySQL 5.0.2中实现。

     

在可更新视图的WITH CHECK OPTION子句中,LOCAL和CASCADED关键字在根据另一个视图定义视图时确定检查测试的范围。 LOCAL关键字仅将CHECK OPTION限制为正在定义的视图。 CASCADED也会对基础视图的检查进行评估。如果没有给出关键字,则默认为CASCADED。

     

有关可更新视图和WITH CHECK OPTION子句的更多信息,请参见第17.4.3节“可更新和可插入视图”。

答案 1 :(得分:0)

您无法在数据库级别强制执行此操作;您可能必须在服务器端强制执行此操作,可能是通过检查脚本级别(PHP,Python,无论如何),可能添加的条目的商店ID与分配给用户的商店ID匹配。