创建视图 - WITH CHECK OPTION

Posted

技术标签:

【中文标题】创建视图 - WITH CHECK OPTION【英文标题】:Creating Views - WITH CHECK OPTION 【发布时间】:2011-05-26 11:20:22 【问题描述】:

我有几个关于 mysql 中的检查选项的问题:

1) 我知道with check option 不会在用于定义视图的子选择查询中添加不满足WHERE 子句的记录,但是如果不选择with check option 会发生什么?为什么要添加不满足WHERE 子句的行?

2)LOCAL/CASCADEDwith check option有什么区别?

【问题讨论】:

您使用的是哪个服务器? MSSQL、PostgreSQL、甲骨文? 【参考方案1】:

如果没有WITH CHECK OPTION,更新(INSERT/UPDATE/MERGE/DELETE 等)已查看的表将导致其基础基表被更新,而不管@ 的WHERE 子句如何987654327@(假设 DBMS 认为视图是可更新的)。如果您将INSERT 一行插入不满足WHERE 子句的VIEW,则刷新VIEW,则新插入的行将在VIEW 中不可见。 WITH CHECK OPTION 可以防止这种“奇怪”的情况发生,但不止于此。

考虑创建一个VIEW 以允许特定用户(用户组、应用程序等)仅查看表中的一部分行,例如允许他们查看员工的数据,同时阻止他们查看高管员工的详细信息:撤销此用户对基表的读取权限,而是授予他们查看视图的权限。 WITH CHECK OPTION 允许您对写入权限执行相同操作,在这种情况下,如果 INSERT 创建行政雇员行,它将阻止查看视图。

类似的技术可用于强制执行“行级”约束,例如通过VIEW 强制INSERTWHERE 子句仅允许每家公司一名员工,公司只能拥有一名总裁。


如何定义“一家公司只能有一位总裁”的条件

这是一个使用标准 SQL 的简单示例(无 FK 等):

CREATE TABLE Employees
( company_id CHAR(8) NOT NULL,
  employee CHAR(10) NOT NULL UNIQUE,
  job_title VARCHAR(20) NOT NULL );

 CREATE VIEW Presidents
 AS
 SELECT *
   FROM Employees
  WHERE job_title = 'president'
    AND 1 >= ( SELECT COUNT(*)
                 FROM Employees e
                WHERE e.job_title = 'president'
                GROUP
                   BY e.company_id )
WITH CHECK OPTION;

INSERT INTO Employees VALUES ( 'Acme', '1', 'president' );
INSERT INTO Employees VALUES ( 'Acme', '2', 'president' );

第二次插入失败,因为它会使公司 Acme 的总裁计数大于 1,因此查询的“子查询”部分会导致新总裁从视图的结果集和事务中删除有效回滚。

【讨论】:

你能举一个你在上一段所说的例子吗?可更新视图有一些限制,即没有 group byhavingaggrgate function 等。那么如何定义“一家公司只能有一位总裁”的条件呢?【参考方案2】:

在执行 UPDATE 时多考虑一下。当您对基表执行 UPDATE 并随后执行 SELECT 时,您刚刚更新的行仍然存在。

现在想象一个视图,它根据 ID 介于 2 和 5 之间从基表中选择行,并且用户运行这些查询:

SELECT * from View
UPDATE View set ID = ID + 3
SELECT * from View

现在,突然间,行消失了。

【讨论】:

以上是关于创建视图 - WITH CHECK OPTION的主要内容,如果未能解决你的问题,请参考以下文章

通过创建视图绕过表特权和 WITH GRANT OPTION

我正在从视图中删除 with check 选项约束,但它没有被强制执行

JOOQ:使用 WITH 子句创建子查询(使用纯 SQL)

with admin option和with grant option的区别

with admin option和with grant option的用法

oracle授权时“with admin option”与“with grant option”的区别