创建了一个视图,但之后失去了对底层 table 的特权

Created a view but lost privilege to underlying table afterwards

假设有一个关系 Table(A, B, C) 并且我被授予了它的所有权限。我创建了一个视图 V(A) 查看 Table 的 A。然后,如果我从 Table 中撤消了所有权限,那么视图到底发生了什么?

据我了解,视图是调用时 table(如果未具体化)的动态创建抽象。由于我对底层 table 没有任何特权,因此我无法调用视图 V,它需要对底层 table 的 SELECT 特权。因此,该视图实质上已从系统中删除。

我的理解对吗?如果视图被具体化会怎样?

不,这不完全正确。但是请注意,所有 rdbms 的安全模型都不同。由于您只将 mysql 放入标签列表,因此我的回答将是 mysql 具体的。

在 mysql 中,您可以使用 create view 语句中的 SQL SECURITY 选项为视图定义安全模型。这可以设置为 DEFINER(定义视图的用户)或 INVOKER(执行视图的用户)。如果它设置为 definer,那么 mysql 将检查定义视图的用户的访问权限,而不是执行它的用户的访问权限。如果你有超级权限,那么你可以使用任何用户帐户作为定义者,而不仅仅是你自己的。

Mysql 检查定义者或调用者(基于设置)在引用视图时是否有权访问底层对象。如果视图使用定义器选项并且定义器可以访问底层对象而您没有,视图仍会为您提供结果。

有关详细信息,请参阅 mysql 文档中的 access control for views

话虽这么说,如果您碰巧有 mysql v5.0.15 或更早版本,那么对底层对象的访问权限只会检查一次:在视图定义时。

注意:mysql不支持物化视图。