CREATE VIEW
功能描述
创建一个视图。视图与基本表不同,是一个虚拟的表。数据库中仅存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。若基本表中的数据发生变化,从视图中查询出的数据也随之改变。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中用户感兴 趣的数据及变化。
Vastbase在MySQL兼容模式下,支持CREATE VIEW如下特性用法:
- 支持SQL SECURITY语法,为视图添加安全属性。
本文档仅列出CREATE VIEW在MySQL兼容模式下的特性用法,更多语法及参数说明详见SQL语法参考中的CREATE VIEW。
注意事项
- 该功能仅在数据库兼容模式为MySQL时能够使用(即创建DB时DBCOMPATIBILITY='B'),在其他数据库兼容模式下不能使用该特性。
- 视图定义的顶层不能包含WITH、DISTINCT、GROUP BY、HAVING、LIMIT、OFFSET子句的视图
- 视图定义的顶层不能包含集合操作(UNION、INTERSET、EXCEPT)的视图。
- 视图的目标列表中不能包含聚集函数、窗口函数或者返回集合的函数。
语法格式
CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [DEFINER = user]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [ ( column_name [, ...] ) ]
...
参数说明
SQL SECURITY { DEFINER | INVOKER }
定义视图的安全属性。
DEFINER:表示按照视图的定义者(即创建或修改该视图的数据库用户)的权限来限定视图中AS SELECT对象的权限(查询视图的用户,只要拥有
SELECT ON VIEW
的权限,即可使用该视图)。INVOKER:表示按照视图的调用者(即查询该视图的数据库用户)的权限来限定视图中AS SELECT对象的权限(查询视图的用户,除了拥有
SELECT ON VIEW
的权限,还需要拥有视图中AS SELECT基表的查询权限才能使用该视图)。
默认值:DEFINER
示例
1、创建普通用户。
create user use_b_1144538 identified by 'A@123456';
2、创建测试表并插入数据。
create table sql_security_1144538(id int,cal int);
insert into sql_security_1144538 value(1,1);
insert into sql_security_1144538 value(2,2);
insert into sql_security_1144538 value(3,3);
3、创建视图并指定definer属性。
create sql security definer view v_1144538 as select * from sql_security_1144538;
4、查询视图内容。
select * from v_1144538 order by 1,2;
返回结果分别为:
id | cal
----+-----
1 | 1
2 | 2
3 | 3
(3 rows)
5、设置用户为普通用户use_b_1144538。
set role use_b_1144538 password 'A@123456';
6、查询视图内容。
select * from v_1144538 order by 1,2;
返回如下结果,普通用户没有权限,调用失败:
ERROR: permission denied for relation v_1144538_1
DETAIL: N/A
7、恢复超级用户。
reset role;
8、给用户use_b_1144538赋予视图的权限,并切换至用户use_b_1144538。
grant select on v_1144538 to use_b_1144538;
set role use_b_1144538 password 'A@123456';
9、再次查看视图。
select * from v_1144538 order by 1,2;
返回结果如下,查询成功:
id | cal
----+-----
1 | 1
2 | 2
3 | 3
(3 rows)