微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

| 这是场景: 我有一个简单的“库存”表。该表有三列:一个外键引用产品,一个外键引用商店,以及一个价格数字。该表未指定可用产品的数量,仅用于通知用户商店出售特定产品。 此库存表是可公开查看的(这是应用程序的重点:用户应该能够在各种(可能不相关的)商店中搜索不同的产品)。商店需要能够更新自己的库存,而不影响其他商店的库存。 现在,每个商店都有其自己的用户帐户和视图。这些视图基本上设置如下:
CREATE VIEW MY_INVENTORY AS SELECT I.ProductID,I.StoreID,I.Price FROM Inventory I WHERE I.StoreID = id
每个商店都拥有自己的库存视图的完全权限,因此每个商店都可以向其库存中添加商品,更新商品等。 缺点:每个商店都可以使用与其自己的StoreID不匹配的StoreID向该视图添加商品!这样,他们可以将商品添加到其他商店的库存中(这肯定是禁忌)。 我已经创建了一个用于访问数据库的前端应用程序,并且可以很容易地以编程方式确保没有任何商店影响其他商店的库存,但是我想要的安全性比这更好。如何在数据库级别执行此操作?触发器?约束?我已经研究了两者,但我不确定该如何进行。 最后一件事:只有数据库root帐户和各个商店都可以访问各个商店的视图。     

解决方法

        我认为您可以通过使用
WITH CHECK OPTION
子句创建视图来获得所需的内容。这将防止任何人使用该视图插入与该视图的Where子句不匹配的信息,因此,如果商店的视图用于\“ Where StoreID = 500 \”,则它不能使用该视图插入记录。用于商店501。 根据此处的MySQL文档,   可以为可更新视图提供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节“可更新和可插入视图”。     ,        您不能在数据库级别强制执行此操作。您可能必须在服务器端强制执行此操作,可能需要在脚本级别(PHP,Python等)进行检查,以确保可能添加的条目的商店ID与分配给用户的商店ID相匹配。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。