问题描述
|
关于MysqL中的check选项,我有几个问题:
1)我知道
with check option
不会在用于定义视图的子选择查询中添加不满足WHERE
子句的记录,但是如果未选择with check option
会发生什么呢?为什么要添加不满足WHERE
子句的行?
2)LOCAL
/CASCADED
the0ѭ有什么区别?
解决方法
执行UPDATE时,请多考虑一下。当您对基表执行UPDATE并随后执行SELECT时,刚刚更新的行仍然存在。
现在想象一下一个视图,该视图根据ID在2到5之间的值从基表中选择行,然后用户运行以下查询:
SELECT * from View
UPDATE View set ID = ID + 3
SELECT * from View
现在,突然之间,行已消失。
,如果没有WITH CHECK OPTION
,则更新(INSERT
/UPDATE
/MERGE
/DELETE
等)被查看的表将导致其基础表被更新,而与VIEW
的WHERE
子句无关(假定DBMS认为视图是可更新的)。如果您在不符合WHERE
子句的ѭ14中将INSERT
行,然后刷新VIEW
,则在VIEW
中将看不到新插入的行。 ѭ8可以防止这种“奇数”情况的发生,但除此之外,还不止如此。
考虑创建一个“ 14”,以允许某个用户(用户组,应用程序等)仅查看表中某行的子集,例如为了允许他们查看员工的数据同时又阻止他们查看执行员工的详细信息:撤消该用户在基表上的读取特权,而是在视图上授予他们。 WITH CHECK OPTION
允许您对写特权执行相同的操作,在这种情况下,如果创建高管雇员行,则会阻止an9ѭ进入视图。
可以使用类似的技术来强制执行“行级”约束,例如一家公司只能由一位主席通过“ 14”来强迫“ 9”,而“ 1”条款只允许每家公司一名员工。
您如何定义“公司只能有一位总裁”的条件
这是使用标准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
的总裁总数大于一,因此查询的“子查询”部分将导致新总裁从视图的结果集中删除,并且交易有效地回滚。