创建视图 - WITH CHECK OPTION

时间:2011-05-26 11:20:22

标签: mysql sql views

我对MySQL中的check选项有几个问题:

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

2)LOCAL / CASCADED with check option之间有什么区别?

2 个答案:

答案 0 :(得分:4)

如果没有WITH CHECK OPTION,则更新(INSERT / UPDATE / MERGE / DELETE等)已查看的表将导致其基础基表更新,无论WHERE的{​​{1}}子句如何(假设DBMS认为视图是可更新的)。如果VIEWINSERT中的行不满足VIEW子句,则刷新WHERE新插入的行将不会在{{1}中显示}}。 VIEW会阻止这种“奇怪”的情况发生,但除此之外还有更多。

考虑创建VIEW以允许某个用户(用户组,应用程序等)仅查看表中行的子集,例如允许他们查看员工的数据,同时阻止他们查看执行员工的详细信息:撤消该用户对基表的读取权限,而是在视图上授予他们。 WITH CHECK OPTION允许您对写入权限执行相同的操作,在这种情况下,如果它会创建执行员工行,则会阻止VIEW查看视图。

可以使用类似的技术来强制执行“行级”约束,例如公司只能通过强制WITH CHECK OPTION通过INSERT INSERT VIEW只允许每个公司有一名员工。


  

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

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

WHERE

第二个插入失败,因为它会使公司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' ); 的总统数大于1,因此查询的'子查询'部分将导致新的总统从视图的结果集中删除,该交易有效回滚。

答案 1 :(得分:3)

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

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

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

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