创建视图 - 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
/CASCADED
with 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
强制INSERT
其WHERE
子句仅允许每家公司一名员工,公司只能拥有一名总裁。
如何定义“一家公司只能有一位总裁”的条件
这是一个使用标准 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 by
、 having
、aggrgate 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 选项约束,但它没有被强制执行
with admin option和with grant option的区别