CREATE VIEW
功能描述
Vastbase G100 在MySQL兼容模式下,支持SQL SECURITY语法,为视图添加安全属性,也可以修改SQL SECURITY属性。
- 禁止通过视图插入、更新、删除原表。
- 插入、更新、删除原表数据时,视图内容同步更新。
语法格式
CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [ FORCE | NOFORCE ] [DEFINER = user]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [ ( column_name [, ...] ) ]
[ WITH ( {view_option_name [= view_option_value]} [, ... ] ) ]
AS query [ WITH {{ [ CASCADED | LOCAL ] CHECK OPTION } | READ ONLY}];
参数说明
OR REPLACE
当CREATE VIEW语句中存在OR REPLACE时,表示若以前存在该视图就进行替换,但新查询不能改变原查询的列定义,包括顺序、列名、数据类型、类型精度等,只可在列表末尾添加其他的列。
DEFINER = user
指定user作为视图的属主。
TEMP | TEMPORARY
创建临时视图。
FORCE | NOFORCE
强制创建视图。正常情况下,如果基表不存在,创建视图就会失败。指定force选项可以强制创建视图。
如果仅在存在基表且包含视图的模式的所有者对基表具有特权的情况下才希望创建视图,则指定NOFORCE。NOFORCE是默认值。
FORCE | NOFORCE
特性仅在数据库兼容模式为Oracle时支持(即数据库实例初始化时指定DBCOMPATIBILITY='A')。CREATE FORCE VIEW
创建视图时,子查询仅支持单表查询,暂不支持多表连接查询。
view_name
要创建的视图名称。可以用模式修饰。
取值范围:字符串,符合标识符命名规范。
column_name
可选的名称列表,用作视图的字段名。如果没有给出,字段名取自查询中的字段名。
取值范围:字符串,符合标识符命名规范。
view_option_name [= view_option_value]
该子句为视图指定一个可选的参数。
目前view_option_name支持的参数仅有security_barrier,当VIEW试图提供行级安全时,应使用该参数。
取值范围:Boolean类型,TRUE、FALSE
query
为视图提供行和列的SELECT或VALUES语句。
with read only
指定此选项将被标记为只读视图。
with read only
特性仅在数据库兼容模式为Oracle时支持(即数据库实例初始化时指定DBCOMPATIBILITY='A')。- 物化视图不支持with read only选项。
- 只读视图同步更新对原表数据的修改,不包括原表的表结构变更。
SQL SECURITY { DEFINER | INVOKER }
定义视图的安全属性。
DEFINER:表示按照视图的定义者(即创建或修改该视图的数据库用户)的权限来限定视图中AS SELECT对象的权限(查询视图的用户,只要拥有
SELECT ON VIEW
的权限,即可使用该视图)。INVOKER:表示按照视图的调用者(即查询该视图的数据库用户)的权限来限定视图中AS SELECT对象的权限(查询视图的用户,除了拥有
SELECT ON VIEW
的权限,还需要拥有视图中AS SELECT基表的查询权限才能使用该视图)。
默认值:DEFINER
SQL SECURITY
特性仅在数据库兼容模式为MySQL时支持(即数据库实例初始化时指定DBCOMPATIBILITY='B')。
示例
示例1:创建视图指定sql security属性。
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)