转载自
https://www.cnblogs.com/renzhituteng/p/11013957.html
如有侵权联系删除!
7.2.7 SELECT
语法:
<select_statement> ::=
语法元素:
SELECT 子句:
SELECT 子句指定要返回给用户或外部的 select 子句一个输出,如果存在的话。
<select_clause> ::= SELECT [TOP
<select_list> ::= <select_item>[, ...]
<select_item> ::= [<table_name>.] *|
TOP n:TOP n 用来返回 SQL 语句的前 n 条记录。
DISTINCT 和 ALL:可以使用 DISTINCT 返回重复的记录,每一组选择只有一个副本。使用 ALL 返回选择的所有记录,包括所有重复记录的拷贝。默认值为 ALL。
Select_list:select_list 允许用户定义他们想要从表中选择的列。
*:可以从 FROM 子句中列出的表或视图中选择所有列。如果集合名和表名或者表名带有星号(),其用来限制结果集至指定的表。
column_alias:column_alias 可以用于简单地表示表达式。
FROM:FROM 子句中指定输入值,如表、视图、以及将在 SELECT 语句中使用的子查询。
<from_clause> ::= FROM {
<joined_table> ::=
<join_type> ::= INNER | { LEFT | RIGHT | FULL } [OUTER]
table alias:表别名可以用来简单地表示表或者子查询。
join_type 定义了将执行的联接类型, LEFT 表示左外联接, RIGHT 表示右外联接, FULL 表示全外联接。执行联接操作时, OUT 可能或者可能不使用。
ON
CROSS JOIN:CROSS 表示执行交叉联接,交叉联接生成两表的交叉积结果。
WHERE 子句
WHERE 子句用来指定 FROM 子句输入的谓词, 使用户可以检索所需的记录。
<where_clause> ::= WHERE
<comparison_predicate> ::=
<range_predicate> ::=
<in_predicate> ::=
<exist_predicate> ::= [NOT] EXISTS (
<like_predicate> ::=
<null_predicate> ::=
<expression_list> ::= {
GROUP BY 子句
<group_by_clause> ::=GROUP BY { {
<grouping_set> ::= { GROUPING SETS | ROLLUP | CUBE }[BEST
[TEXT_FILTER
<grouping_expression_list> ::= { <grouping_expression>, ... }
<grouping_expression> ::=
GROUP BY 用来对基于指定列值选定的行进行分组。
GROUPING SETS
在一条语句中, 生成多个特定数据分组结果。如果没有设置例如 best 和 limit 的可选项,结果将和 UNION ALL 每个指定组的聚合值相同。例如:
"select col1, col2, col3, count() from t groupbygrouping sets ( (col1, col2), (col1, col3) )"与" select col1, col2, NULL, count() from t groupby col1, col2 unionallselect col1, NULL, col3,count(*) from t groupby col1, col3"相同。在 grouping-sets 语句中,
每个(col1, col2) 和(col1, col3)定义了分组。
ROLLUP
在一条语句中,生成多级聚合结果。例如, "rollup (col1, col2,col3)"与有额外 聚合,但没有分组的"grouping sets ( (col1, col2, col3), (col1, col2), (col1) )"结果相同。因此,结果集所包含的分组的数目是 ROLLUP 列表中的列加上一个最后聚合的数目,如果没有额外的选项。
CUBE
在一条语句中,生成多级聚合的结果。例如, "cube (col1, col2,col3)" 与有额外聚合,但没有分组的"grouping sets ( (col1, col2, col3), (col1, col2), (col1, col3), (col2, col3), (col1), (col2),(col3) )"结果相同。因此,结果集所包含分组的数目与所有可能排列在 CUBE 列表的列加上一个最后聚合的数目是相同的,如果没有附加的选项。
BEST n
返回每个以行聚合数降序排列的分组集中前 n 个分组集(返回的是某个分组里的所有记录,而不是某几条)。 n 可以是任意零,正数或负数。当 n 为零时,作用和没有 BEST 选项一样。当 n 为负数表示以升序排序。
LIMIT n1 [OFFSET n2]
返回每个分组集中(取每个组中的部分行)第一个 N1 分组记录跳过 N2 个后的结果。
WITH SUBTOTAL
返回每个分组集中由 OFFSET 或者 LIMIT 控制的返回结果的分类汇总。除非设置了 OFFSET 和LIMIT,返回值将和 WITH TOTAL 相同。
WITH BALANCE
返回每个分组集中 OFFSET 或者 LIMIT 没有返回的其余结果值。
WITH TOTAL
返回每个分组集中额外的合计总值行。 OFFSET 和 LIMIT 选项不能修改该值。
TEXT_FILTER
执行文本过滤或者用
<prefix_subsequent> ::= + | - | NOT | AND | AND NOT | OR
FILL UP
不仅返回匹配的分组记录,也包含不匹配的记录。 text_filter 函数对于识别哪一个匹配是很有用的。参阅下面的'Related Functions’。
SORT MATCHES TO TOP
返回匹配值位于非匹配值前的分组集。该选项不能和 SUBTOTAL, BALANCE 和 TOTAL 一起使用。
STRUCTURED RESULT
结果作为临时表返回。 对于每一个分组集创建一个临时表,如果设置 WITH OVERVIEW 选项,将为分组集的总览创建额外的临时表,该临时表的名字由 PREFIX 选项定义。
WITH OVERVIEW
将总览返回至单独的额外一张表中。
PREFIX 值
使用前缀命名临时表。必须以"#"开始,代表是临时表。如果省略,默认前缀为"#GN", 然后,连接该前缀值和一个非负整数,用作临时表的名称,比如"#GN0", "#GN1" 和 "#GN2"。
MULTIPLE RESULTSETS
返回多个结果集中的结果。
相关函数
grouping_id ( <grouping_column1, ..., grouping_columnn> )函数返回一个整数,判断每个分组记录属于哪个分组集。 text_filter ( <grouping_column> ) 函数与 TEXT_FILTER, FILL UP, 和 SORT MATCHES TO TOP 一起使用,显示匹配值或者 NULL。当指定了 FILL UP 选项时,未匹配值显示为 NULL。
返回格式
如果 STRUCTURED RESULT 和 MULTIPLE RESULTSETS 都没有设置,返回所有分组集 的联合,以及对于没有包含在指定分组集中的属性填充的 NULL 值。使用 STRUCTURED RESULT,额外的创建临时表,在同一会话中用"SELECT * FROM
使用 MULTIPLE RESULTSETS,将返回多个结果集。每个分组集的分组记录都在单个结果集中。
HAVING 子句:
HAVING 子句用于选择满足谓词的特定分组。如果省略了该子句,将选出所有分组。
<having_clause> ::= HAVING
SET OPERATORS
SET OPERATORS 使多个 SELECT 语句相结合,并只返回一个结果集。
<set_operator> ::= UNION [ ALL | DISTINCT ] | INTERSECT [DISTINCT] | EXCEPT [DISTINCT]
UNION ALL
选择所有 select 语句中的所有(并集)记录。重复记录将不会删除。
UNION [DISTINCT]
选择所有 SELECT 语句中的唯一记录,在不同的 SELECT 语句中删除重复记录。 UNION 和 UNION DISTINCT 作用相同。
INTERSECT [DISTINCT]
选择所有 SELECT 语句中共有(交集)的唯一记录。
EXCEPT [DISTINCT]
在位于后面的 SELECT 语句删除(差集)重复记录后,返回第一个 SELECT 语句中所有唯一的记录。
ORDER BY 子句
<order_by_clause> ::= ORDER BY { <order_by_expression>, ... }
<order_by_expression> ::=
ORDER BY 子句用于根据表达式或者位置对记录排序。位置表示选择列表的索引。对"select col1,col2 from t order by 2", 2 表示 col2 在选择列表中使用的第二个表达式。 ASC 用于按升序排列记录,DESC 用于按降序排列记录。默认值为 ASC。
LIMIT
LIMIT 关键字定义输出的记录数量。
LIMIT n1 [OFFSET n2]:返回跳过 n2 条记录后的最先 n1 条记录。
FOR UPDATE
FOR UPDATE 关键字锁定记录,以便其他用户无法锁定或修改记录,直到本次事务结束。
<for_update> ::= FOR UPDATE
TIME TRAVEL
该关键字与时间旅行有关,用于语句级别时间旅行回到 commit_id 或者时间指定的快照。
<time_travel> ::= AS OF { { COMMIT ID <commit_id> } | { UTCTIMESTAMP
createhistorycolumntable x ( a int, b int ); // after turnning off auto commit
insertinto x values (1,1);
commit;
select last_commit_id from m_history_index_last_commit_id where session_id = current_connection;// e.g., 10
insertinto x values (2,2);
commit;
select last_commit_id from m_history_index_last_commit_id where session_id = current_connection; // e.g., 20
deletefrom x;
commit;
select last_commit_id from m_history_index_last_commit_id where session_id = current_connection; // e.g., 30
select * from x asofcommit id 30; // return nothing
select * from x asofcommit id 20; // return two records (1,1) and (2,2)
select * from x asofcommit id 10; // return one record (1,1)
select commit_time from sys.transaction_history where commit_id = 10; // e.g., '2012-01-01 01:11:11'
select commit_time from sys.transaction_history where commit_id = 20; // e.g., '2012-01-01 02:22:22'
select commit_time from sys.transaction_history where commit_id = 30; // e.g., '2012-01-01 03:33:33'
select * from x asof utctimestamp '2012-01-02 02:00:00'; // return one record (1,1)
select * from x asof utctimestamp '2012-01-03 03:00:00'; // return two records (1,1) and (2,2)
select * from x asof utctimestamp '2012-01-04 04:00:00'; // return nothing
例子:
表 t1:
droptable t1;
createcolumntable t1 ( id intprimarykey, customer varchar(5), yearint, product varchar(5), sales int );
insertinto t1 values(1, 'C1', 2009, 'P1', 100);
insertinto t1 values(2, 'C1', 2009, 'P2', 200);
insertinto t1 values(3, 'C1', 2010, 'P1', 50);
insertinto t1 values(4, 'C1', 2010, 'P2', 150);
insertinto t1 values(5, 'C2', 2009, 'P1', 200);
insertinto t1 values(6, 'C2', 2009, 'P2', 300);
insertinto t1 values(7, 'C2', 2010, 'P1', 100);
insertinto t1 values(8, 'C2', 2010, 'P2', 150);
以下的 GROUPING SETS 语句和第二个 group-by 查询相等。 需要注意的是,两组在第一个查询的分组集内指定的各组在第二个查询。
select customer, year, product, sum(sales) from t1 groupbyGROUPING SETS((customer, year),(customer, product));
select customer, year, NULL, sum(sales) from t1 groupby customer, year
unionall
select customer, NULL, product, sum(sales) from t1 groupby customer, product;
注:Union时,两个Select语句的字段个数,对应字段的类型要相同。BW中的MultiCube是将多个InfoProvider的记录插入到MultiCube所对应的物理表中,这一过程并不是通过Union SQL语句来完成的,而是一个个将InfoProvider的数据插入到MultiCube中,所以来自InfoProvider的字段个数可以不同,只是在报表展示时,通过 Group进行了合并
ROLLUP 和 CUBE 经常使用的分组集的简明表示。 下面的 ROLLUP 查询与第二个 group-by 查询相等。
select customer, year, sum(sales) from t1 groupby ROLLUP(customer, year);
select customer, year, sum(sales) from t1 groupbygrouping sets((customer, year),(customer))
unionall
selectNULL, NULL, sum(sales) from t1;
selectNULL, NULL, sum(sales) from t1;
select customer, year, sum(sales) from t1 groupbygrouping sets((customer, year),(customer))
select customer, year, sum(sales) from t1 groupbygrouping sets((customer, year),(customer),())
以下的 CUBE 查询与第二个 group-by 查询相等。
select customer, year, sum(sales) from t1 groupby CUBE(customer, year);
select customer, year, sum(sales) from t1 groupbygrouping sets((customer, year),(customer),(year))
unionall
selectNULL, NULL, sum(sales) from t1;
select customer, year, sum(sales) from t1 groupbygrouping sets((customer, year),(customer),(year))
select customer, year, sum(sales) from t1 groupbygrouping sets((customer, year),(customer),(year),())
BEST 1 指定以下查询语句只能返回最上面的 1 个 best 组。在该个例子中,对于(customer, year)组存在 4 条记录,而(product)组存在 2 条记录,因此返回之前的 4 条记录。对于 'BEST -1' 而非 'BEST 1',返回后 2 条记录。
select customer, year, product, sum(sales) from t1 groupbygrouping sets ((customer, year),(product));
select customer, year, product, sum(sales) from t1 groupbygrouping sets BEST 1((customer, year),(product));
select customer, year, product, sum(sales) from t1 groupbygrouping sets BEST 2((customer, year),(product));
select customer, year, product, sum(sales) from t1 groupbygrouping sets BEST -1((customer, year),(product));
LIMIT2 限制每组最大记录数为 2。对于(customer, year) 组,存在 4 条记录,只返回前 2 条记录;(product)组的记录条数为 2,因此返回所有结果。
select customer, year, product, sum(sales) from t1 groupbygrouping sets LIMIT 2((customer, year),(product));
WITH SUBTOTAL 为每一组生成额外的一条记录,显示返回结果的分类汇总(没有显示出来的不会被统计,这与With Total是不一样的,请参考后面的With Total)。这些记录的汇总对customer, year, product 列返回 NULL,选择列表中 sum(sales)的总和。
select customer, year, product, sum(sales) from t1 groupbygrouping sets LIMIT 2 WITH SUBTOTAL((customer, year),(product));
WITH BALNACE 为每一组生成额外的一条记录,显示未返回结果的分类汇总(如果未返回结果行不存在,则以分类汇总行还是会显示,只不过都是问号,而不是不显示)。
select customer, year, product, sum(sales) from t1 groupbygrouping sets WITH BALANCE((customer, year),(product));
select customer, year, product, sum(sales) from t1 groupbygrouping sets LIMIT 2 WITH BALANCE((customer, year),(product));
select customer, year, product, sum(sales) from t1 groupbygrouping sets LIMIT 1 WITH BALANCE((customer, year),(product));
WITH TOTAL为每一组生成额外的一条记录,显示所有分组记录的汇总,不考虑该分组记录是否返回(即没有显示在分组里的数据也会汇总起来,如下面的 300 + 500 <> 1250,因为使用了Limit限制了每组返回的条数,但那些未显示出来的数据也会被一起统计,这与 With SubTotal不一样)。
select customer, year, product, sum(sales) from t1 groupbygrouping sets LIMIT 2 WITH TOTAL((customer, year),(product))
TEXT_FILTER 允许用户获得有指定的
select customer, year, product, sum(sales), text_filter(customer), text_filter(product) from t1
groupbygrouping sets TEXT_FILTER '*2'((customer, year),(product));--只是去搜索每个分组里里的第一列,如这里的customer与product,但不搜索Year列,因为不是分组中的首列
FILL UP 用于返回含有
select customer, year, product, sum(sales), text_filter(customer), text_filter(product)
from t1 groupbygrouping sets TEXT_FILTER '*2' FILL UP ((customer, year),(product));
SORT MATCHES TO TOP 用于提高匹配记录。对于每个分组集,将对其分组记录进行排序。
select customer, year, product, sum(sales), text_filter(customer), text_filter(product)
from t1 groupbygrouping sets TEXT_FILTER '*2' FILL UP SORT MATCHES TO TOP((customer, year),(product));
STRUCTURED RESULT 为每个分组集创建一张临时表,并且可选地,为总览表也创建一张。表"#GN1" 为 分组集(customer, year),表"#GN2" 为分组集(product)。注意,每张表只含有一列相关列。也就是说,表"#GN1"不包含列"product",而表"#GN2"不包含列"customer" and "year"。
select customer, year, product, sum(sales) from t1 groupbygrouping sets STRUCTURED RESULT((customer, year),(product));
select * from"#GN1";
select * from"#GN2";
WITH OVERVIEW 为总览表创建临时表"#GN0"。
select customer, year, product, sum(sales)
from t1 groupbygrouping sets structured result WITH OVERVIEW((customer, year),(product));
select * from"#GN0";
select * from"#GN1";
select * from"#GN2";
用户可以通过使用 PREFIX 关键字修改临时表的名字。注意,名字必须以临时表的前缀'#'开始,下面与上面结果是一样,只是临时表名不一样而已:
select customer, year, product, sum(sales)
from t1
groupbygrouping sets STRUCTURED RESULT WITH OVERVIEW PREFIX '#MYTAB'((customer, year),(product));
select * from"#MYTAB0";
select * from"#MYTAB1";
select * from"#MYTAB2";
当相应的会话被关闭或用户执行 drop 命令,临时表被删除。 临时列表是显示在m_temporary_tables。
select * from m_temporary_tables;
MULTIPLE RESULTSETS 返回多个结果的结果集。在 SAP HANA Studio 中,以下查询将返回三个结果集:一个为总览表,两个为分组集。
select customer, year, product, sum(sales) from t1 groupbygrouping sets MULTIPLE RESULTSETS((customer, year),(product));
7.2.8 UNLOAD
语法:
UNLOAD <table_name>
描述:
UNLOAD 语句从内存中卸载列存储表, 以释放内存。表将在下次访问时重新加载。
例子:
在下面的例子中,表 a_table 将从内存中卸载。
UNLOAD a_table;
卸载表的状态可以通过以下语句查询:
select loaded from m_cs_tables where table_name = 't1';
7.2.9 UPDATE
语法
UPDATE [<schema_name>.]<table_name> [ AS <alias_name> ] <set_clause> [ WHERE
<set_clause> ::= SET {<column_name> =
关于表达式的详情,请参见 Expressions。
关于谓词的详情,请参见 Predicates。
描述:
UPDATE 语句修改满足条件的表中记录的值。如果 WHERE 子句中条件为真,将分配该列至表达式的结果中。如果省略了 WHERE 子句,语句将更新表中所有的记录。
例子:
CREATETABLE T (KEYINTPRIMARYKEY, VAL INT);
INSERTINTO T VALUES (1, 1);
INSERTINTO T VALUES (2, 2);
如果 WHERE 条件中的条件为真,记录将被更新。
UPDATE T SET VAL = VAL + 1 WHEREKEY = 1;
如果省略了 WHERE 子句,将更新表中所有的记录。
UPDATE T SET VAL = KEY + 10;
7.3系统管理语句
7.3.1 SET SYSTEM LICENSE
语法:
SET SYSTEM LICENSE '
描述:
安装许可证密钥的数据库实例。许可证密钥(
执行该命令需要系统权限 LICENSE ADMIN。
例子:
SETSYSTEM LICENSE '----- Begin SAP License -----
SAPSYSTEM=HD1
HARDWARE-KEY=K4150485960
INSTNO=0110008649
BEGIN=20110809
EXPIRATION=20151231
LKEY=...
SWPRODUCTNAME=SAP-HANA
SWPRODUCTLIMIT=2147483647
SYSTEM-NR=00000000031047460'
7.3.2 ALTER SYSTEM ALTER CONFIGURATION
语法:
ALTER CONFIGURATION (
语法元素:
行存储引擎配置的情况下,文件名是'indexserver.ini'。 所使用的文件名必须是一个位于’DEFAULT’层的 ini 文件。如果选择文件的文件名在所需的层不存在,该文件将用 SET 命令创建。
设置配置变化的目标层。 该参数可以是'SYSTEM'或'HOST'。 SYSTEM 层为客户设置的推荐层。 HOST层应该一般仅可用于少量的配置,例如, daemon.ini 包含的参数。
<layer_name> ::= <string_literal>
如果上述的层设为’HOST’, layer_name 将用于设置目标 tenant 名或者目标主机名。例如,
'selxeon12' 为目标 'selxeon12' 主机名。
SET
SET 命令更新键值,如果该键已存在,或者需要的话插入该键值。
UNSET
UNSET 命令删除键及其关联值。
<parameter_key_value_list> ::={(<section_name>,<parameter_name>) = <parameter_value>},...
指定要修改的 ini 文件的段、键和值语句如下:
<section_name> ::= <string_literal>
将要修改的参数段名:
<parameter_name> ::= <string_literal>
将要修改的参数名:
<parameter_value> ::= <string_literal>
将要修改的参数值。
WITH RECONFIGURE
当指定了 WITH RECONFIGURE,配置的修改将直接应用到 SAP HANA 数据库实例。
当未指定 WITH RECONFIGURE,新的配置将写到文件 ini 中,然而,新的值将不会应用到当前运行系统中,只在数据库下次的启动时应用。这意味 ini 文件中的内容可能和 SAP HANA 数据库使用的实际配置值存在不一致。
描述:
设置或删除 ini 文件中的配置参数。 ini 文件配置用于 DEFAULT, SYSTEM, HOST 层。
注意: DEFAULT 层配置不能使用此命令更改或删除。
以下为 ini 文件位置的例子:
DEFAULT: /usr/sap/
SYSTEM: /usr/sap/
HOST: /usr/sap/
配置层的优先级: DEFAULT < SYSTEM < HOST。这表示 HOST 层具有最高优先级,跟着是 SYSTEM层,最后是 DEFAULT 层。最高优先级的配置将应用到运行环境中。 如果最高优先级的配置被删除,具有下一个最高优先级的配置将被应用。
系统和监控视图:
目前可供使用的 ini 文件在系统表 M_INIFILES 列出,并且当前配置在系统表 M_INIFILE_CONTENTS可见。
例子:
修改系统层配置的例子如下:
ALTERSYSTEMALTER CONFIGURATION ('filename', 'layer') SET ('section1', 'key1') = 'value1', ('section2','key2') = 'value2', ... [WITH RECONFIGURE];
ALTERSYSTEMALTER CONFIGURATION ('filename', 'layer', 'layer_name' ) UNSET ('section1', 'key1'),('section2'), ...[WITH RECONFIGURE];
7.3.3 ALTER SYSTEM ALTER SESSION SET
语法:
ALTER SYSTEM ALTER SESSION <session_id> SET
语法元素:
<session_id> ::= <unsigned_integer>
应当设置变量的会话的 ID。
会话变量的键值,最大长度为 32 个字符。
会话变量的期望值,最大长度为 512 个字符。
描述:
使用该命令,你可以设置数据库会话的会话变量:
注意:有几个只读会话变量,你不能使用该命令修改值: APPLICATION, APPLICATIONUSER,TRACEPROFILE。
会话变量可以使用 SESSION_CONTEXT 函数获得,使用 ALTER SYSTEM ALTER SESSION UNSET 命令取消设置。
例子:
在以下的例子中,你在会话 200006 将变量'MY_VAR' 设为 'dummy':
ALTERSYSTEMALTER SESSION 200006 SET'MY_VAR'= 'dummy';
7.3.4 ALTER SYSTEM ALTER SESSION UNSET
语法:
ALTER SYSTEM ALTER SESSION <session_id> UNSET
语法元素:
<session_id> ::= <unsigned_integer>
应当取消设置变量的会话 ID。
会话变量的键值, 最大长度为 32 个字符。
描述:
使用该命令,你可以取消设置数据库会话的会话变量。
会话可以通过 SESSION_CONTEXT 函数获得。
例子:
获得当前会话的会话变量:
SELECT * FROM M_SESSION_CONTEXT WHERE CONNECTION_ID = CURRENT_CONNECTION
从特定会话中删除会话变量:
ALTERSYSTEMALTER SESSION 200001 UNSET 'MY_VAR';
7.3.5 ALTER SYSTEM CANCEL [WORK IN] SESSION
语法
ALTER SYSTEM CANCEL [WORK IN] SESSION <session_id>
语法元素:
<session_id> ::= <string_literal>
所需会话的会话 ID。
描述:
通过指定会话 ID 取消当前正在运行的语句。取消的会话将在取消后回滚,执行中的语句将返回错误代码 139(current operation cancelled by request and transaction rolled back)。
例子:
你可以使用下面的查询来获取当前的连接 ID 和它们执行的语句。
SELECT C.CONNECTION_ID, PS.STATEMENT_STRING
FROM M_CONNECTIONS C JOIN M_PREPARED_STATEMENTS PS
ON C.CONNECTION_ID = PS.CONNECTION_ID AND C.CURRENT_STATEMENT_ID = PS.STATEMENT_ID
WHERE C.CONNECTION_STATUS = 'RUNNING'AND C.CONNECTION_TYPE = 'Remote'
利用上文中的查询语句获得的连接 ID,你现在可以取消一条正在运行的查询,语句如下:
ALTERSYSTEM CANCEL SESSION '400037';
7.3.6 ALTER SYSTEM CLEAR SQL PLAN CACHE
语法:
ALTER SYSTEM CLEAR SQL PLAN CACHE
描述:
SQL PLAN CACHE 存储之前执行的 SQL 语句生成的计划, SAP HANA 数据库使用该计划缓存加速查询语句的执行,如果同样的 SQL 语句 再次执行。计划缓存也收集关于计划准备和执行的数据。
你可以从以下的监控视图中找到更多有关 SQL 缓存计划的内容:
M_SQL_PLAN_CACHE, M_SQL_PLAN_CACHE_OVERVIEW
ALTER SYSTEM CLEAR SQL PLAN CACHE 语句删除所有当前计划缓存没有执行的 SQL 计划。该命令还可以从计划缓存中删除所有引用计数为 0 的计划,并重置所有剩余计划的统计数据。最后,该命令也重置监控视图 M_SQL_PLAN_CACHE_OVERVIEW 的内容。
例子:
ALTERSYSTEM CLEAR SQLPLANCACHE
7.3.7 ALTER SYSTEM CLEAR TRACES
语法:
ALTER SYSTEM CLEAR TRACES (<trace_type_list>)
语法元素:
<trace_type_list> ::= <trace_type> [,...]
通过在逗号分隔的列表中加入多个 trace_types,您可以同时清除多个追踪。
<trace_type> ::= <string_literal>
你可以通过设置 trace_type 为以下类型之一,有选择地清除特定的追踪文件:
描述:
你可以使用 ALTER SYSTEM CLEAR TRACES 清除追踪文件中的追踪内容。当您使用此命令所有开设了 SAP HANA 数据库的跟踪文件将被删除或清除。在分布式系统中,该命令将清除所有主机上的所有跟踪文件。
使用此命令可以减少大跟踪文件使用的磁盘空间,例如,当追踪组件设为 INFO 或 DEBUG。
你可以使用系统表 M_TRACEFILES, M_TRACEFILE_CONTENTS 各自监控追踪文件及其内容。
例子:
要清除警告的跟踪文件,使用下面的命令:
ALTERSYSTEM CLEAR TRACES('ALERT');
要清除警告和客户端跟踪文件,使用下面的命令:
ALTERSYSTEM CLEAR TRACES('ALERT', 'CLIENT');
7.3.8 ALTER SYSTEM DISCONNECT SESSION
语法:
ALTER SYSTEM DISCONNECT SESSION <session_id>
语法元素:
<session_id> ::= <string_literal>
要断开连接的会话 ID。
描述:
你使用 ALTER SYSTEM DISCONNECT SESSION 来断开数据库指定的会话。在断开连接之前,与会话相关联的所有正在运行的操作将被终止。
例子:
你使用如下的命令获得空闲会话的会话 ID:
SELECT CONNECTION_ID, IDLE_TIME FROM M_CONNECTIONS WHERE CONNECTION_STATUS = 'IDLE'AND CONNECTION_TYPE = 'Remote'ORDERBY IDLE_TIME DESC
你使用如下命令断开会话连接:
ALTERSYSTEMDISCONNECT SESSION '400043'
7.3.9 ALTER SYSTEM LOGGING
语法:
ALTER SYSTEM LOGGING <on_off>
语法元素:
<on_off> ::= ON | OFF
描述:
启动或禁用日志。
日志记录被禁用后,任何日志条目将不会持久化。当完成一个保存点,只有数据区被写入数据。
这可能会导致损失已提交的事务,当 indexserver 在加载中时被终止。在终止的情况下,你必须截断,并再次插入的所有数据。
启用日志记录后,你必须执行一个保存点,以确保所有的数据都保存,并且你必须执行数据备份,否则你将不能恢复这些数据。
只在初次加载时使用该命令!
你可以使用 ALTER TABLE ... ENABLE/DISABLE DELTA LOG 为单个列表完成操作。
7.3.10 ALTER SYSTEM RECLAIM DATAVOLUME
语法:
ALTER SYSTEM RECLAIM DATAVOLUME [SPACE] [<host_port>] <percentage_of_overload_size>
<shrink_mode>
语法元素:
<host_port> ::= 'host_name:port_number'
指定服务器在持久层应减少的大小:
<percentage_of_overload_size> ::= <int_const>
指定过载的数据量应减少的百分比。
<shrink_mode> ::= DEFRAGMENT | SPARSIFY
指定持续层减少大小的策略,默认值为 DEFRAGEMENT。请注意, SPARSIFY 尚未支持,并保留以备将来使用
描述:
该命令应在持久层中未使用的空间释放时使用。 它减少数据量到过载量的 N%; 它的工作原理就像一个硬盘进行碎片整理,散落在页面的数据将被移动到数据量的前端和数据量尾端的自由空间将被截断。
如果省略了<host_port> ,该语句将持久化地分配至所有服务器。
例子:
在下面的例子中,架构中的所有服务器持久层将进行碎片整理,并减少至过载尺寸的 120%。
ALTERSYSTEM RECLAIM DATAVOLUME 120 DEFRAGMENT
7.3.11 ALTER SYSTEM RECLAIM LOG
语法:
ALTER SYSTEM RECLAIM LOG
描述:
当数据库中已经积累了大量的日志段时,你可以使用此命令,收回磁盘空间目前未使用的日志段。
日志段的积累,可以以多种方式引起。 例如,当自动日志备份不可长期操作或日志保存点被阻塞很长时间, 当这样的问题发生时,你只能在修复日志积累的根本原因后, 使用 ALTER SYSTEM CLAIM LOG 命令。
例子:
你回收目前未使用的日志段的磁盘空间,使用下面的命令:
ALTERSYSTEM RECLAIM LOG
7.3.12 ALTER SYSTEM RECLAIM VERSION SPACE
语法:
ALTER SYSTEM RECLAIM VERSION SPACE
描述:
执行 MVCC 版本垃圾回收来重用资源。
7.3.13 ALTER SYSTEM RECONFIGURE SERVICE
语法:
ALTER SYSTEM RECONFIGURE SERVICE (<service_name>,
语法元素:
<service_name> ::= <string_literal>
你希望重新配置的服务名称。关于可用的服务类型的列表,请参阅监控视图 M_SERVICE_TYPES。
你将重新配置服务的主机和端口号。
描述:
你可以使用 ALTER SYSTEM RECONFIGURE SERVICE 通过应用当前配置参数,重新配置指定的服务。
在使用没有 RECONFIGURE 选项的 ALTER CONFIGURATION 修改多个配置参数使用该命令。参见ALTER SYSTEM ALTER CONFIGURATION。
欲重新配置特定的服务,指定
欲重新配置一种类型的所有服务,指定<service_name> 的值, 而 host> 和
欲重新配置所有服务,所有参数留空。
例子:
你可以使用以下命令来重新配置 ld8520.sap.com 主机上所有使用端口号 30303 的服务:
ALTERSYSTEM RECONFIGURE SERVICE ('','ld8520.sap.com',30303)
你可以使用以下命令重新配置类型 indexserver 的所有服务:
ALTERSYSTEM RECONFIGURE SERVICE ('indexserver','',0)
参见 ALTER SYSTEM ALTER CONFIGURATION。
7.3.14 ALTER SYSTEM REMOVE TRACES
语法:
ALTER SYSTEM REMOVE TRACES (
<trace_file_name_list> ::= <trace_file>,...
语法元素:
将要删除追踪记录的主机名。
<trace_file_name_list> ::= <trace_file> [,..]
你可以通过在逗号分隔的列表中添加多条 trace_file 记录,同时删除多条追踪记录。
<trace_file> :== see table below.
你可以将 trace_file 设置为以下类型之一:
描述:
你可以使用该命令删除指定主机中的追踪文件,减少大追踪文件占用的硬盘空间。当某个服务的追踪文件已打开,则不能被删除。这种情况下,你可以使用 ALTER SYSTEM CLEAR TRACES 命令清除追踪文件。
例子:
你使用以下命令删除主机 lu873.sap.com 上所有 ALERT 追踪文件:
ALTERSYSTEM REMOVE TRACES ('lu873.sap.com', 'alert_.trc');
参见 ALTER SYSTEM CLEAR TRACES。
7.3.15 ALTER SYSTEM RESET MONITORING VIEW
语法:
ALTER SYSTEM RESET MONITORING VIEW <view_name>
语法元素:
<view_name> ::=
重设可重置监控视图的名字。
注意:不是所有监控视图可以使用该命令进行重置。可重设视图的名字后缀为"_RESET",你可以通过其名字判断是否可以重置。
描述:
你可以使用此命令重置指定的监视视图的统计数据。
你可以使用此命令来定义测量的起始点。首先,你重置监控视图,然后执行一个操作。当该操作完成后,查询监控视图"_RESET"版本获得从上次重置之后收集到的统计信息。
例子:
在以下的例子中,你重置"SYS"."M_HEAP_MEMORY_RESET"监控视图:
ALTERSYSTEMRESET MONITORING VIEW"SYS"."M_HEAP_MEMORY_RESET"
7.3.16 ALTER SYSTEM SAVE PERFTRACE
语法:
ALTER SYSTEM SAVE PERFTRACE [INTO FILE <file_name>]
语法元素:
<file_name> ::= <string_literal>
原始性能数据保存的文件。
描述:
你可以使用命令收集.prf 文件中的原始性能数据,保存该信息至.tpt 文件。 .tpt 文件保存在 SAP HANA 数据库实例的追踪文件目录中。如果你未指定文件名,则文件将保存为'perftrace.tpt'。
性能追踪数据文件(.tpt)可以从'SAP HANA Computing Studio'->Diagnosis-Files 下载,之后性能追踪可以利用 SAP HANA 实例中的 HDBAdmin 加载和分析。
监控视图:
性能文件的状态可以从 M_PERFTRACE 监控。
例子:
你可以使用如下命令将原始性能数据保存至'mytrace.tpt'文件:
ALTERSYSTEM SAVE PERFTRACE INTO FILE 'mytrace.tpt'
7.3.17 ALTER SYSTEM SAVEPOINT
语法:
ALTER SYSTEM SAVEPOINT
描述:
持久层管理器上执行保存点。 保存点是一个数据库的完整连续镜像保存在磁盘上的时间点,该镜像可以用于重启数据库。
通常情况下,保存点定期执行,由[persistence]部分的参数 savepoint_interval_s 配置。 对于特殊的(通常测试)的目的,保存点可能会被禁用。在这种情况下,你可以使用此命令来手动执行保存点。
7.3.18 ALTER SYSTEM START PERFTRACE
语法:
ALTER SYSTEM START PERFTRACE [<user_name>] [<application_user_name>] [PLAN_EXECUTION][FUNCTION_PROFILER] [DURATION <duration_seconds>]
语法元素:
<user_name> ::=
限制 perftrace 收集为指定的 SQL 用户名。
<application_user_name> ::=
限制为指定的 SQL 用户名收集 perftrace,应用用户可以通过会话变量 APPLICATIONUSER 定义。
PLAN_EXECUTION
收集计划执行细节:
FUNCTION_PROFILER
收集函数级别细节:
<duration_seconds> ::=
经过 duration_seconds 后, perftrace 自动停止。如果未指定该参数,仅停止有 ALTER SYSTEM STOP PERFTRACE 的 perftrace。
描述:
开始性能追踪。
利用'Explain Plan' 或 'Visualize Plan',你可以在逻辑级别查看语句的执行。利用'Perfomance Trace',语句的执行将记录在线程和函数级别。
一次只能有一个 perftrace 活动。
性能追踪文件状态可以从 M_PERFTRACE 监控。
例子:
ALTERSYSTEM START PERFTRACE sql_user app_user PLAN_EXECUTION FUNCTION_PROFILER
7.3.19 ALTER SYSTEM STOP PERFTRACE
语法:
ALTER SYSTEM STOP PERFTRACE
描述:
停止先前启动的性能追踪。停止后,需要利用 ALTER SYSTEM SAVE PERFTRACE 收集和保存性能追踪数据。
例子:
ALTERSYSTEM STOP PERFTRACE
7.3.20 ALTER SYSTEM STOP SERVICE
语法:
ALTER SYSTEM STOP SERVICE <host_port> [IMMEDIATE [WITH COREFILE]]
语法元素:
<host_port> ::= host_name:port_number | ('<host_name>',<port_number>)
将停止的服务的位置。
IMMEDIATE
立即停止(中止)服务,无需等待正常关机。
WITH COREFILE
写入 core 文件。
描述:
停止或终止单个或者多个服务。 通常,该服务将由守护进程重新启动。
修改了不能在线更改的参数之后使用。
例子:
ALTERSYSTEM STOP SERVICE 'ld8520:30303'
UNSET SYSTEM LICENSE ALL
语法:
7.3.21 UNSET SYSTEM LICENSE ALL
描述:
删除所有已安装的许可证密钥。 使用此命令后,系统将被立即锁定,并且需要一个新的有效许可证密钥,然后才可以继续使用。执行该命令需要有 LICENSE ADMIN 权限。
例子:
UNSET SYSTEM LICENSE ALL
7.4会话管理语句
7.4.1 CONNECT
语法:
CONNECT <connect_option>
语法元素:
<connect_option> ::=<user_name> PASSWORD
描述:
通过指定 user_name 和密码或者指定 SAML 断言连接数据库实例。
例子:
CONNECT my_user PASSWORD myUserPass1
7.4.2 SET HISTORY SESSION
语法:
SET HISTORY SESSION TO
语法元素:
用户应该指定一个确切的会话旅行的时间。
描述:
SET HISTORY SESSION 使当前会话查看历史记录表过去的版本。用户可以指定 COMMIT ID 中的版本或 UTCTIMESTAMP 格式,或者通过指定 NOW 回到当前版本。发布带有 COMMIT ID 或UTCTIMESTAMP 的 SET HISTORY SESSION 之后,当前会话中看到了一个旧版本的历史记录表,而不能写进系统任何东西。如果给定了 NOW 选项,当前会话恢复到一个正常的会话,看到当前版本的历史记录表,并能写入系统。 此命令只适用于历史记录表,普通表的可见性不会受到影响。
例子:
SELECT CURRENT_UTCTIMESTAMP FROM SYS.DUMMY
SELECT LAST_COMMIT_ID FROM M_HISTORY_INDEX_LAST_COMMIT_ID WHERE SESSION_ID =
CURRENT_CONNECTION COMMIT
SET HISTORY SESSION TO UTCTIMESTAMP '2012-03-09 07:01:41.428'
SET HISTORY SESSION TO NOW
7.4.3 SET SCHEMA
语法:
SET SCHEMA <schema_name>
描述:
你可以修改会话的当前schema。 如果表前不限制schema,则使用当前用户的schema。
7.4.4 SET [SESSION]
语法:
SET [SESSION]
(SESSION选项可以省略)
语法元素:
会话变量的键值,最大长度为 32 个字符。
会话变量的期望值,最大长度为 512 个字符。
描述:
你可以使用该命令设置你数据库会话的会话变量,通过提供键值对。
注意:有几个只读会话变量,你不能使用该命令修改值: APPLICATION, APPLICATIONUSER,TRACEPROFILE。
会话变量可以使用 SESSION_CONTEXT 函数获得,使用 UNSET [SESSION]命令取消设置。
例子:
SET'MY_VAR' = 'dummy';
SELECT SESSION_CONTEXT('MY_VAR') FROM dummy;
UNSET 'MY_VAR';
7.4.5 UNSET [SESSION]
语法:
UNSET [SESSION]
语法元素:
会话变量的键值,最大长度为 32 个字符。
描述:
你可以使用 UNSET [SESSION]取消设置当前会话的会话变量。
注意:有几个只读会话变量,你不能使用该命令修改值: APPLICATION, APPLICATIONUSER,TRACEPROFILE。
例子:
SET'MY_VAR'= 'dummy';
SELECT SESSION_CONTEXT('MY_VAR') FROM dummy;
UNSET 'MY_VAR';
7.5事务管理语句
7.5.1 COMMIT
语法:
COMMIT
描述:
该系统支持事务一致性,保证了当前作业是完全应用到系统中或者弃用。如果用户希望持久地应用当前作业至系统中,用户应使用 COMMIT 命令。 如果 COMMIT 命令发出后,并成功处理,任何改变将应用到当前事务完成的系统中,改变也将对其他未来开始的作业可见。通过 COMMIT 命令已经承诺的工作,将不能恢复。 分布式系统中,遵守标准的两阶段提交协议。在第一阶段, 事务处理协调器将询问每一位参与者是否准备提交,并将结果发送到第二阶段的参与者。 COMMIT 命令只适用于'autocommit'的禁用会话。
例子:
COMMIT
7.5.2 LOCK TABLE
语法:
LOCK TABLE <table_name> IN EXCLUSIVE MODE [NOWAIT]
描述:
LOCK TABLE 命令显式地尝试获取表的互斥锁。如果指定了 NO WAIT 选项, 其只是试图获得表的锁。如果指定了 NOWAIT 选项不能获得锁,将返回一个错误代码,但是当前事务将回滚。
例子:
LOCKTABLE t1 INEXCLUSIVEMODE NOWAIT
7.5.3 ROLLBACK
语法:
ROLLBACK
描述:
该系统支持事务一致性,保证了当前作业是完全应用到系统中或者弃用。在事务的中间过程, 可以显式恢复,因为由于 ROLLBACK 命令,事务尚未执行。发布 ROLLBACK 命令后, 将完全恢复事务系统做的任何变化,当前会话将处于闲置状态。 ROLLBACK 命令只适用于'autocommit'的禁用会话。
例子:
ROLLBACK
7.5.4 SET TRANSACTION
语法:
SET TRANSACTION <isolation_level> | <transaction_access_mode>
语法元素:
isolation_level ::= ISOLATION LEVEL
隔离级别设置数据库中的数据语句级读一致性。如果省略了 isolation_level,默认值为 READ COMMITTED。
level ::= READ COMMITTED(提交读取) | REPEATABLE READ(可重复读) | SERIALIZABLE(序列化读)
READ COMMITTED
READ COMMITTED 隔离级别提供事务过程中语句级别读一致性。 在语句开始执行时,事务中的每条语句都能看到已提交状态的数据。这意味着在同一事务中,每个语句可能会看到执行时数据库中不同的快照,因为数据可以在事务中提交。
REPEATABLE READ/SERIALIZABLE
REPEATABLE READ/SERIALIZABLE 隔离级别提供了事务级快照隔离。事务所有语句共享数据库同样的快照。该快照包含所有已提交的事务开始的时间以及事务本身的修改。
transaction_access_mode ::= READ ONLY | READ WRITE
SQL 事务访问模式控制事务是否可以在执行期间修改数据。如果省略了transaction_access_mode,默认值为 READ ONLY。
READ ONLY
如果设置了 READ ONLY 访问模式,则只允许只读的 SELECT 语句。如果在这种模式下尝试更新或插入操作,会抛出一个异常。
READ WRITE
如果设置了 READ WRITE 访问模式,在一个事务中的语句可以按需自由地读取或更改数据库的数据。
描述:
SAP HANA 数据库使用多版本并发控制 (MVCC) 确保读取操作的一致性(提交读取隔离级别+MVCC,可以解决数据不可重复读的问题)。并发的读操作不阻塞并发写操作数据库中的数据的一致视图。并发的读操作不阻塞并发写数据库数据的一致视图。更新操作通过插入数据的新版本而不是覆盖已有数据执行。
指定的隔离级别确定将要使用的锁操作类型。系统同时支持语句级快照隔离和事务级快照隔离。
对于语句级快照隔离,使用READ COMMITED。
对于事务级快照隔离,使用REPEATABLE READ 或者 SERIALIZABLE。
在一个事务中,当记录被插入、更新或删除时,系统对事务执行中,受影响的记录设置互斥锁的持续时间,也对受影响的表设置锁。这样可以保证当表中的记录正在更新时,该表不会被删除或更改。数据库在事务结束时释放这些锁。
注意:读取操作不设置任何数据库中表或行的锁,无论使用何种隔离级别。
数据定义语言和事务隔离
数据定义语言(DDL) 语句(CREATE TABLE, DROP TABLE, CREATE VIEW, etc )总是立即对随后的 SQ 语句生效,无论使用何种隔离级别。对于这种行为的一个例子,请考虑下面的顺序:
例子:
SETTRANSACTION READ COMMITTED;
数据库的隔离级别:并发性作用。
l Read Uncommited(未提交读):没有提交就可以读取到数据(发出了Insert,但没有commit就可以读取到。)很少用。在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
l Read Commited(提交读):只有提交后才可以读,常用。这是大多数数据库系统的默认隔离级别(但不是MySQL默认的,MySql默认为可重复读)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。解决了脏读问题。
l Repeatable Read(可重复读):mysql默认级别, 必需提交才能见到,读取数据时数据被锁住。它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。解决了不可重复读的问题
l Serialiazble(序列化读):最高隔离级别,串型的,你操作完了,我才可以操作,并发性特别不好。这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
隔离级别
是否存在脏读
是否存在不可重复读
是否存在幻读
Read Uncommitted(未提交读)
Y
Y
Y
Read Commited(提交读)
N
Y(可采用悲观锁解决)
Y
Repeatable Read(可重复读)
N
N
Y
Serialiazble(序列化读)
N
N
N
事务并发时可能出现问题:脏读、不可重复读、幻读
脏读:没有提交就可以读取到数据称为脏读
不可重复读:再重复读一次,数据与你上的不一样。称不可重复读。
幻读:在查询某一条件的数据,开始查询的后,别人又加入或删除些数据,再读取时与原来的数据不一样了。
脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几行(Row)数据,而另一个事务却在此时插入了新的几行数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
设置 JDBC 事务隔离级别(注意多数数据库都不支持所有的隔离级别):
1 java.sql.Connection.TRANSACTION_READ_COMMITTED
2 java.sql.Connection.TRANSACTION_READ_UNCOMMITTED
4 java.sql.Connection.TRANSACTION_REPEATABLE_READ
8 java.sql.Connection.TRANSACTION_SERIALIZABLE
一般我们将级别设置为1(提交读)级别后,再通过程序的方式来避免“不可重复读”问题。
如果我们在Hibernate中没有设置数据库的隔离级别,则默认是依赖于数据库的,所以我们最好设置。
银行系统需要将数据库的隔离级别设置成“可重复读”。
一、悲观锁
悲观锁:具有排他性(我锁住当前数据后,别人看到不此数据)
悲观锁一般由数据机制来做到的。select ... for update
长事务占有时间(如果占有1个小时,那么这个1小时别人就不可以使用这些数据),不常用。
用户1、用户2 同时读取到数据,但是用户2先 -200,这时数据库里的是800,现在用户1也开始-200,可是用户1刚才读取到的数据是1000,现在用户用刚刚一开始读取的数据1000-200为800,而用户1在更新时数据库里的是用房更新的数据800,按理说用户1应该是800-200=600,而现在是800,这样就造成的更新丢失。这种情况该如何处理呢,可采用两种方法:悲观锁、乐观锁。先看看悲观锁:用户1读取数据后,用锁将其读取的数据锁上,这时用户2是读取不到数据的,只有用户1释放锁后用户2才可以读取,同样用户2读取数据也锁上。这样就可以解决更新丢失的问题了。
二、乐观锁
乐观锁:不是锁,是一种冲突检测机制,如Hibernate就是这样。
乐观锁的并发性较好,因为我改的时候,别人随边修改。
乐观锁的实现方式:常用的是版本的方式(每个数据表中有一个版本字段version,某一个用户更新数据后,版本号+1,另一个用户修改后再+1,当用户更新发现数据库当前版本号与读取数据时版本号不一致(等于小于数据库当前版本号),则更新不了。
7.5.4.1 数据库锁相关概念
为了确保并发用户在存取同一数据库对象时的正确性(即无丢失修改、可重复读、不读“脏”数据),数据库中引入了锁机制。基本的锁类型有两种:排它锁(exclusive locks 记为x 锁)和共享锁(share locks记为 s锁)。加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
排它锁:若事务t对数据d加x锁,则其它任何事务都不能再对d加任何类型的锁,直至t 释放d 上的x 锁;一般要求在修改数据前要向该数据加排它锁,所以排它锁又称为写锁。
共享锁:若事务t对数据d加s 锁,则其它事务只能对d加 s锁,而不能加x 锁,直至t 释放d 的s 锁;一般要求在读取数据前要向该数据加共享锁,所以共享锁又称为读锁。
7.5.4.1.1 悲观封锁
锁在用户修改之前就发挥作用:
Select ..for update(nowait)
Select * from tab1 for update
用户发出这条命令之后,oracle将会对返回集中的数据建立行级封锁,以防止其他用户的修改。
如果此时其他用户对上面返回结果集的数据进行dml或ddl操作都会返回一个错误信息或发生阻塞。
1:对返回结果集进行update或delete操作会发生阻塞。
2:对该表进行ddl操作将会报:Ora-00054:resource busy and acquire with nowait specified.
原因分析
此时Oracle已经对返回的结果集上加了排它的行级锁,所有其他对这些数据进行的修改或删除操作都必须等待这个锁的释放,产生的外在现象就是其他的操作将发生阻塞,这个这个操作commit或rollback.
同样这个查询的事务将会对该表加表级锁,不允许对该表的任何ddl操作,否则将会报出ora-00054错误::resource busy and acquire with nowait specified.
7.5.4.1.2 乐观封锁
乐观的认为数据在select出来到update进取并提交的这段时间数据不会被更改。这里面有一种潜在的危险就是由于被选出的结果集并没有被锁定,是存在一种可能被其他用户更改的可能。因此Oracle仍然建议是用悲观封锁,因为这样会更安全。乐观锁一般通过程序版本控制来实现,如Hibernate
7.5.4.1.3 阻塞
定义:
当一个会话保持另一个会话正在请求的资源上的锁定时,就会发生阻塞。被阻塞的会话将一直挂起,直到持有锁的会话放弃锁定的资源为止。4个常见的dml语句会产生阻塞
INSERT
UPDATE
DELETE
SELECT…FOR UPDATE
INSERT
Insert发生阻塞的唯一情况就是用户拥有一个建有主键约束的表。当2个的会话同时试图向表中插入相同的数据时,其中的一个会话将被阻塞,直到另外一个会话提交或会滚。一个会话提交时,另一个会话将收到主键重复的错误。回滚时,被阻塞的会话将继续执行。
UPDATE 和DELETE当执行Update和delete操作的数据行已经被另外的会话锁定时,将会发生阻塞,直到另一个会话提交或会滚。
Select …for update
当一个用户发出select..for update的错作准备对返回的结果集进行修改时,如果结果集已经被另一个会话锁定,就是发生阻塞。需要等另一个会话结束之后才可继续执行。可以通过发出 select… for update nowait的语句来避免发生阻塞,如果资源已经被另一个会话锁定,则会返回以下错误:Ora-00054:resource busy and acquire with nowait specified.
7.5.4.1.4 死锁-deadlock
定义:当两个用户希望持有对方的资源时就会发生死锁.
即两个用户互相等待对方释放资源时,oracle认定为产生了死锁,在这种情况下,将以牺牲一个用户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚.
例子:
1:用户1对A表进行Update,没有提交。
2:用户2对B表进行Update,没有提交。
此时双反不存在资源共享的问题。
3:如果用户2此时对A表作update,则会发生阻塞,需要等到用户一的事物结束。
4:如果此时用户1又对B表作update,则产生死锁。此时Oracle会选择其中一个用户进行会滚,使另一个用户继续执行操作。
起因:
Oracle的死锁问题实际上很少见,如果发生,基本上都是不正确的程序设计造成的,经过调整后,基本上都会避免死锁的发生。
7.6访问控制语句
7.6.1 ALTER SAML PROVIDER
ALTER SAML PROVIDER <saml_provider_name> WITH SUBJECT <subject_name> ISSUER <issuer_distinguished_name>
语法元素:
<subject_name> ::=
<string_literal>
<issuer_distinguished_name> ::=
<string_literal>
描述:
ALTER SAML PROVIDER 语句修改 SAP HANA 数据库已知的 SAML 提供商的属性。
<saml_provider_name> 必须是一个现有的 SAML 提供商。只有拥有系统权限 USER ADMIN 的数据库
用户允许修改 SAML 提供商。
<subject_name> 以及 <issuer_distinguished_name>是 SAML 身份提供程序中证书对应的名字。
系统和监控视图:
SAML_PROVIDER:显示所有 SAML 提供商主题名和 issuer_name。
7.6.2 ALTER USER
语法:
ALTER USER <user_name> <alter_user_option>
语法元素:
<alter_user_option> ::=PASSWORD
| <user_parameter_option>
| IDENTIFIED EXTERNALLY AS <external_identity> [<user_parameter_option>]
| RESET CONNECT ATTEMPTS
| DROP CONNECT ATTEMPTS
| DISABLE PASSWORD LIFETIME
| FORCE PASSWORD CHANGE
| DEACTIVATE [USER NOW]
| ACTIVATE [USER NOW]
| DISABLE <authentication_mechanism>
| ENABLE <authentication_mechanism>
| ADD IDENTITY <provider_identity>...
| ADD IDENTITY <external_identity> FOR KERBEROS
| DROP IDENTITY <provider_info>...
| DROP IDENTITY FOR KERBEROS
| <string_literal>
<authentication_mechanism> ::= PASSWORD | KERBEROS | SAML
<provider_identity> ::=<mapped_user_name> FOR SAML PROVIDER <saml_provider_name>| <external_identity> FOR KERBEROS
<mapped_user_name> ::=ANY | <string_literal>
<saml_provider_name> ::=<simple_identifier>
<provider_info> ::= FOR SAML PROVIDER <saml_provider_name>
<user_parameter_option> ::=<set_user_parameters> [<clear_user_parameter_option>] | <clear_user_parameter_option>
<set_user_parameters> ::=SET PARAMETER CLIENT = <string_literal>
<clear_user_parameter_option> ::=CLEAR PARAMETER CLIENT| CLEAR ALL PARAMETERS
<external_identity> ::=<simple_identifier>
描述:
ALTER USER 语句修改数据库用户。 <user_name>必须指定一个现有的数据库用户。
每个用户可以为自己执行 ALTER USER。但并非所有<alter_user_option>可以由用户自己指定。对于<alter_user_option>其他用户,只有拥有系统权限 USER ADMIN 权限的用户可以执行 ALTER USER。
使用 PASSWORD 创建的用户不能修改为 EXTERNALLY,反之亦然。但他们的
你可以使用此命令更改用户的密码。密码的修改必须遵循当前数据库定义的规则,包括最小密码长度和定义的字符类型(大写、小写、数字、特殊字符)必须是密码的一部分。用户根据指定数据库实例定义的策略,必须定期更换密码,或者由首次连接到数据库实例的用户,自己更改密码。
你可以更改外部认证。外部用户使用外部系统需要进行身份验证,例如, Kerberos 系统。这些用户没有密码,但是有 Kerberos 实体名称。有关外部身份的详细信息,请联系您的域管理员。
<user_parameter_option>可以用来设置、修改或者清除用户参数 CLIENT。
<set_user_parameters>用来为数据库中的用户设置用户参数 CLIENT。
当使用报表时,该用户参数 CLIENT 可以用于限制用户 <user_name>访问有关特定客户端的信息。
<user_parameter_option>不能由用户自己指定。
如果在成功连接(正确的用户/密码组合)前,达到参数 MAXIMUM_INVALID_CONNECT_ATTEMPTS(参见监控视图 M_PASSWORD_POLICY)定义的错误次数,用户将在允许重新连接前,被锁定几分钟。拥有系统权限 USER ADMIN 的用户或者用户自己,可以使用命令 ALTER USER <user_name>
RESET CONNECT ATTEMPTS 可以删除已发生的无效连接尝试的信息。
拥有系统权限 USER ADMIN 的用户可以使用命令 ALTER USER <user_name> DISABLE PASSWORD
LIFETIME 排除用户<user_name>的所有密码生命周期检查。这应该只为技术用户使用,而非正常的数据库用户。
拥有系统权限 USER ADMIN 的用户可以使用命令 ALTER USER <user_name> FORCE PASSWORD CHANGE 强制用户<user_name>在下次连接后立即修改密码,然后才可以正常工作。
拥有系统权限 USER ADMIN 的用户可以使用命令 ALTER USER <user_name> DEACTIVATE USER NOW关闭/锁定用户<user_name>的账号。用户<user_name>的账号关闭/锁定之后,用户将不能连接到
SAP HANA 数据库。欲重新激活/解锁用户<user_name>,系统权限 USER ADMIN 用户使用命令USER <user_name> ACTIVATE USER NOW,或者,在用户使用 PASSWORD 身份验证机制的情况下,使用 ALTER USER <user_name> PASSWORD
拥有系统权限 USER ADMIN 的用户可以使用命令 ALTER USER <user_name> ACTIVATE USER NOW 重新激活/解锁之前已经关闭的用户<user_name>账号。
配置参数:
有关密码的配置参数,可以查看监控视图 M_PASSWORD_POLICY。这些参数存储在
indexserver.ini, 'password policy'部分中。相关的参数描述可以在 SAP HANA 安全指南,附录,密码策略参数中找到。
系统和监控视图:
USERS: 显示所有用户、用户的创建者、创建时间和当前状态的信息。
USER_PARAMETERS:显示定义的 user_parameters,目前只提供 CLIENT。
INVALID_CONNECT_ATTEMPTS:显示每个用户无效连接的尝试次数。
LAST_USED_PASSWORDS: 显示用户上次密码修改日期。
M_PASSWORD_POLICY:显示描述密码所允许的样式的配置参数及其生命周期。
例子:
在可能使用给定的密码连接数据库以及已有的 SAML 提供商 OUR_PROVIDER 断言之前,用户名为NEW_USER 的用户已经创建完成。由于断言将提供数据库用户名, <mapped_user_name>设为ANY。这由如下的语句完成:
CREATEUSER new_user PASSWORD Password1 WITHIDENTITYANYFOR SAML PROVIDER OUR_PROVIDER;
现在,该用户将被强制修改密码,用户被禁止使用 SAML。
ALTERUSER new_user FORCE PASSWORD CHANGE;
ALTERUSER new_user DISABLE SAML;
假设用户已经过于频繁的尝试一个错误的密码,管理员将重置无效的连接尝试数为零。
ALTERUSER new_user RESETCONNECT ATTEMPTS;
用户 new_user 应当允许使用 KERBEROS 机制进行身份验证。因此,需要定义该连接的外部身份。
ALTERUSER new_user ADDIDENTITY'testkerberosName'FOR KERBEROS;
ALTERUSER new_user ENABLE KERBEROS;
另一方面,用户 new_user 将放松使用 SAML 提供商 OUR_PROVIDER 断言的可能性。
ALTERUSER new_user DROPIDENTITYFOR SAML PROVIDER OUR_PROVIDER;
最后,管理员希望禁止此用户 new_user 的所有连接,因为他最近执行的可疑操作。
ALTERUSER new_user DEACTIVATE;
7.6.3 CREATE ROLE
语法:
CREATE ROLE <role_name>
语法元素:
<role_name> ::=
描述:
CREATE ROLE 语句创建一个新的角色。
只有拥有系统权限 ROLE ADMIN 的用户可以创建新角色。
指定的角色名称不能与现有用户或角色的名称相同。
角色是权限的一个命名集合,可以授予一个用户或角色。如果你想允许多个数据库用户执行相同的操作,你可以创建一个角色,授予该角色所需的权限,并将角色授予不同的数据库用户。
每个用户允许将权限授予一个已有的角色,但只有只有拥有系统权限 ROLE ADMIN 的用户可以将角色授予角色和用户。
SAP HANA 数据库提供了四种角色:
PUBLIC:每个数据库用户默认已被授予该角色。
该角色包括只读访问系统视图、监控视图和一些存储过程的执行权限。这些权限可以被撤销。
该角色可以授予过后将被撤销的权限。
MODELING:该角色包含使用 SAP HANA Studio 信息建模器所需的权限。
CONTENT_ADMIN:该角色包含与 MODELING 角色相同的角色,但是使用扩展该角色将被允许授予其他用户这些权限。此外,它包含了与导入对象工作的元库权限。
MONITORING:该角色包含所有元数据、当前的系统状态、监控视图和服务器统计数据的只读访问。
系统和监控视图:
ROLES:显示所有角色、它们的创建者和创建时间。
GRANTED_ROLES:显示每个用户或角色被授予的角色。
GRANTED_PRIVILEGES:显示每个用户或角色被授予的权限。
例子:
创建名称为 role_for_work_on_my_schema 的角色。
CREATE ROLE role_for_work_on_my_schema;
7.6.4 CREATE SAML PROVIDER
语法:
CREATE SAML PROVIDER <saml_provider_name> WITH SUBJECT <subject_distinguished_name> ISSUER <issuer_distinguished_name>
描述:
CREATE SAML PROVIDER 语句定义 SAP HANA 数据库已知的 SAML 提供商。 <saml_provider_name>必须与已有的 SAML 提供商不同。
只有拥有系统权限 USER ADMIN 的用户可以创建 SAML 提供商,每个有该权限的用户允许删除任何 SAML 提供商。
需要一个现有的 SAML 提供商,能够为用户指定 SAML 连接。 <subject_distinguished_name> 和<issuer_distinguished_name>是 SAML 提供商使用的 X.509 证书的主题和发布者的 X.500 可分辨名字。这些名字的语法可以在 ISO/IEC 9594-1 中找到。
SAML 概念的详细细节可以在 Oasis SAML 2.0 中找到。
系统和监控视图:
SAML_PROVIDERS:显示所有 SAML 提供商主题名和发布者名字。
例子:
创建一个名称为 gm_saml_provider 的 SAML 提供商,指定主题和发布者所属的公司。
CREATE SAML PROVIDER gm_saml_provider WITH SUBJECT 'CN = wiki.detroit.generalmotors.corp,OU = GMNet,O = GeneralMotors,C = EN'
ISSUER 'E = John.Do@gm.com,CN = GMNetCA,OU = GMNet,O = GeneralMotors,C = EN';
7.6.5 CREATE USER
语法:
CREATE USER <user_name> [PASSWORD
语法元素:
<external_identity> ::=<simple_identifier> | <string_literal>
<provider_identity> ::=<mapped_user_name> FOR SAML PROVIDER <saml_provider_name> | <external_identity> FOR KERBEROS
<mapped_user_name> ::=ANY | <string_literal>
<saml_provider_name> ::=<simple_identifier>
<set_user_parameters> ::=SET PARAMETER CLIENT = <string_literal>
描述:
CREATE USER 创建一个新的数据库用户。
只有拥有系统权限 USER ADMIN 的用户可以创建另一个数据库用户。
指定的用户名必须不能与已有的用户名、角色名或集合名相同。
SAP HANA 数据库提供的用户有: SYS, SYSTEM, _SYS_REPO,_SYS_STATISTICS。
数据库中的用户可以通过不同的机制进行身份验证,内部使用密码的身份验证机制和而外部则使用 Kerberos 或 SAML 等机制验证。用户可以同时使用不止一种方式进行身份验证,但在同一时间,只有一个密码和一个外部识别有效。与之相反的是,同一时间可以有一个以上<provider_identity>为一个用户存在。至少需指定一种验证机制允许用户连接和在数据库实例上工作。
由于兼容性原因,语法 IDENTIFIED EXTERNALLY AS <external_identity>以及<external_identity> FORKERBEROS 会继续使用。
密码必须遵循当前数据库定义的规则。密码的修改必须遵循当前数据库定义的规则,包括最小密码长度和定义的字符类型(大写、小写、数字、特殊字符)必须是密码的一部分.用户根据指定数据库实例定义的策略,必须定期更换密码。在执行 CREATE USER 命令期间提供的密码将被视为已提供, <user_name>将会修改为大写作为每个<simple_identifier>。
外部用户使用外部系统进行身份验证,例如 Kerberos 系统。这些用户没有密码,但是有 Kerberos实体名称。有关外部身份的详细信息,请联系您的域管理员。
如果 ANY 作为映射的用户名, SAML 断言将包含断言生效的数据库用户名。 <saml_provider_name>必须指定一个已有的 SAML 提供商。
<set_user_parameters>可以用于为数据库中的用户设置用户参数 CLIENT。
当使用报表时,该用户参数 CLIENT 可以用于限制用户 <user_name>访问有关特定客户端的信息。
<user_parameter_option>不能由用户自己指定。
对于每个数据库用户,数据集合将以包含用户名方式创建。这是不能显式删除。用户删除时,该集合也将被删除。数据库用户拥有该集合,并当他不显式指定集合名称时,作为自己的默认集合使用。
配置参数:
与密码相关的配置参数可以在监控视图 M_PASSWORD_POLICY 查看。这些参数存储 indexserver.ini的'password policy'部分中。相关的参数描述可以在 SAP HANA 安全指南,附录,密码策略参数中找到。
系统和监控视图:
USERS: 显示所有用户、用户的创建者、创建时间和当前状态的信息。
USER_PARAMETERS:显示定义的 user_parameters,目前只提供 CLIENT。
INVALID_CONNECT_ATTEMPTS:显示每个用户无效连接的尝试次数。
LAST_USED_PASSWORDS: 显示用户上次密码修改日期。
M_PASSWORD_POLICY:显示描述密码所允许的样式的配置参数及其生命周期。
SAML_PROVIDERS;显示已有的 SAML 提供商。
SAML_USER_MAPPING:显示每个 SAML 提供商的映射用户名。
例子:
在可能使用给定的密码连接数据库以及已有的 SAML 提供商 OUR_PROVIDER 断言之前,用户名为NEW_USER 的用户已经创建完成。由于断言将提供数据库用户名, <mapped_user_name>设为ANY。 这由如下的语句完成:
CREATEUSER new_user PASSWORD Password1 WITHIDENTITYANYFOR SAML PROVIDER OUR_PROVIDER;
7.6.6 DROP ROLE
语法:
DROP ROLE <role_name>
例子:
DROP ROLE 语句删除角色。 <drop_name>必须指定已经存在的角色。
只有拥有系统权限 ROLE ADMIN 的用户可以删除角色。任何有该权限的用户允许删除任意角色。
只有 SAP HANA 提供的角色可以删除: PUBLIC, CONTENT_ADMIN, MODELING and MONITORING。
如果一个角色授予用户或角色,在角色删除时将被撤销。撤销角色可能会导致一些视图无法访问或者存储过程再也不工作,如果一个视图或存储过程依赖于该角色中的任意权限,会发生这种情况。
系统和监控视图:
ROLES:显示所有角色、它们的创建者和创建时间。
GRANTED_ROLES:显示每个用户或角色被授予的角色。
GRANTED_PRIVILEGES:显示每个用户或角色被授予的权限。
例子:
创建名为 role_for_work_on_my_schema 的角色,随后立即删除。
CREATE ROLE role_for_work_on_my_schema;
DROP ROLE role_for_work_on_my_schema;
7.6.7 DROP SAML PROVIDER
语法:
DROP SAML PROVIDER <saml_provider_name>
描述:
DROP SAML PROVIDER 语句删除指定的 SAML 提供商。 <saml_provider_name>必须是一个已有的SAML 提供商。如果指定的 SAML 提供商正在被 SAP HANA 用户使用,则该提供商不能被删除。
只有拥有系统 USER ADMIN 权限的用户可以删除 SAML 提供商。
系统和监控视图:
SAML_PROVIDERS:显示所有 SAML 提供商主题名称和 issuer_name。
7.6.8 DROP USER
语法:
DROP USER <user_name> [<drop_option>]
语法元素:
<drop_option> ::= CASCADE | RESTRICT
Default = RESTRICT
描述:
DROP USER 语句删除数据库用户。 <user_name>必须指定一个已有的数据库用户。
只有拥有系统 USER ADMIN 权限的用户可以删除用户。拥有该权限的用户可以删除任何用户。 SAPHANA 数据库提供的用户不能删除: SYS, SYSTEM, _SYS_REPO,_SYS_STATISTICS。
如果显式或隐式指定了<drop_option> RESTRICT,则当用户为数据集合的所有者或以及创建了其他集合,或者该用户集合下存有非本人创建的对象时,该用户不能被删除。
如果指定了<drop_option> CASCADE,包含用户名的集合和属于该用户的集合,连同所有存在这些集合中的对象(即使是由其他用户创建)一起删除。用户拥有的对象,即使为其他集合中的一部分,将被删除。依赖于已删除对象的对象将被删除,即使已删除的用户所拥有的公共同义词。
已删除对象的权限将被撤销,授予已删除用户的权限也将被撤销。撤销权限可能会造成更多的撤销操作,如果这些权限被进一步授予。
已删除用户创建的用户和由他们创建的角色将不会被删除。已删除的用户创建的审核策略也不会被删除。
如果用户存在一个已打开的会话,仍然可以删除该用户。
系统和监控视图:
已删除用户将从以下视图删除:
USERS: 显示所有用户、用户的创建者、创建时间和当前状态的信息。
USER_PARAMETERS:显示定义的 user_parameters,目前只提供 CLIENT。
INVALID_CONNECT_ATTEMPTS:显示每个用户无效连接的尝试次数。
LAST_USED_PASSWORDS: 显示用户上次密码修改日期。
M_PASSWORD_POLICY:显示描述密码所允许的样式的配置参数及其生命周期。
对象的删除可能影响所有描述对象的系统视图,例如 TABLES, VIEWS,PROCEDURES, ... .
对象的删除可能影响描述权限的视图:例如 GRANTED_PRIVILEGES 以及所有监控视图,例如M_RS_TABLES, M_TABLE_LOCATIONS, ...
例子:
例如,使用这条语句创建名称为 NEW_USERd 的用户:
CREATEUSER new_user PASSWORD Password1;
已有的用户 new_user 将被删除,连同其所有对象一起:
DROPUSER new_user CASCADE;
7.6.9 GRANT
语法:
GRANT <system_privilege>,... TO
语法元素:
<system_privilege> ::=AUDIT ADMIN | BACKUP ADMIN| CATALOG READ | CREATE SCENARIO| CREATE SCHEMA | CREATE STRUCTURED PRIVILEGE| DATA ADMIN | EXPORT| IMPORT
| INIFILE ADMIN| LICENSE ADMIN | LOG ADMIN| MONITOR ADMIN | OPTIMIZER ADMIN| RESOURCE ADMIN | ROLE ADMIN| SAVEPOINT ADMIN | SCENARIO ADMIN| SERVICE ADMIN | SESSION ADMIN| STRUCTUREDPRIVILEGE ADMIN | TRACE ADMIN| USER ADMIN | VERSION ADMIN|
系统权限用来限制管理任务。定义如下的系统权限:
AUDIT ADMIN
该权限控制以下审计有关命令的执行: CREATE AUDIT POLICY, DROP AUDIT POLICY and ALTER AUDIT POLICY.
BACKUP ADMIN
该权限授权 ALTER SYSTEM BACKUP 命令来定义和启动备份进程或执行恢复过程。
CATALOG READ
该权限赋予所有用户未经过滤的只读访问所有的系统和监控视图。正常情况下,这些视图的内容根据正在访问用户的权限过滤。权限 CATALOG READ 使用户有只读访问所有的系统和监控视图的内容。
CREATE SCENARIO
该权限控制计算场景和多维数据集(数据库计算)的创建。
CREATE SCHEMA
该权限控制使用 CREATE SCHEMA 命令创建数据库数据集合。每个用户都有个集合。拥有该权限,用户允许创建更多的集合。
CREATE STRUCTURED PRIVILEGE
该权限授权创建结构化权限(分析权限)。注意,只有分析权限的所有者可以进一步授予其他用户或者角色,以及撤销。
DATA ADMIN
该强大的权限授权读取系统和监控视图中的所有数据,包括在 SAP HANA 数据库中执行 DDL (DataDefinition Language) 以及 DDL 命令。这表示拥有该权限的用户不能选择或者修改存储在其他用户表中的数据,但是可以修改表的定义或甚至删除该表。
EXPORT
该权限授权通过 EXPORT TABLE 命令导出数据库中的活动。注意,除了该权限,用户仍需要将要导出的源表 SELECT 权限。
IMPORT
该权限授权通过 IMPORT TABLE 命令导入数据库中的活动。注意,除了该权限,用户仍需要将要导入的目标表 SELECT 权限。
INIFILE ADMIN
该权限授权修改系统设置的不同方式。
LICENSE ADMIN
该权限授权 SET SYSTEM LICENSE 命令安装一个新的许可。
LOG ADMIN
该权限授权 ALTER SYSTEM LOGGING [ON|OFF] 命令启用或禁用 刷新日志机制。
MONITOR ADMIN
该权限授权关于 EVENT 的 ALTER SYSTEM 命令。
OPTIMIZER ADMIN
该权限授权关于 SQL PLAN CACHE 和 ALTER SYSTEM 的 ALTER SYSTEM 命令。
UPDATE STATISTICS 命令影响查询优化器的行为。
RESOURCE ADMIN
该权限授权关于资源,例如 ALTER SYSTEM RECLAIM、 DATAVOLUME 和 ALTER SYSTEM RESET
MONITORING VIEW 的命令,并且授权 Management Console 中的许多命令。
ROLE ADMIN
该权限授权使用 CREATE ROLE 命令创建和删除角色。同时也授权使用 GRANT 和 REVOKE 命令授予和撤销角色。
SAVEPOINT ADMIN
该权限使用 ALTER SYSTEM SAVEPOINT 命令授权保存点流程的执行。
SCENARIO ADMIN
该权限授权所有计算场景相关的活动,包括新建。
SERVICE ADMIN
该权限授权 ALTER SYSTEM [START|CANCEL|RECONFIGURE] 命令,用于管理数据库中的系统服务。
SESSION ADMIN
该权限授权会话相关的 ALTER SYSTEM 命令 ,停止或重新连接用户会话或者修改会话参数。
STRUCTUREDPRIVILEGE ADMIN
该权限授权结构化权限的创建、重新激活和删除。
TRACE ADMIN
该权限授权数据库追踪文件的操作 ALTER SYSTEM [CLEAR|REMOVE] TRACES 命令。
USER ADMIN
该权限授权使用 CREATE USER, ALTER USER, and DROP 命令创建和修改用户。
VERSION ADMIN
该权限授权多版本并发控制(MVCC) ALTER SYSTEM RECLAIM VERSION SPACE command 命令。
SAP HANA 数据库组件可以创建自己需要的权限。这些权限使用组件名作为系统权限的第一标识符,使用组件-权限-名字作为第二标识符。目前元库使用该特点。有关名为 REPO.
<schema_privilege> ::=CREATE ANY| DEBUG| DELETE| DROP| EXECUTE| INDEX| INSERT| SELECT| TRIGGER| UPDATE
数据集合权限用于集合和存储在该集合中对象的访问和修改。集合权限的定义如下:
CREATE ANY
该权限允许用户在数据库中创建各种对象,尤其是表、视图、序列、同义词、 SQL 脚本、或者存储过程。
DELETE, DROP, EXECUTE, INDEX, INSERT, SELECT, UPDATE
指定的权限被授予每个目前和以后存储在集合中的每个对象。有关权限详细说明,请参阅下面的描述对象权限的部分,请检查以下权限适用于哪些类型的对象。
<object_privilege> ::=ALL PRIVILEGES| ALTER| DEBUG| DELETE| DROP| EXECUTE| INDEX| INSERT| SELECT| TRIGGER| UPDATE|
对象权限用于限制用户访问和修改数据库对象,例如表、 视图、序列或者存储过程以及诸如此类。并不是所有的这些权限适用于所有类型的数据库对象。
对于对象类型允许的权限,见下表。
对象权限的定义如下:
ALL PRIVILEGES
该权限为所有 DDL(数据定义语言)和 DML(数据操纵语言)权限的组合。该权限一方面是授予人目前有的和允许进一步授予的权限,另一方面,特定对象上可以被授予的权限。该组合为给定的授予人和对象进行动态评估。 ALL PRIVILEGES 适用于表或试图。
ALTER
该 DDL 权限授权对象的 ALTER 命令。
DEBUG
该 DML 权限授权 存储过程或者计算视图的调试功能。
DELETE
该 DML 权限授权对象的 DELETE 和 TRUNCATE 命令。
DROP
该 DDL 权限授权对象的 DROP 命令。
EXECUTE
该 DML 权限授权 SQL Script 函数或者使用 CALLS 或 CALL 命令的存储过程。
INDEX
该 DDL 权限授权对象索引的创建、修改或者删除。
INSERT
该 DML 权限授权对象的 INSERT 命令。 INSERT 连同 UPDATE 权限一起允许使用对该对象的 REPLACE
和 UPSERT 命令。
SELECT
该 DML 权限授予对象的 SELECT 命令或者序列的使用。
TRIGGER
该 DDL 权限授权指定表或者指定集合中表的 CREATE TRIGGER / DROP TRIGGER 命令。
UPDATE
该 DML 权限授权对象的 UPDATE 命令 INSERT 连同 UPDATE 权限一起允许使用对该对象的 REPLACE
和 UPSERT 命令。
SAP HANA 数据库组件可以创建自己需要的权限。这些权限使用组件名作为系统权限的第一标识符,使用组件-权限-名字作为第二标识符。目前元库使用该特点。有关名为 REPO.
对视图的 DELETE, INSERT and UPDATE 操作只适用于可更新的视图,表示这些视图遵守这样的一些限制:不包含联接、 UNION,没有聚合以及进一步的一些限制。
DEBUG 只对计算视图适用,而非其他类型的视图。
这些限制适用于同义词,以及同义词代表的对象也适用。
<object_name> ::=<table_name>| <view_name>| <sequence_name>| <procedure_name>| <synonym_name>
对象权限用于限制用户访问和修改数据库对象,例如表、 视图、序列、存储过程和同义词。
grantee 可以是一个用户或者角色。在权限或角色授予角色的情况下,角色授予的所有用户,将有指定的权限或角色。
角色是权限的一个命名集合,可以授予一个用户或角色。
如果你想允许多个数据库用户执行相同的操作,你可以创建一个角色,授予该角色所需的权限,并将角色授予不同的数据库用户。
当授予角色给角色时,将建立一颗角色树。当将一个角色(R)授予另一个角色或者用户(G) , G 将拥有所有直接授予 R 的权限和角色。
描述:
GRANT 用于授予权限和结构化权限给用户和角色,也用于授予权限给用户和其他角色。
指定的用户、角色、对象和结构化权限必须在使用 GRANT 命令前已经存在。
只有拥有权限并且允许进一步授予权限的用户才能授予权限。每个拥有 ROLE ADMIN 权限的用户允许授予角色给其他角色和用户。
用户不能授予自己权限。
SYSTEM 用户有至少一个系统权限和 PUBLIC 角色。所有其他用户也有 PUBLIC 角色。这些权限和角色不能自己撤销。
虽然 SYSTEM 用户拥有许多权限,该用户不能选择或者修改其他用户的表,如果他没有显式地授权可以这样做。
SYSTEM 用户有在自己默认集合中创建对象的权限,名字和用户本身一样。
对于由用户创建的表,他们拥有所有权限并且可以将权限授予给用户和角色。
对依赖于例如基于表的视图的其他对象,可能发生的是用户如果没有底层对象的权限则在依赖对象也没有权限。或者可能发生的是用户有权限,但是不允许进一步授权。该用户将不能授予这些权限。
WITH ADMIN OPTION 和 WITH GRANT OPTION 指定了已分配的权限可以被特定的用户进一步分配,或者被拥有指定角色的用户分配。
使用 GRANT STRUCTURED PRIVILEGE <structured_privilege_name>,一个之前定义过的分析权限(基于通用结构化权限)被分配给用户或角色。该分析权限用于限制只读访问分析视图、属性视图和计算视图特定的数据,通过过滤属性值。
系统和监控视图:
USERS: 显示所有用户、用户的创建者、创建时间和当前状态的信息。
ROLES:显示所有角色、它们的创建者和创建时间。
GRANTED_ROLES:显示每个用户或角色被授予的角色。
GRANTED_PRIVILEGES:显示每个用户或角色被授予的权限。
例子:
假设已经创建了拥有创建集合、角色和用户权限的用户,他新建了数据集合:
CREATESCHEMA myschema;
另外,他还在该集合中新建了一张名为 work_done 的表。
CREATETABLE myschema.work_done (t TIMESTAMP, userNVARCHAR (256), work_done VARCHAR (256);
他创建了一个新的用户 named worker,在可能使用给定的密码和名为role_for_work_on_my_schema 的角色连接数据库
CREATEUSER worker PASSWORD His_Password_1;
CREATE ROLE role_for_work_on_my_schema;
他将其集合下所有对象的 SELECT 权限授予 role_for_work_on_my_schema 角色:
GRANTSELECTONSCHEMA myschema TO role_for_work_on_my_schema;
另外,用户将表 work_done to 的 INSERT 权限授予 role_for_work_on_my_schema 角色:
GRANTINSERTON myschema.work_done TO role_for_work_on_my_schema;
接着,他将角色授予新的用户:
GRANT role_for_work_on_my_schema TO worker WITHGRANTOPTION;
另外, worker 用户被直接授予表删除权限。该权限的选项允许进一步授予此权限。
GRANTDELETEON myschema.work_done TO worker;
现在,用户将创建任何类型对象的权限授予 worker 用户:
GRANTCREATEANYONSCHEMA myschema TO worker;
结果, worker 用户拥有集合 myschema 下所有表和视图的 SELECT 权限,表 myschema.work_done的 INSERT 和 DELETE 权限,以及在集合 myschema 下创建对象的权限。另外,该用户允许授予表myschema.work_done 的 DELETE 权限给其他用户和角色。
第二个例子中,用户有相应的权限,包括允许进一步授予权限、将系统权限 INIFILE ADMIN 和TRACE ADMIN 授予已有的用户 worker。他允许 worker 进一步授予这些权限。
GRANT INIFILE ADMIN, TRACE ADMIN TO worker WITH ADMIN OPTION;
7.6.10 REVOKE
语法:
REVOKE <system_privilege>,... FROM
语法元素:
有关语法元素的定义,参见 GRANT。
描述:
REVOKE 语句撤销指定的角色或者结构化权限或者从指定用户或角色的指定对象中撤销权限。
只有拥有授权的用户可以撤销该权限。这对于有 ROLE ADMIN 的用户和角色的撤销也一样。
SYSTEM 用户有至少一个系统权限和 PUBLIC 角色。所有其他用户也有 PUBLIC 角色。这些权限和角色不能自己撤销。
如果用户也被授予一个角色,就不可能撤销属于该角色的一些权限。这种情况下,必须撤销所有角色,并且需要用户已授予给他的权限。
如果一个角色授予用户或角色,在角色删除时将被撤销。撤销角色可能会导致一些视图无法访问或者存储过程再也不工作,如果一个视图或存储过程依赖于该角色中的任意权限,会发生这种情况。
撤销已用 WITH GRANT OPTION 或 WITH ADMIN OPTION 授权的权限将导致不仅从指定的用户中撤销,也将从所有该用户直接或间接授权给用户和角色的权限中撤销。
由于权限可以用个不同的用户授给用户或角色,用户撤销该权限并一定意味着,该用户将失去这权限。有关语法元素的详请,请参见 GRANT。
系统和监控视图:
USERS: 显示所有用户、用户的创建者、创建时间和当前状态的信息。
ROLES:显示所有角色、它们的创建者和创建时间。
GRANTED_ROLES:显示每个用户或角色被授予的角色。
GRANTED_PRIVILEGES:显示每个用户或角色被授予的权限。
例子:
假设用户已经执行如下语句:
CREATEUSER worker PASSWORD His_Password_1;
CREATE ROLE role_for_work_on_my_schema;
CREATETABLE myschema.work_done (t TIMESTAMP, userNVARCHAR (256), work_done VARCHAR (256);
GRANTSELECTONSCHEMA myschema TO role_for_work_on_my_schema;
GRANTINSERTON myschema.work_done TO role_for_work_on_my_schema;
GRANT role_for_work_on_my_schema TO worker;
GRANT TRACE ADMIN TO worker WITH ADMIN OPTION;
GRANTDELETEON myschema.work_done TO worker WITHGRANTOPTION;
已授权的用户允许撤销这些权限。他从角色中撤销权限,因此,暗示着从所有已授予角色的用户撤销权限。另外, worker 用户将不再有 TRACE ADMIN 权限。撤销权限将导致撤回操作发生至worker 用户授予该权限的所有用户。
REVOKESELECTONSCHEMA myschema FROM role_for_work_on_my_schema;
REVOKE TRACE ADMIN FROM worker;
7.7数据导入导出语句
7.7.1 EXPORT
语法:
EXPORT <object_name_list> AS <export_format> INTO
语法元素:
WITH <export_option_list>:
可以使用 WITH 子句传入 EXPORT 选项。
<object_name_list> ::= <OBJECT_NAME>,... | ALL
<export_import_format> ::= BINARY | CSV
<export_option_list> ::= <export_option> | <export_option_list> <export_option>
<export_option> ::=REPLACE |CATALOG ONLY |NO DEPENDENCIES |SCRAMBLE [BY
描述:
EXPORT 命令以指定的格式 BINARY 或者 CSV,导出表、视图、列视图、同义词、序列或者存储过程。临时表的数据和"no logging"表不能使用 EXPORT 导出表。
OBJECT_NAME
将导出对象的 SQL 名。欲导出所有集合下的所有对象,你要使用 ALL 关键字。如果你想导出指定集合下的对象,你应该使用集合名和星号,如"SYSTEM"."*"。
BINARY
表数据将以内部 BINARY 格式导出。使用这种方式导出数据比以 CSV 格式快几个数量级。只有列式表可以以二进制格式导出。行式表总是以 CSV 格式导出,即使指定了 BINARY 格式。
CSV
表数据将以 CSV 格式导出。导出的数据可以导入至其他数据库中。另外,导出的数据顺序可能被打乱。列式和行式表都可以以 CSV 格式导出。
FULL_PATH
将导出的服务器路径。
注意:当使用分布式系统, FULL_PATH 必须指向一个共享磁盘。由于安全性原因,路径可能不包含符号链接,也可能不指向数据库实例的文件夹内,除了'backup' 和 'work'子文件夹。有效路径(假设数据库实例位于/usr/sap/HDB/HDB00)的例子:
'/tmp'
'/usr/sap/HDB/HDB00/backup'
'/usr/sap/HDB/HDB00/work'
REPLACE
使用 REPLACE 选项,之前导出的数据将被删除,而保存最新导出的数据。如果未指定 REPLACE 选项,如果在指定目录下存在先前导出的数据,将抛出错误。
CATALOG ONLY
使用 CATALOG ONLY 选项,只导出数据库目录,不含有数据。
NO DEPENDENCIES
使用 NO DEPENDENCIES 选项,将不导出已导出对象的相关对象。
SCRAMBLE
以 CSV 格式导出时,使用 SCRAMBLE [BY '
THREADS
表示用于并行导出的线程数。
使用的线程数
给定 THREADS 数目指定并行导出的对象数,默认为 1。增加数字可能减少导出时间,但也会影响系统性能。
应当考虑如下:
对于单个表, THREADS 没有效果。
对于视图或者存储过程,应使用2 个或更多的线程(最多取决于对象数)。
对于整个集合,考虑使用多余10 个线程(最多取决于系统内核数)。
对于整个 BW / ERP 系统( ALL 关键字)的上千张表,数量大的线程是合理的(最多 256)。
系统和监控视图:
你可以使用系统视图 M_EXPORT_BINARY_STATUS 监控导出的进度。
你可以在如下语句中,使用会话 ID 从相应的视图中终止导出会话。
ALTERSYSTEM CANCEL [WORKIN] SESSION 'sessionId'
导出的详细结果存储在本地会话临时表#EXPORT_RESULT。
例子:
EXPORT"SCHEMA"."*"AS CSV INTO'/tmp'WITHREPLACE SCRAMBLE THREADS 10
7.7.2 IMPORT
语法:
IMPORT <object_name_list> [AS <import_format>] FROM
语法元素:
WITH <import_option_list>:可以使用 WITH 子句传入 IMPORT 选项。
<object_name_list> ::= <object_name>,... | ALL
<import_format> ::= BINARY | CSV
<import_option_list> ::= <import_option> | <import_option_list> <import_option>
<import_option> ::=REPLACE |CATALOG ONLY |NO DEPENDENCIES |THREADS <number_of_threads>
描述:
IMPORT 命令导入表、视图、列视图、同义词、序列或者存储过程。临时表的数据和"no logging"表不能使用 IMPORT 导入。
OBJECT_NAME
将导入对象的 SQL 名。欲导入路径中的所有对象,你要使用 ALL 关键字。如果你想将对象导入至指定集合下,你应该使用集合名和星号,如"SYSTEM"."*"。
BINARY | CSV
导入过程可能忽略格式的定义,因为在导入过程中,将自动检测格式。将以导出的同样格式导入。
FULL_PATH
从该服务器路径导入。
注意:当使用分布式系统, FULL_PATH 必须指向一个共享磁盘。如果未指定 REPLACE 选项,在指定目录下存在相同名字的表,将抛出错误。
CATALOG ONLY
使用 CATALOG ONLY 选项,只导入数据库目录,不含有数据。
NO DEPENDENCIES
使用 NO DEPENDENCIES 选项,将不导入已导入对象的相关对象。
THREADS
表示用于并行导入的线程数。
使用的线程数
给定 THREADS 数目指定并行导入的对象数,默认为 1。增加数字可能减少导入时间,但也会影响系统性能。
应当考虑如下:
对于单个表, THREADS 没有效果。
对于视图或者存储过程,应使用2 个或更多的线程(最多取决于对象数)。
对于整个集合,考虑使用多余10 个线程(最多取决于系统内核数)。
对于整个 BW / ERP 系统( ALL 关键字)的上千张表,数量大的线程是合理的(最多 256)。
系统和监控视图:
你可以使用系统视图 M_IMPORT_BINARY_STATUS 监控导入的进度。
你可以在如下语句中,使用会话 ID 从相应的视图中终止导入会话。
ALTER SYSTEM CANCEL [WORK IN] SESSION 'sessionId'
导入的详细结果存储在本地会话临时表#IMPORT_RESULT。
7.7.3 IMPORT FROM
语法:
IMPORT FROM [<file_type>] <file_path> [INTO <table_name>] [WITH <import_from_option_list>]
语法元素:
WITH <import_from_option_list>:
可以使用 WITH 子句传入 IMPORT FROM 选项。
<file_path> ::= '
<table_name> ::= [<schema_name>.]
<import_from_option_list> ::= <import_from_option> | <import_from_option_list> <import_from_option>
<import_from_option> :: =THREADS <number_of_threads> |BATCH <number_of_records_of_each_commit> |TABLE LOCK |NO TYPE CHECK |SKIP FIRST <number_of_rows_to_skip>
ROW |COLUMN LIST IN FIRST ROW |COLUMN LIST ( <column_name_list> ) |RECORD DELIMITED BY '<string_for_record_delimiter>' |FIELD DELIMITED BY '<string_for_field_delimiter>' |OPTIONALLY ENCLOSED BY '<character_for_optional_enclosure>' |DATE FORMAT '<string_for_date_format>' |TIME FORMAT '<string_for_time_format>' |TIMESTAMP FORMAT '<string_for_timestamp_format>' |
描述:
IMPORT FROM 语句将外部 csv 文件的数据导入至一个已有的表中。
THREADS:表示可以用于并行导出的线程数。默认值为 1,最大值为 256。
BATCH:表示每个提交中可以插入的记录数。
THREADS 和 BATCH 可以通过启用并行加载和一次提交多条记录,实现加载的高性能。一般而言,对于列式表, 10 个并行加载线程以及 10000 条记录的提交频率是比较好的设置。
TABLE LOCK:锁住表为了更快的导入数据至列式表。如果指定了 NO TYPE CHECK,记录将在插入时,不检查每个字段的类型。
SKIP FIRST
COLUMN LIST IN FIRST ROW:表示在 CSV 文件中第一行的列。
COLUMN LIST ( <column_name_list> ):表示将要插入的字段列表。
RECORD DELIMITED BY '
FIELD DELIMITED BY '
OPTIONALLY ENCLOSED BY '
DATE FORMAT '
TIME FORMAT '
TIMESTAMP FORMAT '
例子:
IMPORTFROM CSV FILE '/data/data.csv'INTO"MYSCHEMA"."MYTABLE"WITH RECORD DELIMITED BY'\n' FIELD DELIMITED BY','