本节书摘来自异步社区出版社《视图更新与关系数据库理论》一书中的第1章,第1.5节,作者:【美】c.j. date(达特),更多章节内容可以访问云栖社区“异步社区”公众号查看。
现在我们假设用户只能看到视图ls(而不是视图nls和基表s)。可以想见这个用户仍然希望可以将视图ls当作基表一样操作。当然,这个用户知道表的语义。
ls:供应商sno是已经签约的,名称为sname,状态值为status且位于城市city中(london)。
并且了解如下约束。
{sno}是ls的键。
ls中的每一行city值为london。
很明显,这个用户无法向这个表插入新行,也不能更新表中的供应商编码,因为这样的操作很可能违反约束规则,而用户并不知道这些约束(必须不知道)[7]。但是如果ls是一个基表,那么用户完全可以插入新行。否则,这张表将永远是空的!那么,前面所说的事情不就违背“可交换性原则”了吗?
事实并非如此。尽管这个特定的用户不被允许向这个表插入新行,但并不是所有用户都不可以。这个用户不能插入新行到ls的基本原因是他只是管中窥豹,无法看到全局。对比来看,我们在上一部分所讲的用户可以同时看到ls和nls,它们合起来等价于表s,因此该用户相当于能够看到全局,也由此他就可以向ls(和/或是nls)插入新行。但是只能看到ls的用户等于只能看到一部分信息,所以一些特定操作是不允许他执行的。
最后,值得指出的是即便我们遇到的数据格式都是基表,用户也会遇到类似的情况。也就是说,即使涉及的表都是基表,有时某些用户也会被禁止在某些特定的表上执行某些特定的更新。举个例子,让我们想想只能看到基表sp,但是看不到基表s的用户。他会和只能看到表ls的用户一样,无法执行插入操作,因为这样的操作同样可能违反用户并不知道的(必须不知道)约束规则,这个约束就是从sp到表s和p的外键约束。