gpt4 book ai didi

mysql - 如何确保插入到 SQL View 中的行是该 View 的元素?

转载 作者:行者123 更新时间:2023-11-29 02:05:46 25 4
gpt4 key购买 nike

场景如下:

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

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

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

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

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

问题在于:每个商店都可以使用与自己的 StoreID 不匹配的 StoreID 将商品添加到此 View !通过这种方式,他们可以将商品添加到其他商店的库存中(这当然是不行的)。

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

最后一件事:只有数据库根帐户和个别商店可以访问个别商店的 View 。

最佳答案

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

根据 MySQL 文档 here ,

The WITH CHECK OPTION clause can be given for an updatable view to prevent inserts or updates to rows except those for which the WHERE clause in the select_statement is true. The WITH CHECK OPTION clause was implemented in MySQL 5.0.2.

In a WITH CHECK OPTION clause for an updatable view, the LOCAL and CASCADED keywords determine the scope of check testing when the view is defined in terms of another view. The LOCAL keyword restricts the CHECK OPTION only to the view being defined. CASCADED causes the checks for underlying views to be evaluated as well. When neither keyword is given, the default is CASCADED.

For more information about updatable views and the WITH CHECK OPTION clause, see Section 17.4.3, “Updatable and Insertable Views”.

关于mysql - 如何确保插入到 SQL View 中的行是该 View 的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6349116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com