日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

hana SQL函数

發(fā)布時間:2023/12/20 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hana SQL函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1日期

年月日
select
to_date(IN_DATE1,‘yyyy-MM-dd’)
from “_SYS_BIC”.“com.manpower.HR_BB.CAL_004_KQ/CAL_KC”

–時間
select
to_time(CC_SBSJ,‘YYYY-MM-dd HH24:MI:SS’)
from “_SYS_BIC”.“com.manpower.HR_BB.CAL_004_KQ/CAL_KC”

–D查看周幾 DD查看月數(shù) DDD查看當(dāng)前是今年的天數(shù) 都是數(shù)字表示
select
to_char(‘2020-11-11’,‘D’),
to_char(CC_SBSJ,‘DD’),
to_char(CC_SBSJ,‘DDD’)
from “_SYS_BIC”.“com.manpower.HR_BB.CAL_004_KQ/CAL_KC”

–Day英文表示周幾全名 Dy英文簡稱 mon月簡稱 month月全稱 yy年 FF2毫秒保留數(shù)
select
to_char(CC_SBSJ,‘Day’)
from “_SYS_BIC”.“com.manpower.HR_BB.CAL_004_KQ/CAL_KC”

2數(shù)字類型

2.2.1 TINYINT
TINYINT 數(shù)據(jù)類型存儲一個 8 位(1個字節(jié))無符號整數(shù)。 TINYINT 的最小值是 0,最大值是 255。

2.2.2 SMALLINT
SMALLINT 數(shù)據(jù)類型存儲一個 16 (2個字節(jié))位無符號整數(shù)。 SMALLINT 的最小值為-32,768 ,最大值為32, 767。

2.2.3 INTEGER
INTEGER 數(shù)據(jù)類型存儲一個 32 (4個字節(jié))位有符號整數(shù)。 INTEGER 的最小值為-2,147,483,648 ,最大值為 2,147,483,647。

2.2.4 BIGINT
BIGINT 數(shù)據(jù)類型存儲一個 64 (8個字節(jié))位有符號整數(shù)。 INTEGER 的最小值為-9,223,372,036,854,775,808,最大值為 9, 223,372,036,854,775,807。

2.2.5 DECIMAL(精度,小數(shù)位數(shù))或 DEC( p, s)
DECIMAL (p, s) 數(shù)據(jù)類型指定了一個精度為 p 小數(shù)位數(shù)為 s 的定點小數(shù)。精度是有效位數(shù)的總數(shù),范圍從 1 至 34。

3字符類型

字符類型用來存儲包含字符串的值。 VARCHAR類型包含 ASCII字符串,而 NVARCHAR用來存儲 Unicode字符串。

2.3.1 VARCHAR
VARCHAR (n) 數(shù)據(jù)類型定義了一個可變長度的 ASCII 字符串, n 表示最大長度,是一個 1 至5000的整數(shù)值。

2.3.2 NVARCHAR
NVARCHAR (n) 數(shù)據(jù)類型定義了一個可變長度的 Unicode 字符串, n 表示最大長度,是一個1 至 5000的整數(shù)值。

2.3.3 ALPHANUM
ALPHANUM (n) 數(shù)據(jù)類型定義了一個可變長度的包含字母數(shù)字的字符串, n 表示最大長度,是一個 1 至 127的整數(shù)值。

2.3.4 SHORTTEXT
SHORTTEXT (n) 數(shù)據(jù)類型定義了一個可變長度的字符串,支持文本搜索和字符搜索功能。

這不是一個標(biāo)準(zhǔn)的 SQL 類型。選擇一列 SHORTTEXT (n) 列會生成一個 NVARCHAR (n)類型的列。

------------------------------------------------------------------------------

2.4二進(jìn)制類型

二進(jìn)制類型用來存儲二進(jìn)制數(shù)據(jù)的字節(jié)。

2.4.1 VARBINARY
VARBINARY 數(shù)據(jù)類型用來存儲指定最大長度的二進(jìn)制數(shù)據(jù),以字節(jié)為單位, n 代表最大長度,是一個 1 至 5000的整數(shù)。

2.5大對象( LOB)類型

LOB(大對象)數(shù)據(jù)類型, CLOB, NCLOB 和 BLOB,用來存儲大量的數(shù)據(jù)例如文本文件和圖像。 一個 LOB 的最大大小為 2GB。

2.5.1 BLOB
BLOB 數(shù)據(jù)類型用來存儲大二進(jìn)制數(shù)據(jù)。

2.5.2 CLOB
CLOB 數(shù)據(jù)類型用來存儲大 ASCII 字符數(shù)據(jù)。

2.5.3 NCLOB
NCLOB 數(shù)據(jù)類型用來存儲大 Unicode 字符對象。

2.5.4 TEXT
TEXT 數(shù)據(jù)類型指定支持文本搜索功能,這不是一個獨立的 SQL 類型。 選擇一列 TEXT 列會

生成一個 NCLOB 類型的列。

LOB 類型用于存儲和檢索大量的數(shù)據(jù)。 LOB 類型支持以下操作:

lLength(n)以字節(jié)形式返回 LOB 的長度。

lLIKE 可以用來搜索 LOB 列。

LOB 類型有如下限制:

lLOB 列不能出現(xiàn)在 ORDER BY 或 GROUP BY 子句中。

lLOB 列不能出現(xiàn)在 FROM 子句作為聯(lián)接謂詞。

l不能作為謂詞出現(xiàn)在 WHERE 子句中,除了 LIKE, CONTAINS, =或<>。

lLOB 列不能出現(xiàn)在 SELECT 子句作為一個聚合函數(shù)的參數(shù)。

lLOB 列不能出現(xiàn)在 SELECT DISTINCT 語句中。

lLOB 列不能用于集合操作,除了 EXCEPT, UNION ALL 是個例外。

lLOB 列不能作為主鍵。

lLOB 列不能使用 CREATE INDEX 語句。

lLOB 列不能使用統(tǒng)計信息更新語句。

2.6SQL 數(shù)據(jù)類型和列存儲數(shù)據(jù)類型之間的映射

2.7數(shù)據(jù)類型轉(zhuǎn)換

本節(jié)描述 SAP HANA 數(shù)據(jù)庫中允許的類型轉(zhuǎn)換。

2.7.1 顯式類型轉(zhuǎn)換
表達(dá)式結(jié)果的類型,例如一個字段索引,一個字段函數(shù)或者文字可以使用如下函數(shù)進(jìn)行轉(zhuǎn)換: CAST, TO_ALPHANUM, TO_BIGINT, TO_VARBINARY,TO_BLOB, TO_CLOB, TO_DATE, TO_DATS, TO_DECIMAL, TO_DOUBLE, TO_INTEGER, TO_INT,TO_NCLOB, TO_NVARCHAR, TO_REAL, TO_SECONDDATE, TO_SMALLINT, TO_TINYINT, TO_TIME,TO_TIMESTAMP, TO_VARCHAR。

2.7.2 隱式類型轉(zhuǎn)換
當(dāng)給定的一系列運算符/參數(shù)類型不符合其所期望的類型, SAP HANA 數(shù)據(jù)庫就會執(zhí)行類型轉(zhuǎn)換。這種轉(zhuǎn)換僅僅發(fā)生在相關(guān)的轉(zhuǎn)換可供使用,并且使得運算符/參數(shù)類型可執(zhí)行。

舉例來說, BIGINT 和 VARCHAR 之間的比較是通過把 VARCHAR 隱式轉(zhuǎn)換成 BIGINT 進(jìn)行的。

顯式轉(zhuǎn)換可以全部用于隱式轉(zhuǎn)換,除了 TIME 和 TIMESTAMP 數(shù)據(jù)類型。 TIME 和TIMESTAMP 可以使用 TO_TIME(TIMESTAMP)以及 TO_TIMESTAMP(TIME)相互轉(zhuǎn)換。

例子

2.7.3 轉(zhuǎn)換規(guī)則表
在下表中:

? 方框中“OK”表示允許的數(shù)據(jù)類型轉(zhuǎn)換,沒有任何檢查。

? 方框中”CHK”表示數(shù)據(jù)類型轉(zhuǎn)換只有在數(shù)據(jù)是有效的目標(biāo)類型時才執(zhí)行。

? 方框中”-”表示不允許該數(shù)據(jù)類型轉(zhuǎn)換。

如下顯示的規(guī)則同時適用于隱式和顯示轉(zhuǎn)換,除了 TIME 至 TIMESTAMP 的轉(zhuǎn)換。 TIME 類型只能通過顯示轉(zhuǎn)換 TO_TIMESTAMP 或者 CAST 函數(shù)執(zhí)行。

2.7.4 類型轉(zhuǎn)換優(yōu)先級
本節(jié)介紹 SAP HANA 數(shù)據(jù)庫實施的數(shù)據(jù)類型的優(yōu)先級。數(shù)據(jù)類型優(yōu)先級指定較低優(yōu)先級的類型轉(zhuǎn)換為較高優(yōu)先級的類型。

2.8、類型常量
常量是表示一個特定的固定數(shù)值的符號。

2.8.1 字符串常量
字符串常量括在單引號中。

o ‘Brian’

o ‘100’

Unicode 字符串的格式與字符串相似,但前面有一個 N 標(biāo)識符( N 代表 SQL-92 標(biāo)準(zhǔn)中的國際語言)。 N 字母前綴必須是大寫。

o N’abc’

SELECT’Brian’“character string 1”, ‘100’“character string 2”, N’abc’"unicode string"FROM DUMMY;

2.8.2 數(shù)字常量
數(shù)字常量用沒有括在單引號中的數(shù)字字符串表示。數(shù)字可能包含小數(shù)點或者科學(xué)計數(shù)。

o 123

o 123.4

o 1.234e2

2.8.3 十六進(jìn)制數(shù)字常量
十六進(jìn)制數(shù)字常量是十六進(jìn)制數(shù)的字符串,含有前綴 0x。

o 0x0abc

SELECT 123 “integer”, 123.4 “decimal1”, 1.234e2 “decimal2”, 0x0abc "hexadecimal"FROM DUMMY;

2.8.4 二進(jìn)制字符串常量
二進(jìn)制字符串有前綴 X,是一個括在單引號中的十六進(jìn)制數(shù)字字符串。

o X’00abcd’

o x’dcba00’

SELECT X’00abcd’“binary string 1”, x’dcba00’"binary string 2"FROM DUMMY;

2.8.5 日期、時間、時間戳常量
日期、時間、時間戳各自有如下前綴:

o date’2010-01-01’

o time’11:00:00.001’

o timestamp’2011-12-31 23:59:59’

SELECT date’2010-01-01’ “date”, time’11:00:00.001’ “time”, timestamp’2011-12-31 23:59:59’ “timestamp” FROM DUMMY;

SELECTdate’2010-01-01’“date”, time’11:00:00.001’“time”, timestamp’2011-12-31 23:59:59’"timestamp"FROM DUMMY;

3 謂詞
謂詞由組合的一個或多個表達(dá)式,或者邏輯運算符指定,并返回以下邏輯 /真值中的一個:

TRUE、 FALSE、或者 UNKNOW。

3.1比較謂詞
兩個值使用比較謂詞進(jìn)行比較,并返回 TRUE, FALSE 或 UNKNOW。

語法:

<comparison_predicate> ::= { = | != | <> | > | < | >= | <= } [ ANY | SOME| ALL ] { <expression_list> | }

<expression_list> ::= , …

表達(dá)式可以是簡單的表達(dá)式如字符、日期或者數(shù)字,也可以是標(biāo)量(只有一條結(jié)果)子查詢,這種子查詢的SELECT從句中只有一個表字段或者是一個統(tǒng)計列

如果子查詢的結(jié)果只有一條數(shù)據(jù)時,可以省略[ALL|ANY|SOME]選項

如果子查詢返回的是多條,則可需要帶上[ALL|ANY|SOME]選項

2 ? ALL:如果子查詢返回的所有行都滿足比較條件時,才為真

2 ? ANY|SOME:如果子查詢返回的所有行中只要有一條滿足比較條件時,就會為真

2 ? =等號與ANY|SOME一起使用時,與IN操作符具有一樣的效果

3.2BETWEEN謂詞
值將在給定范圍中進(jìn)行比較。

語法:

<range_predicate> ::= [NOT] BETWEEN AND

BETWEEN …AND … - 當(dāng)指定了范圍謂詞時,如果 expression1 在 expression2 和 expression3 指定的范圍內(nèi)時,結(jié)果返回真;如果 expression2 比 expression3 小,則只返回真。

3.3In 謂詞
一個值與一組指定的值比較。如果 expression1 的值在 expression_list(或子查詢)中,結(jié)果返回真。

語法:

<in_predicate> ::= [NOT] IN { <expression_list> | }

… WHERE CITY IN (‘BERLIN’, ‘NEW YORK’, ‘LONDON’).

如果CITY為IN后面列表中的任何一個時返回true

IN后面也可以根子查詢:

SELECT SINGLE city latitude longitude
INTO (city, lati, longi)
FROM sgeocity
WHERE city IN ( SELECT cityfrom FROM spfli
WHERE carrid = carr_id
AND connid = conn_id ).

3.4Exists 謂詞
如果子查詢返回非空結(jié)果集,結(jié)果為真;返回空結(jié)果集,結(jié)果則為假。

這類子查詢沒有返回值,也不要求SELECT從句中只有一個選擇列,選擇列可以任意個數(shù),WHERE or HAVING從句來根據(jù)該子查詢的是否查詢到數(shù)據(jù)來決定外層主查詢語句來選擇相應(yīng)數(shù)據(jù)

DATA: name_tab TYPE TABLE OF scarr-carrname,
name LIKE LINE OF name_tab.
SELECT carrname INTO TABLE name_tab FROM scarr
WHERE EXISTS ( SELECT * FROM spfli
WHERE carrid = scarr~carrid
AND cityfrom = ‘NEW YORK’ ).
LOOP AT name_tab INTO name.
WRITE: / name.
ENDLOOP.

此子查詢又為相關(guān)子查詢:

如果某個子查的WHERE條件中引用了外層查詢語句的列,則稱此子查詢?yōu)橄嚓P(guān)子查詢。相關(guān)子查詢對外層查詢結(jié)果集中的每條記錄都會執(zhí)行一次,所以盡量少用相關(guān)子查詢

3.5Like 謂詞
Like 用來比較字符串, Expression1 與包含在 expression2 中的模式比較。通配符( %)和( _)可以用在比較字符串 expression2 中。

“_”用于替代單個字符,“%”用于替代任意字符串,包括空字符串。

可以使用ESCAPE選項指定一個忽略符號h,如果通配符“_”、“%”前面有符號,那么通配符失去了它在模式中的功能,而指字符本身了:

… WHERE FUNCNAME LIKE’EDIT#_%‘ESCAPE’#’;

以“EDIT_”開頭的字符串

3.6NULL 謂詞
當(dāng)指定了謂詞 IS NULL,值可以與 NULL 比較。如果表達(dá)式值為 NULL, 則 IS NULL 返回值為真;如果指定了謂詞 IS NOT NULL,值不為 NULL 時返回值為真。

語法:

null_predicate> ::= IS [NOT] NULL

3.7CONTAINS 謂詞
CONTAINS 謂詞用來搜索子查詢中文本匹配的字符串。

語法:

<contains_function> ::= CONTAINS ‘(’ <contains_columns> ‘,’ <search_string>’)’| CONTAINS ‘(’ <contains_columns> ‘,’ <search_string> ‘,’ <search_specifier> ‘)’

<contains_columns> ::= ‘*’ | <column_name> | ‘(’ ‘)’

<search_string> ::= <string_const>

<search_specifier> ::= <search_type> <opt_search_specifier2_list>| <search_specifier2_list>

<opt_search_specifier2_list> ::= empty| <search_specifier2_list>

<search_type> ::= <exact_search> | <fuzzy_search> | <linguistic_search>

<search_specifier2_list> ::= <search_specifier2>| <search_specifier2_list> ‘,’ <search_specifier2>

<search_specifier2> := |

<exact_search> ::= EXACT

<fuzzy_search> ::= FUZZY| FUZZY ‘(’ <float_const> ‘)’ | FUZZY ‘(’ <float_const> ‘,’ <additional_params> ‘)’

<linguistic_search> ::= LINGUISTIC

::= WEIGHT ‘(’ <float_const_list> ‘)’

:: LANGUAGE ‘(’ <string_const> ‘)’

<additional_params> ::= <string_const>

search_string:使用自由式字符串搜索格式(例如, Peter "Palo Alto"或 Berlin -“SAP LABS”)。

search_specifier:如果沒有指定 search_specifier, EXACT 為默認(rèn)值。

EXACT:對于那些在 search_attributes 中精確匹配 searchterms 的記錄, EXACT 返回真。

FUZZY:對于那些在 search_attributes 相似匹配 searchterms 的記錄, FUZZY 返回真(例如,以某種程度忽略拼寫錯誤)。

Float_const:如果省略 float_const,則默認(rèn)值為 0.8。可以通過定義列式存儲聯(lián)接視圖支持的參數(shù)FUZZINESSTHRESHOLD 來覆蓋默認(rèn)值。

WEIGHT:如果定義了 weights 列表,則必須與<contains_columns>中的列數(shù)量一樣。

LANGUAGE:LANGUAGE 在搜索字符串的預(yù)處理中使用,并且作為搜索前的過濾。只返回匹配搜索字符串的文檔和定義的語言。

LINGUISTIC:對于那些在 searchattribute 中出現(xiàn)的 searchterms 字符變量, LINGUISTIC 返回真。

限制:如果在 where 條件中定義了多個 CONTAINS,那么只有其中的一個由<contains_columns>列表中的不止一列組成。

CONTAINS 只對列式存儲表適用(簡單表和聯(lián)接視圖)。

例子:

精確搜索:

select * from T where contains(column1, ‘dog OR cat’) – EXACT is implicit

select * from T where contains(column1, ‘dog OR cat’, EXACT)

select * from T where contains(column1, ‘“cats and dogs”’) – phrase search

模糊搜索:

select * from T where contains(column1, ‘catz’, FUZZY(0.8))

語言搜索:

select * from T where contains(column1, ‘catz’, LINGUISTIC)

自由式搜索:自由式搜索是對于多列的搜索。

select * from T where CONTAINS( (column1,column2,column3), ‘cats OR dogz’, FUZZY(0.7))

select * from T where CONTAINS( (column1,column2,column3), ‘cats OR dogz’, FUZZY(0.7))

4 操作符
你可以在表達(dá)式中使用操作符進(jìn)行算術(shù)運算。操作符可以用來計算、比較值或者賦值。

4.1一元和二元操作符

4.2操作符優(yōu)先級
一個表達(dá)式可以使用多個操作符。如果操作符大于一個,則 SAP HANA 數(shù)據(jù)庫會根據(jù)操作符優(yōu)先級評估它們。你可以通過使用括號改變順序,因為在括號內(nèi)的表達(dá)式會第一個評估。

如果沒有使用括號,則操作符優(yōu)先級將根據(jù)下表。請注意, SAP HANA 數(shù)據(jù)庫對于優(yōu)先級相同的操作符將從左至右評估操作符。

4.3算術(shù)操作符
你可以使用算術(shù)操作符來執(zhí)行數(shù)學(xué)運算,如加法、減法、乘法和除法,以及負(fù)數(shù)。

4.4字符串操作符

對于 VARCHAR 或者 NVARCHAR 類型字符串,前導(dǎo)或者后置空格將保留。如果其中一字符串類型為 NVARCHAR,則結(jié)果也為 NVARCHAR 并且限制在 5000 個字母, VARCHAR 聯(lián)接的最大長度也限制在 5000 個字母。

4.5比較操作符
語法:

<comparison_operation> ::= <comparison_operator>

4.6邏輯操作符
搜索條件可以使用 AND 或者 OR 操作符結(jié)合,你也可以使用 NOT 操作符否定條件。

4.7合并操作符
對兩個或更多個查詢的結(jié)果執(zhí)行合并操作

UNION:并集,去重

UNION ALL:并集,包括重復(fù)

INTERSECT:交集

EXCEPT:差集

5 表達(dá)式
表達(dá)式是可以用來計算并返回值的子句。

語法:

::=<case_expression>
| <function_expression>
| <aggregate_expression>
| ( )
| ( )
| -
|
| <variable_name>
|
| [<correlation_name>.]<column_name>

5.1Case 表達(dá)式
Case 表達(dá)式允許用戶使用 IF … THEN … ELSE邏輯,而不用在 SQL 語句中調(diào)用存儲過程。

語法:

<case_expression> ::=

CASE

WHEN THEN , …

[ ELSE ]

{ END | END CASE }

如果位于 CASE 語句后面的表達(dá)式和 WHEN 后面的表達(dá)式相等,則 THEN 之后的表達(dá)式將作為返回值;否則返回 ELSE 語句之后的表達(dá)式,如果存在的話。

CASE后面還可以省略,省略后如下:

BEGIN

OUTTAB = SELECT CARRID, CONNID, FLDATE, BOOKID, CUSTOMID

FROM "SFLIGHT"."SBOOK"WHERE (CASE WHEN CARRID = :IV_CARRID THEN '1'ELSE '2' END) = '2';

END;

由于CASE WHEN性能不好,所以可以改寫成下面這樣:

SELECT CARRID, CONNID, FLDATE, BOOKID, CUSTOMID

FROM "SFLIGHT"."SBOOK"WHERE CARRID <> :IV_CARRID or carrid is null

5.2Function 表達(dá)式
SQL 內(nèi)置的函數(shù)可以作為表達(dá)式使用。

語法:

<function_expression> ::= <function_name> ( , … )

5.3Aggregate 表達(dá)式
Aggregate 表達(dá)式利用 aggregate 函數(shù)計算同一列中多行值。

語法:

<aggregate_expression> ::= COUNT(*) | <agg_name> ( [ ALL | DISTINCT ] )

<agg_name> ::= COUNT | MIN | MAX | SUM | AVG | STDDEV | VAR

5.4表達(dá)式中的子查詢
子查詢是在括號中的 SELECT 語句。 SELECT 語句可以包含一個,有且僅有一個選擇項。當(dāng)作為表達(dá)式使用時,標(biāo)量(只有一條結(jié)果)子查詢允許返回零個或一個值。

語法:

<scalar_subquery_expression> ::= ()

在最高級別的 SELECT 中的 SELECT 列表,或者 UPDATE 語句中的 SET 條件中,你可以在任何能使用列名的地方使用標(biāo)量子查詢。不過, scalar_subquery 不可以在 GROUP BY 條件中使用。

例子:

以下語句返回每個部門中的員工數(shù),根據(jù)部門名字分組:

SELECT DepartmentName, COUNT(), ‘out of’,(SELECTCOUNT() FROM Employees)

FROM Departments AS D, Employees AS E WHERE D.DepartmentID = E.DepartmentID

GROUPBY DepartmentName;

6 SQL 函數(shù)
6.1數(shù)據(jù)類型轉(zhuǎn)換函數(shù)
數(shù)據(jù)類型轉(zhuǎn)換函數(shù)用來把參數(shù)從一個數(shù)據(jù)類型轉(zhuǎn)換為另一個數(shù)據(jù)類型,或者測試轉(zhuǎn)換是否可行。

6.1.1 CAST
語法:

CAST (expression AS data_type)

語法元素:

Expression – 被轉(zhuǎn)換的表達(dá)式。

Data type – 目標(biāo)數(shù)據(jù)類型。 TINYINT | SMALLINT |INTEGER | BIGINT | DECIMAL | SMALLDECIMAL | REAL | DOUBLE | ALPHANUM | VARCHAR |NVARCHAR | DAYDATE | DATE | TIME | SECONDDATE | TIMESTAMP。

例子:

SELECTCAST (7 ASVARCHAR) "cast"FROM DUMMY;–7

6.1.2 TO_ALPHANUM
語法:

TO_ALPHANUM (value)

描述:

將給定的 value 轉(zhuǎn)換為 ALPHANUM 數(shù)據(jù)類型。

例子:

SELECT TO_ALPHANUM (‘10’) "to alphanum"FROM DUMMY;–10

6.1.3 TO_BIGINT
語法:

TO_BIGINT (value)

描述:

將 value 轉(zhuǎn)換為 BIGINT 類型。

例子:

SELECT TO_BIGINT (‘10’) "to bigint"FROM DUMMY;–10

6.1.4 TO_BINARY
語法:

TO_BINARY (value)

描述:

將 value 轉(zhuǎn)換為 BINARY 類型。

例子:

SELECT TO_BINARY (‘a(chǎn)bc’) "to binary"FROM DUMMY;–616263 顯示時卻是以十六進(jìn)制顯示,而不是二進(jìn)制?

6.1.5 TO_BLOB
語法:

TO_BLOB (value)

描述:

將 value 轉(zhuǎn)換為 BLOB 類型。參數(shù)值必須是二進(jìn)制字符串。

例子:

SELECT TO_BLOB (TO_BINARY(‘a(chǎn)bcde’)) "to blob"FROM DUMMY;–abcde

6.1.6 TO_CHAR
語法:

TO_CHAR (value [, format])

描述:

將 value 轉(zhuǎn)換為 CHAR 類型。如果省略 format 關(guān)鍵字,轉(zhuǎn)換將會使用 Date Formats 中說明的日期格式模型。

例子:

SELECT TO_CHAR (TO_DATE(‘2009-12-31’), ‘YYYY/MM/DD’) "to char"FROM DUMMY;–2009/12/31

SELECT TO_CHAR (TO_DATE(‘2009-12-31’)) "to char"FROM DUMMY;–2009-12-31

6.1.7 TO_CLOB
語法:

TO_CLOB (value)

描述:

將 value 轉(zhuǎn)換為 CLOB 類型。

例子:

SELECT TO_CLOB (‘TO_CLOB converts the value to a CLOB data type’) "to clob"FROM DUMMY;–TO_CLOB converts the value to a CLOB data type

6.1.8 TO_DATE
語法:

TO_DATE (d [, format])

描述:

將日期字符串 d 轉(zhuǎn)換為 DATE 數(shù)據(jù)類型。如果省略 format 關(guān)鍵字,轉(zhuǎn)換將會使用 Date Formats 中說明的日期格式模型。

例子:

SELECT TO_DATE(‘2010-01-12’, ‘YYYY-MM-DD’) "to date"FROM DUMMY;–2010-1-12

6.1.9 TO_DATS
語法:

TO_DATS (d)

描述:

將字符串 d 轉(zhuǎn)換為 ABAP 日期字符串,格式為”YYYYMMDD”。

例子:

SELECT TO_DATS (‘2010-01-12’) "abap date"FROM DUMMY;–20100112

6.1.10 TO_DECIMAL
語法:

TO_DECIMAL (value [, precision, scale])

描述:

將 value 轉(zhuǎn)換為 DECIMAL 類型。

精度是有效數(shù)字的總數(shù),范圍為 1 至 34。小數(shù)位數(shù)是從小數(shù)點到最小有效數(shù)字的數(shù)字個數(shù),范圍從-6,111 到 6,176,這表示位數(shù)指定了十進(jìn)制小數(shù)的指數(shù)范圍從 10-6111 至 106176。如果沒有指定小數(shù)位數(shù),則默認(rèn)值為 0。

當(dāng)數(shù)字的有效數(shù)字在小數(shù)點的右側(cè)時,小數(shù)位數(shù)為正;有效數(shù)字在小數(shù)點左側(cè)時,小數(shù)位數(shù)為負(fù)。

當(dāng)未指定精度和小數(shù)位數(shù), DECIMAL 成為浮點小數(shù)。這種情況下,精度和小數(shù)位數(shù)可以在上文描述的范圍內(nèi)不同,根據(jù)存儲的數(shù)值,精度為 1-34 以及小數(shù)位數(shù)為 6111-6176。

例子:

SELECTTO_DECIMAL(7654321.888888, 10, 3) "to decimal"FROM DUMMY–7,654,321.888

6.1.11 TO_DOUBLE
語法:

TO_DOUBLE (value)

描述:

將 value 轉(zhuǎn)換為 DOUBLE(雙精度)數(shù)據(jù)類型。

例子:

SELECT 3*TO_DOUBLE (‘15.12’) "to double"FROM DUMMY;–45.36

6.1.12 TO_INT
語法:

TO_INT (value)

描述:

將 value 轉(zhuǎn)換為 INTEGER 類型。

例子:

SELECT TO_INT(‘10’) "to int"FROM DUMMY;–10

6.1.13 TO_INTEGER
語法:

TO_INTEGER (value)

描述:

將 value 轉(zhuǎn)換為 INTEGER 類型。

例子:

SELECT TO_INTEGER (‘10’) "to int"FROM DUMMY;–10

6.1.14 TO_NCHAR
語法:

TO_NCHAR (value [, format])

描述:

將 value 轉(zhuǎn)換為 NCHAR Unicode 字符類型。如果省略 format 關(guān)鍵字,轉(zhuǎn)換將會使用 Date Formats中說明的日期格式模型。

例子:

SELECT TO_NCHAR (TO_DATE(‘2009-12-31’), ‘YYYY/MM/DD’) "to nchar"FROM DUMMY;–2009/12/31

6.1.15 TO_NCLOB
語法:

TO_NCLOB (value)

描述:

將 value 轉(zhuǎn)換為 NCLOB 數(shù)據(jù)類型。

例子:

SELECT TO_NCLOB (‘TO_NCLOB converts the value to a NCLOB data type’) "to nclob"FROM DUMMY;–TO_NCLOB converts the value to a NCLOB data type

6.1.16 TO_NVARCHAR
語法:

TO_NVARCHAR (value [,format])

描述:

將 value 轉(zhuǎn)換為 NVARCHAR Unicode 字符類型。如果省略 format 關(guān)鍵字,轉(zhuǎn)換將會使用 DateFormats 中說明的日期格式模型。

例子:

SELECT TO_NVARCHAR(TO_DATE(‘2009/12/31’), ‘YY-MM-DD’) "to nchar"FROM DUMMY;–09-12-31

6.1.17 TO_REAL
語法:

TO_REAL (value)

描述:

將 value 轉(zhuǎn)換為實數(shù)(單精度)數(shù)據(jù)類型。

例子:

SELECT 3*TO_REAL (‘15.12’) "to real"FROM DUMMY;–45.36000061035156

6.1.18 TO_SECONDDATE
語法:

TO_SECONDDATE (d [, format])

描述:

將 value 轉(zhuǎn)換為 SECONDDATE 類型。如果省略 format 關(guān)鍵字,轉(zhuǎn)換將會使用 Date Formats 中說明的日期格式模型。

例子:

SELECT TO_SECONDDATE (‘2010-01-11 13:30:00’, ‘YYYY-MM-DD HH24:MI:SS’) "to seconddate"FROM DUMMY;–2010-1-11 13:30:00.0

6.1.19 TO_SMALLDECIMAL
語法:

TO_SMALLDECIMAL (value)

描述:

將 value 轉(zhuǎn)換為 SMALLDECIMAL 類型。

例子:

SELECT TO_SMALLDECIMAL(7654321.89) "to smalldecimal"FROM DUMMY;–7,654,321.89

6.1.20 TO_SMALLINT
語法:

TO_SMALLINT (value)

描述:

將 value 轉(zhuǎn)換為 SMALLINT 類型。

例子:

SELECT TO_SMALLINT (‘10’) "to smallint"FROM DUMMY;–10

6.1.21 TO_TIME
語法:

TO_TIME (t [, format])

描述:

將時間字符串 t 轉(zhuǎn)換為 TIME 類型。如果省略 format 關(guān)鍵字,轉(zhuǎn)換將會使用 Date Formats 中說明的日期格式模型。

例子:

SELECT TO_TIME (‘08:30 AM’, ‘HH:MI AM’) "to time"FROM DUMMY;–8:30:00

6.1.22 TO_TIMESTAMP
語法:

TO_TIMESTAMP (d [, format])

描述:

將時間字符串 t 轉(zhuǎn)換為 TIMESTAMP 類型。如果省略 format 關(guān)鍵字,轉(zhuǎn)換將會使用 Date Formats中說明的日期格式模型。

例子:

SELECT TO_TIMESTAMP (‘2010-01-11 13:30:00’, ‘YYYY-MM-DD HH24:MI:SS’) "to timestamp"FROM DUMMY;–2010-1-11 13:30:00.0

6.1.23 TO_TINYINT
語法:

TO_TINYINT (value)

描述:

將 value 轉(zhuǎn)換為 TINYINT 類型。

例子:

SELECT TO_TINYINT (‘10’) "to tinyint"FROM DUMMY;–10

6.1.24 TO_VARCHAR
語法:

TO_VARCHAR (value [, format])

描述:

將給定 value 轉(zhuǎn)換為 VARCHAR 字符串類型。如果省略 format 關(guān)鍵字,轉(zhuǎn)換將會使用 Date Formats中說明的日期格式模型。

例子:

SELECT TO_VARCHAR (TO_DATE(‘2009-12-31’), ‘YYYY/MM/DD’) "to char"FROM DUMMY;–2009/12/31

6.2日期時間函數(shù)
6.2.1 ADD_DAYS
語法:

ADD_DAYS (d, n)

描述:

計算日期 d 后 n 天的值。

例子:

SELECT ADD_DAYS (TO_DATE (‘2009-12-05’, ‘YYYY-MM-DD’), 30) "add days"FROM DUMMY;–2010-1-4

6.2.2 ADD_MONTHS
語法:

ADD_MONTHS (d, n)

描述:

計算日期 d 后 n 月的值。

例子:

SELECT ADD_MONTHS (TO_DATE (‘2009-12-05’, ‘YYYY-MM-DD’), 1) "add months"FROM DUMMY–2010-1-5

6.2.3 ADD_SECONDS
語法:

ADD_SECONDS (t, n)

描述:

計算時間 t 后 n 秒的值。

例子:

SELECT ADD_SECONDS (TO_TIMESTAMP (‘2012-01-01 23:30:45’), 15) "add seconds"FROM DUMMY;–2012-1-1 23:31:00.0

6.2.4 ADD_YEARS
語法:

ADD_YEARS (d, n)

描述:

計算日期 d 后 n 年的值。

例子:

SELECT ADD_YEARS (TO_DATE (‘2009-12-05’, ‘YYYY-MM-DD’), 1) "add years"FROM DUMMY;–2010-12-5

6.2.5 CURRENT_DATE
語法:

CURRENT_DATE

描述:

返回當(dāng)前本地系統(tǒng)日期。

例子:

selectcurrent_date from dummy;–2015-6-12

6.2.6 CURRENT_TIME
語法:

CURRENT_TIME

描述:

返回當(dāng)前本地系統(tǒng)時間。

例子:

select current_time from dummy;–16:58:11

6.2.7 CURRENT_TIMESTAMP
語法:

CURRENT_TIMESTAMP

描述:

返回當(dāng)前本地系統(tǒng)的時間戳信息。

例子:

selectcurrent_timestamp from dummy;–2015-6-12 16:58:11.471

6.2.8 CURRECT_UTCDATE
語法:

CURRENT_UTCDATE

描述:

返回當(dāng)前 UTC 日期。 UTC 代表協(xié)調(diào)世界時,也被稱為格林尼治標(biāo)準(zhǔn)時間( GMT)。

例子:

SELECT CURRENT_UTCDATE "Coordinated Universal Date"FROM DUMMY;–2015-6-12

6.2.9 CURRENT_UTCTIME
語法:

CURRENT_UTCTIME

描述:

返回當(dāng)前 UTC 時間。

例子:

SELECTCURRENT_TIMESTAMP,CURRENT_UTCTIME "Coordinated Universal Time"FROM DUMMY;–2015-6-12 23:25:49.721;15:25:49

6.2.10 CURRENT_UTCTIMESTAMP
語法:

CURRENT_UTCTIMESTAMP

描述:

返回當(dāng)前 UTC 時間戳。

例子:

SELECTCURRENT_TIMESTAMP,CURRENT_UTCTIMESTAMP "Coordinated Universal Timestamp"FROM DUMMY;-2015-6-12 23:28:07.62;2015-6-12 15:28:07.62

6.2.11 DAYNAME
語法:

DAYNAME (d)

描述:

返回一周中日期 d 的英文名。

例子:

SELECTDAYNAME (‘2011-05-30’) "dayname"FROM DUMMY;–MONDAY

6.2.12 DAYOFMONTH
語法:

DAYOFMONTH (d)

描述:

返回一個月中日期 d 的整數(shù)數(shù)字(即一個月中的幾號)。

例子:

SELECT DAYOFMONTH (‘2011-05-30’) "dayofmonth"FROM DUMMY;–30

6.2.13 DAYOFYEAR
語法:

DAYOFYEAR (d)

描述:

返回一年中代表日期 d 的整數(shù)數(shù)字(即一年中的第幾天)。

例子:

SELECTDAYOFYEAR (‘2011-02-01’) "dayofyear"FROM DUMMY;–32

6.2.14 DAYS_BETWEEN
語法:

DAYS_BETWEEN (d1, d2)

描述:

計算 d1 和 d2 之間的天數(shù)(只包括一端:[d1,d2)或者(d1,d2])。

例子:

SELECTDAYS_BETWEEN (TO_DATE (‘2015-01-01’, ‘YYYY-MM-DD’), TO_DATE(‘2015-02-02’, ‘YYYY-MM-DD’)) "days between"FROM DUMMY;–32

SELECTDAYS_BETWEEN (‘2015-01-01’,‘2015-02-02’) "days between"FROM DUMMY;–32 類型隱式轉(zhuǎn)換(字符轉(zhuǎn)日期)

SELECTDAYS_BETWEEN (‘2015-02-01’,‘2015-03-01’) "days between"FROM DUMMY;–28

6.2.15 EXTRACT
語法:

EXTRACT ({YEAR | MONTH | DAY | HOUR | MINUTE | SECOND} FROM d)

描述:

返回日期 d 中指定的時間日期字段的值(年、月、日、時、分、秒)。

例子:

SELECTEXTRACT(YEARFROM TO_DATE(‘2010-01-04’, ‘YYYY-MM-DD’)) “年”,EXTRACT(MONTHFROM’2010-01-04’) “月” ,EXTRACT(DAYFROM’2010-01-04’) “日” ,EXTRACT(HOURFROM’2010-01-04 05’) “時”,EXTRACT(MINUTEFROM’2010-01-04 05’) “分”,EXTRACT(SECONDFROM’2010-01-04 05:06:07’) "秒"FROM DUMMY;

6.2.16 HOUR
語法:

HOUR (t)

描述:

返回時間 t 中表示小時的整數(shù)。

例子:

SELECTHOUR (‘12:34:56’) "hour"FROM DUMMY;–12

6.2.17 ISOWEEK
語法:

ISOWEEK (d)

描述:

返回日期 d 的 ISO 年份和星期數(shù)。星期數(shù)前綴為字母 W。另請閱 WEEK。

例子:

SELECT ISOWEEK (TO_DATE(‘2011-05-30’, ‘YYYY-MM-DD’)) "isoweek"FROM DUMMY;–2011-W22

6.2.18 LAST_DAY
語法:

LAST_DAY (d)

描述:

返回包含日期 d 的月的最后一天日期。

例子:

SELECT LAST_DAY (TO_DATE(‘2010-01-04’, ‘YYYY-MM-DD’)) "last day"FROM DUMMY;–2010-1-31

6.2.19 LOCALTOUTC
語法:

LOCALTOUTC (t, timezone)

描述:

將 timezone 下的本地時間 t 轉(zhuǎn)換為 UTC 時間(UTC:通用協(xié)調(diào)時, Universal Time Coordinated。北京時區(qū)是東八區(qū),領(lǐng)先UTC 8個小時,UTC + 時區(qū)差=本地時間)。

例子:

SELECT LOCALTOUTC (TO_TIMESTAMP(‘2012-01-01 01:00:00’, ‘YYYY-MM-DD HH24:MI:SS’), ‘EST’) "localtoutc"FROM DUMMY;–2012-1-1 6:00:00.0

6.2.20 MINUTE
語法:

MINUTE(t)

描述:

返回時間 t 中表示分鐘的數(shù)字。

例子:

SELECTMINUTE (‘12:34:56’) "minute"FROM DUMMY;–34

6.2.21 MONTH
語法:

MONTH(d)

描述:

返回日期 d 所在月份的數(shù)字。

例子:

SELECTMONTH (‘2011-05-30’) "month"FROM DUMMY;–5

6.2.22 MONTHNAME
語法:

MONTHNAME(d)

描述:

返回日期 d 所在月份的英文名。

例子:

SELECTMONTHNAME (‘2011-05-30’) "monthname"FROM DUMMY;–MAY

6.2.23 NEXT_DAY
語法:

NEXT_DAY (d)

描述:

返回日期 d 的第二天。

例子:

SELECT NEXT_DAY (TO_DATE (‘2009-12-31’, ‘YYYY-MM-DD’)) "next day"FROM DUMMY;–2010-1-1

6.2.24 NOW
語法:

NOW ()

描述:

返回當(dāng)前時間戳。

例子:

SELECT NOW () "now"FROM DUMMY;–2015-6-12 17:23:01.773

6.2.25 QUARTER
語法:

QUARTER (d, [, start_month ])

描述:

返回日期 d 的年份,季度。第一季度由 start_month 定義的月份開始,如果沒有定義start_month,第一季度假設(shè)為從一月開始。

例子:

SELECTQUARTER (TO_DATE(‘2012-01-01’, ‘YYYY-MM-DD’), 2) "quarter"FROM DUMMY;–2011-Q4

6.2.26 SECOND
語法:

SECOND (t)

描述:

返回時間 t 表示的秒數(shù)。

例子:

SELECTSECOND (‘12:34:56’) "second"FROM DUMMY;–56

6.2.27 SECONDS_BETWEEN
語法:

SECONDS_BETWEEN (d1, d2)

描述:

計算日期參數(shù) d1 和 d2 之間的秒數(shù),語義上等同于 d2-d1。

例子:

SELECT SECONDS_BETWEEN (‘2015-01-01 01:01:01’, ‘2015-01-01 02:01:01’) "seconds between"FROM DUMMY;–3600

SELECT SECONDS_BETWEEN (‘2015-01-01 01:01:01’, ‘2015-01-01 01:02:02’) "seconds between"FROM DUMMY;–61

SELECT SECONDS_BETWEEN (‘2015-01-01 01:01:01’, ‘2015-01-01 01:01:02’) "seconds between"FROM DUMMY;–1

6.2.28 UTCTOLOCAL
語法:

UTCTOLOCAL (t, timezone)

描述:

將 UTC 時間值轉(zhuǎn)換為時區(qū) timezone 下的本地時間。

例子:

SELECT UTCTOLOCAL(TO_TIMESTAMP(‘2012-01-01 01:00:00’, ‘YYYY-MM-DD HH24:MI:SS’), ‘EST’) "utctolocal"FROM DUMMY;–2011-12-31 20:00:00.0

6.2.29 WEEK
語法:

WEEK (d)

描述:

返回日期 d 所在星期的整數(shù)數(shù)字。另請參閱 ISOWEEK。

例子:

SELECTWEEK(TO_DATE(‘2011-05-30’, ‘YYYY-MM-DD’)) "week"FROM DUMMY;–23

6.2.30 WEEKDAY
語法:

WEEKDAY (d)

描述:

返回代表日期 d 所在星期的日期數(shù)字(星期幾)。返回值范圍為 0 至 6,表示 Monday(0)至 Sunday(6)。

例子:

SELECTWEEKDAY (TO_DATE (‘2011-01-02’, ‘YYYY-MM-DD’)) "week day"FROM DUMMY;–6

SELECTWEEKDAY (TO_DATE (‘2011-01-03’, ‘YYYY-MM-DD’)) "week day"FROM DUMMY;–0

6.2.31 YEAR
語法:

YEAR (d)

描述:

返回日期 d 所在的年份數(shù)。

例子:

SELECTYEAR (TO_DATE (‘2011-05-30’, ‘YYYY-MM-DD’)) "year"FROM DUMMY;–2011

6.3數(shù)字函數(shù)
數(shù)字函數(shù)接受數(shù)字或者帶有數(shù)字的字符串作為輸入,返回數(shù)值。 當(dāng)數(shù)字字符的字符串作為輸入時,在計算結(jié)果前,自動執(zhí)行字符串到數(shù)字的隱式轉(zhuǎn)換。

6.3.1 ABS
語法:

ABS (n)

描述:

返回數(shù)字參數(shù) n 的絕對值。

例子:

SELECTABS (-1) "absolute"FROM DUMMY;–1

6.3.2 ACOS
語法:

ACOS (n)

描述:

返回參數(shù) n 的反余弦,以弧度為單位,值為-1 至 1。

例子:

SELECTACOS (0.5) "acos"FROM DUMMY;–1.0471975511965979

6.3.3 ASIN
語法:

ASIN (n)

描述:

返回參數(shù) n 的反正弦值,以弧度為單位,值為-1 至 1。

例子:

SELECTASIN (0.5) "asin"FROM DUMMY;–0.5235987755982989

6.3.4 ATAN
語法:

ATAN (n)

描述:

返回參數(shù) n 的反正切值,以弧度為單位, n 的范圍為無限。

例子:

SELECTATAN (0.5) "atan"FROM DUMMY;–0.4636476090008061

6.3.5 ATAN2
語法:

ATAN2 (n, m)

描述:

返回兩數(shù) n 和 m 比率的反正切值,以弧度為單位。這和 ATAN(n/m)的結(jié)果一致。

例子:

SELECTATAN2 (1.0, 2.0) "atan2"FROM DUMMY;–0.4636476090008061

6.3.6 BINTOHEX
語法:

BINTOHEX (expression)

描述:

將二進(jìn)制值轉(zhuǎn)換為十六進(jìn)制。

例子:

SELECT BINTOHEX(‘AB’) "bintohex"FROM DUMMY;–4142 先會將“AB”字符串隱式轉(zhuǎn)換為二進(jìn)制??

SELECT TO_BINARY (‘AB’) "to binary"FROM DUMMY;–4142 顯示時卻是以十六進(jìn)制顯示,而不是二進(jìn)制?

6.3.7 BITAND
語法:

BITAND (n, m)

描述:

對參數(shù) n 和 m 的位執(zhí)行 AND 操作(即按位與)。 n 和 m 都必須是非負(fù)整數(shù)。 BITAND 函數(shù)返回 BIGINT 類型的結(jié)果。

例子:

SELECT BITAND (255, 123) "bitand"FROM DUMMY;–123

6.3.8 CEIL
語法:

CEIL(n)

描述:

返回大于或者等于 n 的第一個整數(shù)(大小它的最小整數(shù))

例子:

SELECT CEIL (14.5) "ceiling"FROM DUMMY;–15

6.3.9 COS
語法:

COS (n)

描述:

返回參數(shù) n 的余弦值,以弧度為單位。

例子:

SELECTCOS (0.0) "cos"FROM DUMMY;–1

6.3.10 COSH
語法:

COSH (n)

描述:

返回參數(shù) n 的雙曲余弦值。

例子:

SELECT COSH (0.5) "cosh"FROM DUMMY;–1.1276259652063807

6.3.11 COT
語法:

COT (n)

描述:

計算參數(shù) n 的余切值,其中 n 以弧度表示。

例子:

SELECTCOT (40) "cot"FROM DUMMY;-- -0.8950829176379128

6.3.12 EXP
語法:

EXP (n)

描述:

返回以 e 為底, n 為指數(shù)的計算結(jié)果。

例子:

SELECTEXP (1.0) "exp"FROM DUMMY;–2.718281828459045

6.3.13 FLOOR
語法:

FLOOR (n)

描述:

返回不大于參數(shù) n 的最大整數(shù)。

例子:

SELECTFLOOR (14.5) "floor"FROM DUMMY;–14

6.3.14 GREATEST
語法:

GREATEST (n1 [, n2]…)

描述:

返回參數(shù) n1,n2,…最大數(shù)。

例子:

SELECT GREATEST (‘a(chǎn)a’, ‘a(chǎn)b’, ‘bb’, ‘ba’) "greatest"FROM DUMMY;–bb

6.3.15 HEXTOBIN
語法:

HEXTOBIN (value)

描述:

將十六進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)。

例子:

SELECTHEXTOBIN (‘1a’) "hextobin"FROM DUMMY;–1A 還是以十六進(jìn)制來顯示?

6.3.16 LEAST
語法:

LEAST (n1 [, n2]…)

描述:

返回參數(shù) n1,n2,…最小數(shù)。

例子:

SELECT LEAST(‘a(chǎn)a’, ‘a(chǎn)b’, ‘ba’, ‘bb’) "least"FROM DUMMY;–aa

6.3.17 LN
語法:

LN (n)

描述:

返回參數(shù) n 的自然對數(shù)。

例子:

SELECTLN (9) "ln"FROM DUMMY;–2.1972245773362196

6.3.18 LOG
語法:

LOG (b, n)

描述:

返回以 b 為底, n 的自然對數(shù)值。底 b 必須是大于 1 的正數(shù),且 n 必須是正數(shù)。

例子:

SELECTLOG (10, 2) "log"FROM DUMMY;–0.30102999566398114

6.3.19 MOD
語法:

MOD (n, d)

描述:

返回 n 整除 b 的余數(shù)值。

當(dāng) n 為負(fù)時,該函數(shù)行為不同于標(biāo)準(zhǔn)的模運算。

以下列舉了 MOD 函數(shù)返回結(jié)果的例子

如果 d 為零,返回 n。

如果 n 大于零,且 n 小于 d,則返回 n。

如果 n 小于零,且 n 大于 d,則返回 n。

在上文提到的其他情況中,利用 n 的絕對值除以 d 的絕對值來計算余數(shù)。如果 n 小于 0,則 MOD返回的余數(shù)為負(fù)數(shù);如果 n 大于零, MOD 返回的余數(shù)為正數(shù)。

例子:

SELECTMOD (15, 4) "modulus"FROM DUMMY;–3

SELECTMOD (-15, 4) "modulus"FROM DUMMY;-- -3

6.3.20 POWER
語法:

POWER (b, e)

描述:

計算以 b 為底, e 為指數(shù)的值。

例子:

SELECTPOWER (2, 10) "power"FROM DUMMY;–1024

6.3.21 ROUND
語法:

ROUND (n [, pos])

描述:

返回參數(shù) n 小數(shù)點后 pos 位置的值(四舍五入)。

例子:

SELECTROUND (16.16, 1) "round"FROM DUMMY;–16.2

SELECTROUND (16.16, -1) "round"FROM DUMMY;–20

6.3.22 SIGN
語法:

SIGN (n)

描述:

返回 n 的符號(正或負(fù))。如果 n 為正,則返回 1; n 為負(fù),返回-1, n 為 0 返回 0。

例子:

SELECTSIGN (-15) "sign"FROM DUMMY;-- -1

6.3.23 SIN
語法:

SIN (n)

描述:

返回參數(shù) n 的正弦值,以弧度為單位。

例子:

SELECTSIN(3.141592653589793/2) "sine"FROM DUMMY;–1

6.3.24 SINH
語法:

SINH (n)

描述:

返回 n 的雙曲正弦值,以弧度為單位。

例子:

SELECT SINH (0.0) "sinh"FROM DUMMY;–0

6.3.25 SQRT
語法:

SQRT (n)

描述:

返回 n 的平方根。

例子:

SELECTSQRT (2) "sqrt"FROM DUMMY;–1.4142135623730951

6.3.26 TAN
語法:

TAN (n)

描述:

返回 n 的正切值,以弧度為單位。

例子:

SELECTTAN (0.0) "tan"FROM DUMMY;–0

6.3.27 TANH
語法:

TANH (n)

描述:

返回 n 的雙曲正切值,以弧度為單位。

例子:

SELECT TANH (1.0) "tanh"FROM DUMMY;–0.7615941559557649

6.3.28 UMINUS
語法:

UMINUS (n)

描述:

返回 n 的負(fù)值。

例子:

SELECT UMINUS(-765) "uminus"FROM DUMMY;–756

SELECT UMINUS(765) "uminus"FROM DUMMY;-- -756

6.4字符串函數(shù)
6.4.1 ASCII
語法:

ASCII?

描述:

返回字符串 c 中第一個字節(jié)的 ASCII 值。

SELECTASCII(‘Ant’) "ascii"FROM DUMMY;–65

6.4.2 CHAR
語法:

CHAR (n)

描述:

返回 ASCII 值為數(shù)字 n 的字符。

例子:

SELECTCHAR (65) || CHAR (110) || CHAR (116) "character"FROM DUMMY;–Ant

6.4.3 CONCAT
語法:

CONCAT (str1, str2)

描述:

返回位于 str1 后的 str2 聯(lián)合組成的字符串。級聯(lián)操作符(||)與該函數(shù)作用相同。

例子:

SELECTCONCAT (‘C’, ‘a(chǎn)t’) "concat"FROM DUMMY;–Cat

6.4.4 LCASE
語法:

LCASE(str)

描述:

將字符串 str 中所有字符轉(zhuǎn)換為小寫。

注意: LCASE 函數(shù)作用與 LOWER 函數(shù)相同。

例子:

SELECTLCASE (‘TesT’) "lcase"FROM DUMMY;–test

6.4.5 LEFT
語法:

LEFT (str, n)

描述:

返回字符串 str 開頭 n 個字符/位的字符。

例子:

SELECTLEFT (‘Hello’, 3) "left"FROM DUMMY;–Hel

6.4.6 LENGTH
語法:

LENGTH(str)

描述:

返回字符串 str 中的字符數(shù)。對于大對象(LOB)類型,該函數(shù)返回對象的字節(jié)長度。

例子:

SELECTLENGTH (‘length in char’) "length"FROM DUMMY;–14

6.4.7 LOCATE
語法:

LOCATE (haystack, needle)

描述:

返回字符串 haystack 中子字符串 needle 所在的位置。如果未找到,則返回 0。

例子:

SELECTLOCATE (‘length in char’, ‘char’) "locate"FROM DUMMY;–11

SELECTLOCATE (‘length in char’, ‘length’) "locate"FROM DUMMY;–1

SELECTLOCATE (‘length in char’, ‘zchar’) "locate"FROM DUMMY;–0

6.4.8 LOWER
語法:

LOWER (str)

描述:

將字符串 str 中所有字符轉(zhuǎn)換為小寫。

注意: LOWER 函數(shù)作用與 LCASE 相同。

例子:

SELECTLOWER (‘AnT’) "lower"FROM DUMMY;–ant

6.4.9 LPAD
語法:

LPAD (str, n [, pattern])

描述:

從左邊開始對字符串 str 使用空格進(jìn)行填充,達(dá)到 n 指定的長度。如果指定了 pattern 參數(shù),字符串 str 將按順序填充直到滿足 n 指定的長度。

例子:

SELECT LPAD (‘end’, 15, ‘12345’) "lpad"FROM DUMMY;–123451234512end

6.4.10 LTRIM
語法:

LTRIM (str [, remove_set])

描述:

返回字符串 str 截取所有前導(dǎo)空格后的值。如果定義了 remove_set, LTRIM 從起始位置移除字符串str 包含該集合中的字符,該過程持續(xù)至到達(dá)不在 remove_set 中的字符。

注意: remove_set 被視為字符集合,而非搜索字符。

例子:

SELECTLTRIM (‘babababAabend’,‘a(chǎn)b’) "ltrim"FROM DUMMY;–Aabend

6.4.11 NCHAR
語法:

NCHAR (n)

描述:

返回整數(shù) n 表示的 Unicode 字符。

例子:

SELECT UNICODE (‘江’) "unicode"FROM DUMMY;–27743

SELECTNCHAR (27743) "nchar"FROM DUMMY;–江

6.4.12 REPLACE
語法:

REPLACE (original_string, search_string, replace_string)

描述:

搜索 original_string 所有出現(xiàn)的 search_string,并用 replace_string 替換。

如果 original_string 為空, 則返回值也為空。

如果 original_string 中兩個重疊的子字符串與 search_string 匹配,只有第一個會被替換:

SELECTREPLACE (‘a(chǎn)bcbcb’,‘bcb’, ‘’) "replace"FROM DUMMY;–acb

如果 original_string 未出現(xiàn) search_string,則返回未修改的 original_string。

如果 original_string, search_string 或者 replace_string 為 NULL,則返回值也為 NULL。

例子:

SELECTREPLACE (‘DOWNGRADE DOWNWARD’,‘DOWN’, ‘UP’) "replace"FROM DUMMY;–UPGRADE UPWARD

6.4.13 RIGHT
語法:

RIGHT(str, n)

描述:

返回字符串 str 中最右邊的 n 字符/字節(jié)。

例子:

SELECTRIGHT(‘HI0123456789’, 3) "right"FROM DUMMY;–789

6.4.14 RPAD
語法:

RPAD (str, n [, pattern])

描述:

從尾部開始對字符串 str 使用空格進(jìn)行填充,達(dá)到 n 指定的長度。如果指定了 pattern 參數(shù),字符串 str 將按順序填充直到滿足 n 指定的長度。

例子:

SELECT RPAD (‘end’, 15, ‘12345’) "right padded"FROM DUMMY;–end123451234512

6.4.15 RTRIM
語法:

RTRIM (str [,remove_set ])

描述:

返回字符串 str 截取所有后置空格后的值。如果定義了 remove_set, RTRIM 從尾部位置移除字符串 str 包含該集合中的字符,該過程持續(xù)至到達(dá)不在 remove_set 中的字符。

注意: remove_set 被視為字符集合,而非搜索字符。

例子:

SELECTRTRIM (‘endabAabbabab’,‘a(chǎn)b’) "rtrim"FROM DUMMY;–endabA

6.4.16 SUBSTR_AFTER
語法:

SUBSTR_AFTER (str, pattern)

描述:

返回 str 中位于 pattern 第一次出現(xiàn)位置后的子字符串。

如果 str 不包含 pattern 子字符串,則返回空字符串。

如果 pattern 為空字符串,則返回 str。

如果 str 或者 pattern 為 NULL,則返回 NULL。

例子:

SELECT SUBSTR_AFTER (‘Hello My Friend’,‘My’) "substr after"FROM DUMMY;-- ’ Friend’

6.4.17 SUBSTR_BEFORE
語法:

SUBSTR_BEFORE (str, pattern)

描述:

返回 str 中位于 pattern 第一次出現(xiàn)位置前的子字符串。

如果 str 不包含 pattern 子字符串,則返回空字符串。

如果 pattern 為空字符串,則返回 str。

如果 str 或者 pattern 為 NULL,則返回 NULL。

例子:

SELECT SUBSTR_BEFORE (‘Hello My Friend’,‘My’) "substr before"FROM DUMMY;–'Hello ’

6.4.18 SUBSTRING
語法:

SUBSTRING (str, start_position [, string_length])

描述:

返回字符串 str 從 start_position 開始的子字符串。 SUBSTRING 可以返回 start_position 起的剩余部分字符或者作為可選,返回由 string_length 參數(shù)設(shè)置的字符數(shù)。

如果 start_position 小于 0,則被視為 1。

如果 string_length 小于 1,則返回空字符串。

例子:

SELECTSUBSTRING (‘1234567890’,4,2) "substring"FROM DUMMY;–45

6.4.19 TRIM
語法:

TRIM ([[LEADING | TRAILING | BOTH] trim_char FROM] str )

描述:

返回移除前導(dǎo)和后置空格后的字符串 str。截斷操作從起始(LEADING)、結(jié)尾(TRAILING)或者兩端(BOTH)執(zhí)行。

如果 str 或者 trim_char 為空,則返回 NULL。

如果沒有指定可選項, TRIM 移除字符串 str 中兩端的子字符串 trim_char。

如果沒有指定 trim_char,則使用單個空格(就是去空格)。

例子:

SELECTTRIM (‘a(chǎn)’FROM’aaa123456789aa’) "trim both"FROM DUMMY;–123456789

SELECTTRIM (LEADING’a’FROM’aaa123456789aa’) "trim leading"FROM DUMMY;–123456789aa

6.4.20 UCASE
語法:

UCASE (str)

描述:

將字符串 str 中所有字符轉(zhuǎn)換為大寫。

注意: UCASE 函數(shù)作用與 UPPER 函數(shù)相同。

例子:

SELECTUCASE (‘Ant’) "ucase"FROM DUMMY;–ANT

6.4.21 UNICODE
語法:

UNICODE?

描述:

返回字符串中首字母的 UnIcode 字符碼數(shù)字;如果首字母不是有效編碼,則返回 NULL。

例子:

SELECT UNICODE (‘江’) "unicode"FROM DUMMY;–27743

SELECTNCHAR (27743) "nchar"FROM DUMMY;–江

6.4.22 UPPER
語法:

UPPER (str)

描述:

將字符串 str 中所有字符轉(zhuǎn)換為大寫。

注意: UPPER 函數(shù)作用與 UCASE 相同。

例子:

SELECTUPPER (‘Ant’) "uppercase"FROM DUMMY;–ANT

6.5雜項函數(shù)
6.5.1 COALESCE
語法:

COALESCE (expression_list)

描述:

返回 list 中非 NULL 的表達(dá)式。 Expression_list 中必須包含至少兩個表達(dá)式,并且所有表達(dá)式都是可比較的。如果所有的參數(shù)都為 NULL,則結(jié)果也為 NULL。

例子:

CREATETABLE coalesce_example (ID INTPRIMARYKEY, A REAL, B REAL);

INSERTINTO coalesce_example VALUES(1, 100, 80);

INSERTINTO coalesce_example VALUES(2, NULL, 63);

INSERTINTO coalesce_example VALUES(3, NULL, NULL);

SELECT id, a, b, COALESCE (a, b*1.1, 50.0) "coalesce"FROM coalesce_example

6.5.2 CURRENT_CONNECTION
語法:

CURRENT_CONNECTION

描述:

返回當(dāng)前連接 ID。

例子:

SELECT CURRENT_CONNECTION "current connection"FROM DUMMY;–400,038

6.5.3 CURRENCT_SCHEMA
語法:

CURRENT_SCHEMA

描述:

返回當(dāng)前Schema名。

例子:

SELECT CURRENT_SCHEMA "current schema"FROM DUMMY;–SYSTEM

6.5.4 CURRENT_USER
語法:

CURRENT_USER

描述:

返回當(dāng)前語句上下文的用戶名,即當(dāng)前授權(quán)堆棧頂部的用戶名。

例子:

–使用SYSTEM用戶執(zhí)行基礎(chǔ)SQL

SELECT CURRENT_USER "current user"FROM DUMMY;–SYSTEM

– USER_A用戶創(chuàng)建存儲過程

CREATEPROCEDUREUSER_A.PROC1 LANGUAGE SQLSCRIPT SQL SECURITY DEFINER AS

BEGIN

SELECT CURRENT_USER "current user"FROM DUMMY;

END;

– USER_A用戶調(diào)用

CALL USER_A.PROC1;–USER_A

–授權(quán)予USER_B執(zhí)行USER_A.PROC1的權(quán)限后調(diào)用

CALL USER_A.PROC1;–USER_A

–將Schema USER_A授權(quán)予USER_B用戶后,通過USER_B用戶創(chuàng)建存儲過程

CREATEPROCEDUREUSER_A.PROC2 LANGUAGE SQLSCRIPT SQL SECURITY INVOKER AS

BEGIN

SELECT CURRENT_USER "current user"FROM DUMMY;

END;

– USER_A用戶調(diào)用

CALL USER_A.PROC2;-- USER_A

– USER_B用戶調(diào)用

CALL USER_A.PROC2;-- USER_B

6.5.5 GROUPING_ID
語法:

GROUPING_ID(column_name_list)

描述:

GROUPING_ID 函數(shù)可以使用 GROUPING SETS 返回單個結(jié)果集中的多級聚集。 GROUPING_ID 返回一個整數(shù)識別每行所在的組集合。 GROUPING_ID 每一列必須是 GROUPING SETS 中的元素。

通過把生成的位矢量從 GROUPING SETS 轉(zhuǎn)換為十進(jìn)制數(shù),將位矢量視作二進(jìn)制數(shù),分配GROUPING_ID。組成位矢量后,0 分配給 GROUPING SETS 指定的每一列,否則根據(jù) GROUPING SETS 出現(xiàn)的順序分配 1。通過將位矢量作為二進(jìn)制數(shù)處理,該函數(shù)返回一個整型值作為輸出。

例子:

SELECT customer, year, product, SUM(sales),GROUPING_ID(customer, year, product)

FROM guided_navi_tab

GROUPBYGROUPING SETS ((customer, year, product),(customer, year),(customer, product),(year, product),(customer),(year),(product));

CUSTOMER YEAR PRODUCT SUM(SALES) GROUPING_ID(CUSTOMER,YEAR,PRODUCT)

1 C1 2009 P1 100 0

2 C1 2010 P1 50 0

3 C2 2009 P1 200 0

4 C2 2010 P1 100 0

5 C1 2009 P2 200 0

6 C1 2010 P2 150 0

7 C2 2009 P2 300 0

8 C2 2010 P2 150 0

9 C1 2009 a 300 1

10 C1 2010 a 200 1

11 C2 2009 a 500 1

12 C2 2010 a 250 1

13 C1 a P1 150 2

14 C2 a P1 300 2

15 C1 a P2 350 2

16 C2 a P2 450 2

17 a 2009 P1 300 4

18 a 2010 P1 150 4

19 a 2009 P2 500 4

20 a 2010 P2 300 4

21 C1 a a 500 3

22 C2 a a 750 3

23 a 2009 a 800 5

24 a 2010 a 450 5

25 a a P1 450 6

26 a a P2 800 6

6.5.6 IFNULL
語法:

IFNULL (expression1, expression2)

描述:

返回輸入中第一個不為 NULL 的表達(dá)式。

如果 expression1 不為 NULL,則返回 expression1。

如果 expression2 不為 NULL,則返回 expression2。

如果輸入表達(dá)式都為 NULL,則返回 NULL。

例子:

SELECTIFNULL (‘diff’, ‘same’) "ifnull"FROM DUMMY;–diff

SELECTIFNULL (NULL, ‘same’) "ifnull"FROM DUMMY;–same

SELECTIFNULL (NULL, NULL) "ifnull"FROM DUMMY;–null

6.5.7 MAP
語法:

MAP (expression, search1, result1 [, search2, result2] … [, default_result])

描述:

在搜索集合中搜索 expression,并返回相應(yīng)的結(jié)果。

如果未找到 expression 值,并且定義了 default_result,則 MAP 返回 default_result。

如果未找到 expression 值,并且未定義 default_result,MAP 返回 NULL。

注意:

搜索值和相應(yīng)的結(jié)果總是以搜索-結(jié)果方式提供。

例子:

SELECTMAP(2, 0, ‘Zero’, 1, ‘One’, 2, ‘Two’, 3, ‘Three’, ‘Default’) "map"FROM DUMMY;–Two

SELECTMAP(99, 0, ‘Zero’, 1, ‘One’, 2, ‘Two’, 3, ‘Three’, ‘Default’) "map"FROM DUMMY;–Default

SELECTMAP(99, 0, ‘Zero’, 1, ‘One’, 2, ‘Two’, 3, ‘Three’) "map"FROM DUMMY;–null

6.5.8 NULLIF
語法:

NULLIF (expression1, expression2)

描述:

NULLIF 比較兩個輸入表達(dá)式的值,如果第一個表達(dá)式等于第二個,NULLIF 返回 NULL。

如果 expression1 不等于 expression2,NULLIF 返回 expression1。

如果 expression2 為 NULL,NULLIF 返回 expression1。

第一個參數(shù)不能是NULL

例子:

SELECTNULLIF (‘diff’, ‘same’) "nullif"FROM DUMMY;–diff

SELECTNULLIF(‘same’, ‘same’) "nullif"FROM DUMMY;–null

SELECTNULLIF(‘same’, null) "nullif"FROM DUMMY;–same

6.5.9 SESSION_CONTEXT
語法:

SESSION_CONTEXT(session_variable)

描述:

返回分配給當(dāng)前用戶的 session_variable 值。

訪問的 session_variable ,可以是預(yù)定義或者用戶自定義。預(yù)定義的會話變量可以通過客戶端設(shè)置的有’APPLICATION’, ‘APPLICATIONUSER’以及’TRACEPROFILE’。

會話變量可以定義或者修改通過使用命令 SET [SESSION] <variable_name> = ,使用 UNSET [SESSION] <variable_name>取消設(shè)置。

SESSION_CONTEXT 返回最大長度為 512 字符的 NVARCHAR 類型。

例子:

讀取會話變量:

SELECT SESSION_CONTEXT(‘APPLICATION’) "session context"FROM DUMMY;–HDBStudio

6.5.10 SESSION_USER
語法:

SESSION_USER

描述:

返回當(dāng)前會話的用戶名。

例子:

– example showing basic function operation using SYSTEM user

SELECT SESSION_USER "session user"FROM DUMMY;–SYSTEM

SYSUUID

語法:

6.5.11 SYSUUID
描述:

返回 SAP HANA 連接實例的 SYSUUID。

例子:

SELECT SYSUUID FROM DUMMY;–557A323598FE12F4E20036775F49B32D

7 SQL 語句
本章描述 SAP HANA 數(shù)據(jù)庫支持的 SQL 語句。

? Schema Definition and Manipulation Statements Schema操縱語句

? Data Manipulation Statements 數(shù)據(jù)操縱語句

? System Management Statements 系統(tǒng)管理語句

? Session Management Statements 會話管理語句

? Transaction Management Statements 事務(wù)管理語句

? Access Control Statements 訪問控制語句

? Data Import Export Statements 數(shù)據(jù)導(dǎo)入導(dǎo)出語句

7.1數(shù)據(jù)定義語句
7.1.1 ALTER AUDIT POLICY
語法:

ALTER AUDIT POLICY <policy_name> <audit_mode>

語法元素:

<policy_name> ::=

被改變的審計策略名:

<audit_mode> ::= ENABLE | DISABLE

Audit_mode 啟用或禁用審計策略。

ENABLE:啟用審計策略。

DISABLE:禁用審計策略。

描述:

ALTER AUDIT POLICY 語句啟用或禁用審計策略。 <policy_name>必須定義一個已存在的審計策略名。

只有擁有系統(tǒng)權(quán)限 AUDIT ADMIN 的數(shù)據(jù)庫用戶允許改變審計策略。每個擁有該權(quán)限的數(shù)據(jù)庫用戶可以修改任意的審計策略,無論是否由該用戶創(chuàng)建。

新建的審計策略默認(rèn)為禁用,并且不會發(fā)生任何審計。因此,必須啟動該審計策略來執(zhí)行審計。

審計策略可以視需要禁用和啟用。

配置參數(shù):

以下審計的配置參數(shù)存儲在文件 global.ini,在審計配置部分:

global_auditing_state ( ‘true’ / ‘false’ )

無論啟動的審計策略數(shù)量多少,審計只會在配置參數(shù) global_auditing_state 設(shè)置為 true 時啟用,默認(rèn)值 false。

default_audit_trail_type ( ‘SYSLOGPROTOCOL’ / ‘CSVTEXTFILE’ ) 指定如何存儲審計結(jié)果。

SYSLOGPROTOCOL:使用系統(tǒng) syslog。

CSVTEXTFILE:審計信息值以逗號分隔存儲在一個文本文件中。

default_audit_trail_path

指定 CSVTEXTFILE 存儲的文件路徑。

如果用戶擁有需要的系統(tǒng)權(quán)限,參數(shù)可以在監(jiān)控視圖 M_INIFILE_CONTENTS 中選擇。這些只有在顯示設(shè)置的情況下才可見。

系統(tǒng)表和監(jiān)控視圖:

AUDIT_POLICY:顯示所有審計策略和狀態(tài)。

M_INIFILE_CONTENTS:顯示數(shù)據(jù)庫系統(tǒng)配置參數(shù)。

只有擁有系統(tǒng)權(quán)限 CATALOG READ, DATA ADMIN 或 INIFILE ADMIN 的用戶可以查看

M_INIFILE_CONTENTS 視圖中的內(nèi)容,對于其他用戶則為空。

例子:

該例子中你需要先利用如下語句創(chuàng)建名為 priv_audit 的審計權(quán)限:

CREATE AUDIT POLICY priv_audit AUDITING SUCCESSFUL GRANT PRIVILEGE, REVOKE PRIVILEGE, GRANT ROLE, REVOKE ROLE LEVEL CRITICAL;

現(xiàn)在你可以啟用審計策略:

ALTER AUDIT POLICY priv_audit ENABLE;

你也可以禁用該審計策略:

ALTER AUDIT POLICY priv_audit DISABLE;

7.1.2 ALTER FULLTEXT INDEX
語法:

ALTER FULLTEXT INDEX <index_name> <alter_fulltext_index_option>

語法元素:

<index_name> ::=

被修改的全文索引標(biāo)識符:

<alter_fulltext_index_option> ::= <fulltext_parameter_list> | <queue_command> QUEUE

定義了全文索引的參數(shù)或者全文索引隊列的狀態(tài)是否應(yīng)該修改。后者只對異步顯式全文索引可見。

<fulltext_parameter_list> ::= <fulltext_parameter> [, …]

修改的全文索引參數(shù)列表:

<fulltext_parameter> ::= FUZZY SEARCH INDEX <on_off>

| PHRASE INDEX RATIO <index_ratio>

| <change_tracking_elem>

<on_off> ::= ON | OFF

FUZZY SEARCH INDEX

使用模糊搜索索引。

PHRASE INDEX RATIO

定義短語索引比率。

<index_ratio> ::= <float_literal>

定義短語索引比率的百分比,值必須為 0.0 與 1.0 之間。

SYNC[HRONOUS]

改變?nèi)乃饕镣侥J健?/p>

ASYNC[HRONOUS]

改變?nèi)乃饕廉惒侥J健?/p>

<flush_queue_elem> ::= EVERY <integer_literal> MINUTES

| AFTER <integer_literal> DOCUMENTS

| EVERY <integer_literal> MINUTES OR AFTER <integer_literal>

DOCUMENTS

當(dāng)使用異步索引時,你可以利用 flush_queue_elem 定義更新全文索引的時間。

<queue_command> ::= FLUSH | SUSPEND | ACTIVATE

FLUSH

利用正在處理隊列的文件更新全文索引。

SUSPEND

暫停全文索引處理隊列。

ACTIVATE

激活全文索引處理隊列。

描述:

使用該命令,你可以修改全文索引的參數(shù)或者索引處理隊列的狀態(tài)。隊列是用來激活全文索引以

異步方式工作的機制,例如插入操作被阻塞,直到文件處理完。

ALTER FULLTEXT INDEX <index_name> <fulltext_elem_list>語句修改全文索引的參數(shù)。

ALTER FULLTEXT INDEX <index_name> <queue_parameters>語句修改異步全文索引的處理隊列狀

態(tài)。

例子:

ALTER FULLTEXT INDEX i1 PHRASE INDEX RATIO 0.3 FUZZY SEARCH INDEX ON

在上述例子中,對于全文索引’i1’,短文索引比率設(shè)為 30,,并且啟用了模糊搜索索引。

ALTER FULLTEXT INDEX i2 SUSPEND QUEUE

暫停全文索引’i2’的隊列

ALTER FULLTEXT INDEX i2 FLUSH QUEUE

利用隊列中已處理的文件更新全文索引’i2’。

7.1.3 ALTER INDEX
ALTER INDEX <index_name> REBUILD

語法元素:

<index_name>::=

定義重建的索引名。

描述:

ALTER INDEX 語句重建索引。

例子:

以下例子重建索引 idx。

ALTER INDEX idx REBUILD;

7.1.4 ALTER SEQUENCE
語法:

ALTER SEQUENCE <sequence_name> [<alter_sequence_parameter_list>]

[RESET BY <reset_by_subquery>]

語法元素:

<sequence_name> ::=

被修改的序列名。

<alter_sequence_parameter_list> ::= <alter_sequence_parameter>, …

<alter_sequence_parameter> ::= <sequence_parameter_restart_with>

| <basic_sequence_parameter>

<sequence_parameter_restart_with> ::= RESTART WITH <restart_value>

<basic_sequence_parameter> ::= INCREMENT BY <increment_value>

| MAXVALUE <maximum_value>

| NO MAXVALUE

| MINVALUE <minimum_value>

| NO MINVALUE

| CYCLE

| NO CYCLE

RESTART WITH

序列的起始值。如果你沒有指定 RESTART WITH 子句的值,將使用當(dāng)前序列值。

<restart_value> ::= <integer_literal>

由序列生成器提供的第一個值為 0 至 4611686018427387903 之間的整數(shù)。

INCREMENT BY

序列增量值。

<increment_value> ::= <integer_literal>

利用一個整數(shù)增加或者減少序列的值。

MAXVALUE

定義序列生成的最大值。

<maximum_value> ::= <integer_literal>

一個正整數(shù)定義序列可生成的最大數(shù)值,必須為 0 至 4611686018427387903 之間。

NO MAXVALUE

使用 NO MAXVALUE 指令,遞增序列的最大值將為 4611686018427387903,遞減序列的最大值為-1。

MINVALUE

定義序列生成的最小值。

<minimum_value> ::= <integer_literal>

一個正整數(shù)定義序列可生成的最小數(shù)值,必須為 0 至 4611686018427387903 之間。

NO MINVALUE

使用 NO MINVALUE 指令,遞增序列的最小值將為 1,遞減序列的最小值為-

4611686018427387903。

CYCLE

使用 CYCLE 指令,序列在到達(dá)最大值或最小值后將會重新開始。

NO CYCLE

使用 NO CYCLE 指令,序列在到達(dá)最大值或最小值后將不會重新開始。

<reset_by_subquery> ::=

系統(tǒng)重啟期間,系統(tǒng)自動執(zhí)行 RESET BY 語句,并且將用 RESET BY 子查詢確定的值重啟序列。

關(guān)于子查詢的詳情,請參閱 Subquery。

描述:

ALTER SEQUENCE 語句用來修改序列生成器的參數(shù)。

例子:

在下面的例子中,你把序列 seq 的起始序列值改為 2。

ALTER SEQUENCE seq RESTART WITH 2;

在下面的例子中,你把序列 seq 的最大值改為 100,并且沒有最小值。

ALTER SEQUENCE seq MAXVALUE 100 NO MINVALUE;

在下面的例子中,你把序列 seq 的增量改為 2,并且限制為"no cycle"。

ALTER SEQUENCE seq INCREMENT BY 2 NO CYCLE;

在下面的例子中,你首先創(chuàng)建表 r,有一列 a。然后你將序列 seq 的 reset-by 子查詢修改為列 a 包

含的最大值。

CREATE TABLE r (a INT);

ALTER SEQUENCE seq RESET BY SELECT MAX(a) FROM r;

7.1.5 ALTER TABLE
語法:

ALTER TABLE [<schema_name>.]<table_name>{

<add_column_clause>

| <drop_column_clause>

| <alter_column_clause>

| <add_primary_key_clause>

| <drop_primary_key_clause>

| <preload_clause>

| <table_conversion_clause>

| <move_clause>

| <add_range_partition_clause>

| <move_partition_clause>

| <drop_range_partition_clause>

| <partition_by_clause>

| <disable_persistent_merge_clause>

| <enable_persistent_merge_clause>

| <enable_delta_log>

| <disable_delta_log>

| <enable_automerge>

| <disable_automerge>

}

語法元素:

<add_column_clause> ::= ADD ( <column_definition> [<column_constraint>], …)

<drop_column_clause> ::= DROP ( <column_name>, … )

<alter_column_clause> ::= ALTER ( <column_definition> [<column_constraint>], … )

<column_definition> ::= <column_name> <data_type> [<column_store_data_type>][<ddic_data_type>] [DEFAULT <default_value>] [GENERATED ALWAYS AS ]

<column_constraint> ::= NULL| NOT NULL| UNIQUE [BTREE | CPBTREE]| PRIMARY KEY [BTREE | CPBTREE]

<data_type> ::= DATE | TIME | SECONDDATE | TIMESTAMP | TINYINT | SMALLINT | INTEGER | BIGINT |SMALLDECIMAL | DECIMAL | REAL | DOUBLE| VARCHAR |

NVARCHAR | ALPHANUM | SHORTTEXT |VARBINARY | BLOB| CLOB | NCLOB | TEXT

<column_store_data_type> ::= CS_ALPHANUM | CS_INT | CS_FIXED | CS_FLOAT | CS_DOUBLE |CS_DECIMAL_FLOAT | CS_FIXED(p-s, s) | CS_SDFLOAT| CS_STRING |

CS_UNITEDECFLOAT | CS_DATE | CS_TIME| CS_FIXEDSTRING | CS_RAW | CS_DAYDATE | CS_SECONDTIME | CS_LONGDATE | CS_SECONDDATE

<ddic_data_type> ::= DDIC_ACCP | DDIC_ALNM | DDIC_CHAR | DDIC_CDAY | DDIC_CLNT | DDIC_CUKY| DDIC_CURR | DDIC_D16D | DDIC_D34D | DDIC_D16R |

DDIC_D34R | DDIC_D16S | DDIC_D34S| DDIC_DATS | DDIC_DAY | DDIC_DEC | DDIC_FLTP | DDIC_GUID| DDIC_INT1 | DDIC_INT2 | DDIC_INT4 | DDIC_INT8 | DDIC_LANG | DDIC_LCHR | DDIC_MIN|DDIC_MON| DDIC_LRAW | DDIC_NUMC | DDIC_PREC | DDIC_QUAN | DDIC_RAW| DDIC_RSTR | DDIC_SEC | DDIC_SRST | DDIC_SSTR | DDIC_STRG | DDIC_STXT | DDIC_TIMS| DDIC_UNIT| DDIC_UTCM | DDIC_UTCL | DDIC_UTCS | DDIC_TEXT | DDIC_VARC | DDIC_WEEK

<default_value> ::= NULL | <string_literal> | <signed_numeric_literal> | <unsigned_numeric_literal>

DEFAULT:DEFAULT 定義了 INSERT 語句沒有為列提供值情況下,默認(rèn)分配的值。

GENERATED ALWAYS AS:指定在運行時生成的列值的表達(dá)式。

<column_constraint> ::= NULL| NOT NULL| UNIQUE [BTREE | CPBTREE]| PRIMARY KEY [BTREE | CPBTREE]

NULL | NOT NULL:NOT NULL 禁止列的值為 NULL。如果指定了 NULL,將不被認(rèn)為是常量,其表示一列可能含有空值,默認(rèn)為 NULL。

UNIQUE:指定為唯一鍵的列。一個唯一的復(fù)合鍵指定多個列作為唯一鍵。有了 unique 約束,多行不能在同一列中具有相同的值。

PRIMARY KEY:主鍵約束是 NOT NULL 約束和 UNIQUE 約束的組合,其禁止多行在同一列中具有相同的值。

BTREE | CPBTREE:指定索引類型。當(dāng)列的數(shù)據(jù)類型為字符串、二進(jìn)制字符串、十進(jìn)制數(shù)或者約束是一個組合鍵,或非唯一鍵,默認(rèn)的索引類型為 CPBTREE,否則

使用 BTREE。

為了使用 B±樹索引,必須使用 BTREE 關(guān)鍵字;對于 CPB±樹索引,需使用 CPBTREE 關(guān)鍵字。

B±樹是維護(hù)排序后的數(shù)據(jù)進(jìn)行高效的插入、刪除和搜索記錄的樹。

CPB±樹表示壓縮前綴 B±樹,是基于 pkB-tree 樹。 CPB+樹是一個非常小的索引,因為它使用“部分鍵”,只是索引節(jié)點全部鍵的一部分。對于更大的鍵,

CPB±樹展現(xiàn)出比 B±樹更好的性能。

如果省略了索引類型, SAP HANA 數(shù)據(jù)庫將考慮列的數(shù)據(jù)類型選擇合適的索引。

ALTER時,增加一列的長度是可以做到的。當(dāng)在列式存儲中嘗試修改列的定義,不會返回錯誤,因為在數(shù)據(jù)庫中沒有做任何的檢查。錯誤可能發(fā)生在選擇列時,數(shù)據(jù)不符合新定義的數(shù)據(jù)類型。 ALTER 仍未遵照數(shù)據(jù)類型轉(zhuǎn)換規(guī)則。

將 NOT NULL 約束添加到已存在的列是可以的,如果表為空或者表有數(shù)據(jù)時定義了默認(rèn)值

<add_primary_key_clause> ::= ADD [CONSTRAINT <constraint_name>] PRIMARY KEY( <column_name>, … )

ADD PRIMARY KEY:增加一列主鍵。

PRIMARY KEY:主鍵約束是 NOT NULL 約束和 UNIQUE 約束的組合,其禁止多行在同一列中具有相同的值。

CONSTRAINT:指定約束名。

<drop_primary_key_clause> ::= DROP PRIMARY KEY

DROP PRIMARY KEY:刪除主鍵約束。

<preload_clause> ::= PRELOAD ALL | PRELOAD ( <column_name> ) | PRELOAD NONE

PRELOAD:設(shè)置/移除給定表或列的預(yù)載標(biāo)記。 PRELOAD ALL 為表中所有列設(shè)置預(yù)載標(biāo)記, PRELOAD( <column_name> )為指定的列設(shè)置標(biāo)記, PRELOAD NONE 移除

所有列的標(biāo)記。其結(jié)果是這些表在索引服務(wù)器啟動后自動加載至內(nèi)存中。預(yù)載標(biāo)記的當(dāng)前狀態(tài)在系統(tǒng)表 TABLES,列 PRELOAD 中可見, 可能值為(‘FULL’, ‘PARTIALLY’,

‘NO’);在系統(tǒng)表 TABLE_COLUMNS,列 PRELOAD,可能值為(‘TRUE’,‘FALSE’)。

<table_conversion_clause> ::= [ALTER TYPE] {ROW [THREADS <number_of_threads>] | COLUMN[THREADS <number_of_threads> [BATCH <batch_size>]]}

ALTER TYPE ROW | COLUMN:該命令用于將表存儲類型從行轉(zhuǎn)換為列或從列轉(zhuǎn)換為行。

THREADS <number_of_threads>:指定進(jìn)行表轉(zhuǎn)換的并行線程數(shù)。線程數(shù)目的最佳值應(yīng)設(shè)置為可用的 CPU 內(nèi)核的數(shù)量。

Default:默認(rèn)值為 param_sql_table_conversion_parallelism,即在 ndexserver.ini 文件中定義的 CPU內(nèi)核數(shù)。

BATCH <batch_size>:指定批插入的行數(shù),默認(rèn)值為最佳值 2,000,000。插入表操作在每個<batch_size>記錄插入后立即提交,可以減少內(nèi)存消耗。 BATCH 可選項只

可以在表 從行轉(zhuǎn)換為列時使用。然而,大于 2,000,000的批大小可能導(dǎo)致高內(nèi)存消耗,因此不建議修改該值。通過復(fù)制現(xiàn)有的表中的列和數(shù)據(jù),可以從現(xiàn)有的表

創(chuàng)建一個不同存儲類型的新表。該命令用來把表從行轉(zhuǎn)換為列或從列轉(zhuǎn)換為行。如果源表是行式存儲,則新建的表為列式存儲。

<move_clause> ::= MOVE [PARTITION <partition_number>] TO [LOCATION ]<host_port> [PHYSICAL] |MOVE [PARTITION <partition_number>] PHYSICAL

MOVE 將表移動至分布式環(huán)境中的另一個位置。 端口號是內(nèi)部索引服務(wù)器的端口號, 3xx03。如果你有一個分區(qū)表,你可以通過指定可選的分區(qū)號只移動個別部

分,移動分區(qū)表時,沒有指定分區(qū)號會導(dǎo)致錯誤。

PHYSICAL 關(guān)鍵字只適用列式存儲表。行式存儲表總是物理移動。如果指定了可選關(guān)鍵字 PHYSICAL,持久存儲立即移動至目標(biāo)主機。否則,此舉將創(chuàng)建一個新主機

里面的持久層鏈接指向舊主機持久層。該鏈接如果沒有 TO<host_port>部分,將在下次合并或者移 動中刪除。PHYSICAL 移動操作沒有指定 TO <host_port>時,將移

除從上次移動中仍然存在的持久層鏈接。

LOCATION 僅支持向后兼容

<add_range_partition_clause> ::= ADD PARTITION <lower_value> <= VALUES < <upper_value>| PARTITION <value_or_values> = <target_value>| PARTITION OTHERS

ADD PARTITION:為一個分區(qū)表添加分區(qū),使用 RANGE, HASH RANGE, ROUNDROBIN RANGE 關(guān)鍵字。當(dāng)添加分區(qū)至一張按范圍分區(qū)的表時,如果需要的話,可以對

其余分區(qū)進(jìn)行重新分區(qū)。

<drop_range_partition_clause> ::= DROP PARTITION <lower_value> <= VALUES < <upper_value>| PARTITION <value_or_values> = <target_value>| PARTITION OTHERS

DROP PARTITION:刪除根據(jù) RANGE, HASH RANGE, ROUNDROBIN RANGE 分區(qū)的表的分區(qū)。

<partition_clause> ::= PARTITION BY <hash_partition> [,<range_partition> | ,<hash_partition>]| PARTITION BY <range_partition>| PARTITION BY <roundrobin_partition>

[,<range_partition>]

<hash_partition> ::=HASH (<partition_expression>[, …]) PARTITIONS { <num_partitions> |GET_NUM_SERVERS() }

<range_partition> ::= RANGE ( <partition_expression> ) ( <range_spec> )

<roundrobin_partition> ::= ROUNDROBIN PARTITIONS {<num_partitions> |GET_NUM_SERVERS()}

<range_spec> ::= {<from_to_spec> | <single_spec>[,…] } [, PARTITION OTHERS]

<from_to_spec> ::= PARTITION <lower_value> <= VALUES < <upper_value>

<single_spec> ::= PARTITION VALUE <single_value>

<partition_expression> ::= <column_name>| YEAR(<column_name>) | MONTH(<column_name>)

PARTITION BY:使用 RANGE, HASH RANGE, ROUNDROBIN RANGE 對表進(jìn)行分區(qū)。關(guān)于表分區(qū)自居,請參見 CREATE TABLE。

<merge_partition_clause> ::= MERGE PARTITIONS

MERGE PARTITIONS:合并分區(qū)表的所有部分至非分區(qū)表。

<disable_persistent_merge_clause> ::= DISABLE PERSISTENT MERGE

DISABLE PERSISTENT MERGE:指導(dǎo)合并管理器對于給定表,使用內(nèi)存進(jìn)行合并而非持久合并。

<enable_persistent_merge_clause> ::= ENABLE PERSISTENT MERGE

ENABLE PERSISTENT MERGE:指導(dǎo)合并管理器對于給定表使用持久合并。

<enable_delta_log> ::= ENABLE DELTA LOG

啟動表日志記錄。啟用之后,你必須執(zhí)行一個保存點以確保所有的數(shù)據(jù)都保存,并且你必須執(zhí)行數(shù)據(jù)備份,否則你不能恢復(fù)這些數(shù)據(jù)。

<enable_delta_log> ::= DISABLE DELTA LOG

DISABLE DELTA LOG:禁用表日志記錄。如果禁用,不會記錄該表的日志。當(dāng)完成一個保存點對于該表的修改只會寫到數(shù)據(jù)域,這會導(dǎo)致當(dāng)索引服務(wù)器終止時,提

交的事務(wù)丟失。

僅在初次加載中使用該命令!

<enable_delta_log> ::= ENABLE AUTOMERGE

指導(dǎo)合并管理器處理表。

<enable_delta_log> ::= DISABLE AUTOMERGE

DISABLE AUTOMERGE:指導(dǎo)合并管理器忽略該表。

例子:

表 t 已創(chuàng)建,列 b 的默認(rèn)值設(shè)為 10。

CREATETABLE t (a INT, b INT);

ALTERTABLE t ALTER (b INTDEFAULT 10);

列 c 添加至表 t。

ALTERTABLE t ADD (c NVARCHAR(10) DEFAULT’NCHAR’);

創(chuàng)建表 t 的主鍵約束 prim_key。

ALTERTABLE t ADDCONSTRAINT prim_key PRIMARYKEY (a, b);

表 t 類型轉(zhuǎn)換為列式 (COLUMN)。

ALTERTABLE t COLUMN;

設(shè)置列 b 和 c 的預(yù)載標(biāo)記

ALTERTABLE t PRELOAD (b, c);

表 t 使用 RANGE 分區(qū),并且添加另一分區(qū)。

ALTERTABLE t PARTITIONBY RANGE (a) (PARTITIONVALUE = 1, PARTITION OTHERS);

ALTERTABLE t ADDPARTITION 2 <= VALUES < 10;

表 t 的會話類型改為 HISTORY

ALTERTABLE t CREATEHISTORY;

禁用表 t 的日志記錄。

ALTERTABLE t DISABLEDELTALOG;

7.1.6 CREATE AUDIT POLICY
語法:

CREATE AUDIT POLICY <policy_name> AUDITING <audit_status_clause> <audit_action_list> LEVEL <audit_level>

語法元素:

<audit_status_clause> ::= SUCCESSFUL | UNSUCCESSFUL | ALL

<audit_action_list> ::= <audit_action_name>[,<audit_action_name>]…

<audit_action_name> ::=GRANT PRIVILEGE | REVOKE PRIVILEGE| GRANT STRUCTURED PRIVILEGE | REVOKE STRUCTURED PRIVILEGE| GRANT ROLE | REVOKE ROLE| GRANT

ANY | REVOKE ANY| CREATE USER | DROP USER| CREATE ROLE | DROP ROLE| ENABLE AUDIT POLICY | DISABLE AUDIT POLICY| CREATE STRUCTURED PRIVILEGE| DROP STRUCTURED PRIVILEGE| ALTER STRUCTURED PRIVILEGE| CONNECT| SYSTEM CONFIGURATION CHANGE| SET SYSTEM LICENSE| UNSET SYSTEM LICENSE

<audit_level> ::=EMERGENCY| ALERT| CRITICAL| WARNING| INFO

描述:

CREATE AUDIT POLICY 語句創(chuàng)建新的審計策略。該審計策略可以稍后啟動,并將導(dǎo)致指定的審計活動發(fā)生的審計。

只有擁有系統(tǒng)權(quán)限 AUDIT ADMIN 用戶才可以新建審計策略。

指定的審計策略名必須和已有的審計策略名不同。

審計策略定義將被審計的審計活動。現(xiàn)有的審計策略需要被激活,從而進(jìn)行審計。

<audit_status_clause>定義, 成功或不成功或執(zhí)行指定的審計活動進(jìn)行審核。

以下的審計活動是可供使用的。它們被分在不同的組里。一組審計活動可以組合成一個審計策略,不同組的審計行動不能組合成審計策略。

GRANT PRIVILEGE 1 審計授予用戶或角色的權(quán)限
REVOKE PRIVILEGE 1 審計撤銷用戶或角色的權(quán)限
GRANT STRUCTURED PRIVILEGE 1 審計授予用戶的結(jié)構(gòu)/分析權(quán)限
REVOKE STRUCTURED PRIVILEGE 1 審計撤銷用戶的結(jié)構(gòu)/分析權(quán)限
GRANT ROLE 1 審計授予用戶或角色的角色
REVOKE ROLE 1 審計撤銷用戶或角色的角色
GRANT ANY 1 審計授予用戶或角色的權(quán)限、結(jié)構(gòu)/分析權(quán)限或角色
REVOKE ANY 1 審計撤銷用戶或角色的權(quán)限、結(jié)構(gòu)/分析權(quán)限或角色
CREATE USER 2 審計用戶創(chuàng)建
DROP USER 2 審計用戶刪除
CREATE ROLE 2 審計角色創(chuàng)建
DROP ROLE 2 審計角色刪除
CONNECT 3 審計連接到數(shù)據(jù)庫的用戶
SYSTEM CONFIGURATION CHANGE 4 審計系統(tǒng)配置的更改(e.g. INIFILE)
ENABLE AUDIT POLICY 5 審計審核策略激活
DISABLE AUDIT POLICY 5 審計審核策略停用
CREATE STRUCTURED PRIVILEGE 6 審計結(jié)構(gòu)化/分析權(quán)限創(chuàng)建
DROP STRUCTURED PRIVILEGE 6 審計結(jié)構(gòu)化/

ALTER STRUCTURED PRIVILEGE 6 審計結(jié)構(gòu)化/分析權(quán)限更改
SET SYSTEM LICENSE 7 審計許可證安裝
UNSET SYSTEM LICENSE 7 審計許可證刪除

每一個審計分配分配至審計級別,可能的值按照重要性遞減有:EMERGENCY, ALERT, CRITICAL, WARNING, INFO

為了使得審計活動發(fā)生,審計策略必須建立并啟動, global_auditing_state(見下文)必須設(shè)置為true。

配置參數(shù):

目前,審計的配置參數(shù)存儲在 global.ini,部分審計配置如下:

global_auditing_state ( ‘true’ / ‘false’ )激活/關(guān)閉所有審計,無論有多少審計策略可用和啟動。默認(rèn)為 false,代表沒有審計會發(fā)生。

default_audit_trail_type ( ‘SYSLOGPROTOCOL’ / ‘CSVTEXTFILE’ )定義如何存儲審計結(jié)果。

SYSLOGPROTOCOL 為默認(rèn)值。

CSVTEXTFILE 應(yīng)只用于測試目的。

default_audit_trail_path 指定 存儲文件的位置, CSVTEXTFILE 已經(jīng)選定的情況下。

對于所有的配置參數(shù),可以在視圖 M_INIFILE_CONTENTS 中選擇,如果當(dāng)前用戶具有這樣做所需的權(quán)限。但是目前這些參數(shù)只有在被顯式設(shè)置后才可見。這意味著,它們將對新安裝的數(shù)據(jù)庫實例不可見。

系統(tǒng)和監(jiān)控視圖

AUDIT_POLICY:顯式所有審計策略和其狀態(tài)

M_INIFILE_CONTENTS:顯示審計有關(guān)的配置參數(shù)

只有數(shù)據(jù)庫用戶具有 CATALOG READ, DATA ADMIN 或 INIFILE ADMIN 權(quán)限可以在視圖M_INIFILE_CONTENTS 查看任意信息,對于其他用戶,該視圖為空。

例子

新建的名為 priv_audit 的審計策略將審計有關(guān)成功授予和撤銷權(quán)限和角色的命令,該審計策略有中等審計級別 CRITICAL.。

該策略必須顯式啟動(見 alter_audit_policy),使得審計策略的審計發(fā)生。

CREATEAUDIT POLICY priv_audit AUDITING SUCCESSFUL GRANT PRIVILEGE, REVOKE PRIVILEGE, GRANT ROLE, REVOKE ROLE LEVEL CRITICAL;

7.1.7 CREATE FULLTEXT INDEX
語法:

CREATE FULLTEXT INDEX <index_name> ON ‘(’ <column_name> ‘)’ [<fulltext_parameter_list>]

定義全文索引名:

<fulltext_parameter_list> ::= <fulltext_parameter> [, …]

<fulltext_parameter> ::= LANGUAGE COLUMN <column_name>

| LANGUAGE DETECTION ‘(’ <string_literal_list> ‘)’

| MIME TYPE COLUMN <column_name>

| <change_tracking_elem>

| FUZZY SEARCH INDEX <on_off>

| PHRASE INDEX RATIO <on_off>

| CONFIGURATION <string_literal>

| SEARCH ONLY <on_off>

| FAST PREPROCESS <on_off>

<on_off> ::= ON | OFF

LANGUAGE COLUMN:指定文件語言的列

LANGUAGE DETECTION:語言檢測設(shè)置的語言集合。

MIME TYPE COLUMN:指定文件 mime-type 的列

FUZZY SEARCH INDEX:指定是否使用模糊搜索

PHRASE INDEX RATIO:指定短語索引比率的百分比,值必須為 0.0 和 1.0 之間。

CONFIGURATION:自定義配置文件的文本分析路徑。

SEARCH ONLY:如果設(shè)為 ON,將不存儲原始文件內(nèi)容。

FAST PREPROCESS:如果設(shè)為 ON,將使用快速處理,例如語言搜索將不可用。

<change_tracking_elem> ::= SYNC[HRONOUS]| ASYNC[HRONOUS] [FLUSH [QUEUE]<flush_queue_elem>]

SYNC:指定是否創(chuàng)建同步全文索引

ASYNC:指定是否創(chuàng)建異步全文索引

<flush_queue_elem> ::= EVERY <integer_literal> MINUTES| AFTER <integer_literal> DOCUMENTS| EVERY <integer_literal> MINUTES OR AFTER <integer_literal> DOCUMENTS

指定如果使用異步索引,更新全文索引的時機。

描述:

CREATE FULLTEXT INDEX 語句對給定表創(chuàng)建顯式全文索引。

例子:

CREATE FULLTEXT INDEX i1 ON A? FUZZY SEARCH INDEXOFF

SYNC

LANGUAGE DETECTION (‘EN’,‘DE’,‘KR’)

上面的例子在表 A 的列 C 創(chuàng)建名為‘i1’的全文索引,未使用模糊搜索索引, 語言檢測設(shè)置的語言集合由’EN’,‘DE’ 和 'KR’組成。

7.1.8 CREATE INDEX
語法:

CREATE [UNIQUE] [BTREE | CPBTREE] INDEX [<schema_name>.]<index_name> ON <table_name>(<column_name_order>, …) [ASC | DESC]

語法元素:

<column_name_order> ::= <column_name> [ASC | DESC]

UNIQUE:用來創(chuàng)建唯一性索引。當(dāng)創(chuàng)建索引和記錄添加到表中將進(jìn)行重復(fù)檢查。

BTREE | CPBTREE:用來選擇使用的索引類型。當(dāng)列的數(shù)據(jù)類型為字符串、二進(jìn)制字符串、十進(jìn)制數(shù)或者約束是一個組合鍵,或非唯一鍵,默認(rèn)的索引類型為 CPBTREE,否則使用 BTREE。

為了使用 B±樹索引,必須使用 BTREE 關(guān)鍵字;對于 CPB±樹索引,需使用 CPBTREE 關(guān)鍵字。

B±樹是維護(hù)排序后的數(shù)據(jù)進(jìn)行高效的插入、刪除和搜索記錄的樹。

CPB±樹表示壓縮前綴 B±樹,是基于 pkB-tree 樹。 CPB+樹是一個非常小的索引,因為它使用“部分鍵”,只是索引節(jié)點全部鍵的一部分。對于更大的鍵, CPB±樹展現(xiàn)出比 B±樹更好的性能。

如果省略了索引類型, SAP HANA 數(shù)據(jù)庫將考慮列的數(shù)據(jù)類型選擇合適的索引。

ASC | DESC:指定以遞增或遞減方式創(chuàng)建索引。

這些關(guān)鍵字只能在 btree 索引使用,并且對每一列只能使用一次。

描述:

CREATE INDEX 語句創(chuàng)建索引。

例子:

表 t 創(chuàng)建后,以遞增方式對表 t 的 b 列創(chuàng)建 CBPTREE 索引 idx。

CREATETABLE t (a INT, b NVARCHAR(10), c NVARCHAR(20));

CREATEINDEX idx ON t(b);

以遞增方式對表 t 的 a 列創(chuàng)建 CBPTREE 索引 idx,以遞減順序?qū)?b 列創(chuàng)建:

CREATE CPBTREE INDEX idx1 ON t(a, b DESC);

以遞減方式對表 t 的 a 列和 c 列創(chuàng)建 CPBTREE 索引 idx2。

CREATEINDEX idx2 ON t(a, c) DESC;

以遞增順序?qū)Ρ?t 的 b 列和 c 列創(chuàng)建唯一性 CPBTREE 索引 idx3。

CREATEUNIQUEINDEX idx3 ON t(b, c);

以遞增順序?qū)Ρ?t 的 a 列創(chuàng)建唯一性 BTREE 索引 idx4。

CREATEUNIQUEINDEX idx4 ON t(a);

7.1.9 CREATE SCHEMA
語法:

CREATE SCHEMA <schema_name> [OWNED BY <user_name>]

OWNED BY:指定Schema所有者名字。如果省略,當(dāng)前用戶將為Schema所有者。

描述:

CREATE SCHEMA 語句在當(dāng)前數(shù)據(jù)庫創(chuàng)建Schema。

例子:

CREATESCHEMA my_schema OWNED BYsystem;

7.1.10 CREATE SEQUENCE
語法:

CREATE SEQUENCE <sequence_name> [<common_sequence_parameter_list>] [RESET BY ]

語法元素:

<common_sequence_parameter_list> ::= <common_sequence_parameter>, …

<common_sequence_parameter> ::= START WITH n | <basic_sequence_parameter>

<basic_sequence_parameter> ::= INCREMENT BY n| MAXVALUE n| NO MAXVALUE| MINVALUE n| NO MINVALUE| CYCLE| NO CYCLE

INCREMENT BY:定義上個分配值遞增到下一個序列值的量(即遞增遞減間隔值),默認(rèn)值為 1。指定一個負(fù)的值來生成一個遞減的序列。 INCREMENT BY 值為 0,將返回錯誤。

START WITH:定義起始序列值。如果未定義 START WITH 子句值,遞增序列將使用 MINVALUE,遞減序列將使用MAXVALUE。

MAXVALUE:定義序列可生成的最大數(shù)值,必須為 0 至 4611686018427387903 之間。

NO MAXVALUE:使用 NO MAXVALUE 指令,遞增序列的最大值將為 4611686018427387903,遞減序列的最大值為-1。

MINVALUE:定義序列可生成的最小數(shù)值,必須為 0 至 4611686018427387903 之間。

NO MINVALUE:使用 NO MINVALUE 指令,遞增序列的最小值將為 1,遞減序列的最小值為-4611686018427387903。

CYCLE:使用 CYCLE 指令,序列在到達(dá)最大值或最小值后將會重新開始。

NO CYCLE:使用 NO CYCLE 指令,序列在到達(dá)最大值或最小值后將不會重新開始。

RESET BY:系統(tǒng)重啟期間,系統(tǒng)自動執(zhí)行 RESET BY 語句,并且將用 RESET BY 子查詢確定的值重啟序列。

如果未指定 RESET BY,序列值將持久地存儲在數(shù)據(jù)庫中。在數(shù)據(jù)庫重啟過程中,序列的下一個值將由已保存的序列值生成。

描述:

CREATE SEQUENCE 語句用來創(chuàng)建序列。

序列用來為多個用戶生成唯一整數(shù)。 CURRVAL 用來獲取序列的當(dāng)前值,NEXTVAL 則用來獲取序列的下一個值。 CURRVAL 只有在會話中調(diào)用 NEXTVAL 才有效。

例子:

例子 1:

序列 seq 已創(chuàng)建,使用 CURRVAL 和 NEXTVAL 從序列中讀取值。

CREATESEQUENCE seq START WITH 11;

NEXTVAL 返回 11:

SELECT seq.NEXTVAL FROM DUMMY;–11

CURRVAL 返回 11:

SELECT seq.CURRVAL FROM DUMMY;–11

例子 2:

如果序列用來在表 R 的 A 列上創(chuàng)建唯一鍵,在數(shù)據(jù)庫重啟后,通過自動分配列 A 的最大值到序列,創(chuàng)建一個唯一鍵值,語句如下:

CREATETABLE r (a INT);

CREATESEQUENCE s RESETBYSELECTIFNULL(MAX(a), 0) + 1 FROM r;

SELECT s.NEXTVAL FROM DUMMY;–1

7.1.11 CREATE SYNONYM
語法:

CREATE [PUBLIC] SYNONYM <synonym_name> FOR <object_name>

語法元素:

<object_name> ::= <table_name>| <view_name>| <procedure_name>| <sequence_name>

描述:

CREATE SYNONYM 為表、視圖、存儲過程或者序列創(chuàng)建備用名稱。

你可以使用同義詞把函數(shù)和存儲過程重新指向不同的表、視圖或者序列,而不需要重寫函數(shù)或者過程。

可選項 PUBLIC 允許創(chuàng)建公用同義詞。任何用戶可以訪問公用同義詞,但只有擁有基本對象合適權(quán)限的用戶可以訪問基本對象。

例子:

CREATESYNONYM t_synonym FOR t;

7.1.12 CREATE TABLE
語法:

CREATE [<table_type>] TABLE [<schema_name>.]<table_name> <table_contents_source>[<logging_option> | <auto_merge_option> | <partition_clause> | <location_clause>]

語法元素:

<table_type> ::= COLUMN| ROW| HISTORY COLUMN| GLOBAL TEMPORARY| LOCAL TEMPORARY

COLUMN, ROW:如果大多數(shù)的訪問是通過大量元組,而只選擇少數(shù)幾個屬性,應(yīng)使用基于列的存儲。如果大多數(shù)訪問選擇一些記錄的全部屬性,使用基于行的存儲是最好的。 SAP HANA 數(shù)據(jù)庫使用組合啟用兩種方式的的存儲和解釋。你可以為每張表指定組織類型,默認(rèn)值為 ROW。

HISTORY COLUMN:利用特殊的事務(wù)會話類型稱為’HISTORY’創(chuàng)建表。具有會話類型’HISTORY’的表支持“時間旅行”, 對歷史狀態(tài)的數(shù)據(jù)庫查詢的執(zhí)行是可能的。

時間旅行可以以如下方式完成:

會話級別時間旅行:

SET HISTORY SESSION TO UTCTIMESTAMP = <utc_timestamp>

SET HISTORY SESSION TO COMMIT ID = <commit_id>

<utc_timestamp> ::= <string_literal>

<commit_id> ::= <unsigned_integer>

數(shù)據(jù)庫會話可以設(shè)置回到一個特定時間點。該語句的 COMMIT ID 變量接受 commitid 作為參數(shù)。commitid 參數(shù)的值必須存在系統(tǒng)表 SYS.TRANSACTION_HISTORY 的 COMMIT_ID 列,否則將拋出異常。 COMMIT_ID 在使用用戶定義的快照時是有用的。用戶自定義的快照可以通過存儲在提交階段分配至事務(wù)的 commitid 來獲得。 Commitid 可以通過在事務(wù)提交后執(zhí)行以下查詢來讀取:

SELECT LAST_COMMIT_ID FROM M_TRANSACTIONS WHERE CONNECTION_ID = CURRENT_CONNECTION;

該語句的 TIMESTAMP 變量接受時間戳作為參數(shù)。在系統(tǒng)內(nèi)部,時間戳用來在系統(tǒng)表SYS.TRANSACTION_HISTORY,commit_time 接近給定的時間戳的地方,查詢一對(commit_time,commit_id),準(zhǔn)確的說,選擇最大 COMMIT_TIME 小于等于給定時間戳的對;如果沒有找到這樣的對,將會拋出異常。然后會話將使用 COMMIT_ID 變量確定的 commit-id 恢復(fù)。 要終止恢復(fù)會話切換到當(dāng)前會話中,必須在數(shù)據(jù)庫連接上執(zhí)行明確的 COMMIT 或 ROLLBACK。

語句級別時間旅行:

AS OF UTCTIMESTAMP <utc_timestamp>

AS OF COMMIT ID <commit_id>

為了能使 commitid 與提交時間關(guān)聯(lián),需維護(hù)系統(tǒng)表 SYS.TRANSACTION_HISTORY,存儲每個為歷史表提交數(shù)據(jù)的事務(wù)的額外信息。有關(guān)設(shè)置會話級別時間旅行的詳細(xì)信息,請參閱 SET HISTORY SESSION,關(guān)于的信息,請參閱 Subquery。

注意:

當(dāng)會話恢復(fù)時,自動提交必須關(guān)閉(否則會拋出包含相應(yīng)錯誤消息的異常)。

非歷史表在恢復(fù)會話中總顯示其當(dāng)前快照。

只有數(shù)據(jù)查詢語句(select)可以在恢復(fù)會話中使用。

歷史表必須有主鍵。

會話類型可以通過系統(tǒng)表 SYS.TABLES 的 SESSION_TYPE 列檢查。

GLOBAL TEMPORARY:

表定義全局可見,但數(shù)據(jù)只在當(dāng)前會話中可見。表在會話結(jié)束后截斷。

全局臨時表的元數(shù)據(jù)是持久的,表示該元數(shù)據(jù)一直存在直到表被刪除,元數(shù)據(jù)在會話間共享。臨時表中的數(shù)據(jù)是會話特定的,代表只有全局臨時表的所有者才允許插入、讀取、刪除數(shù)據(jù),存在于會話持續(xù)期間,并且當(dāng)會話結(jié)束時,全局臨時表中的數(shù)據(jù)會自動刪除。全局臨時表只有當(dāng)表中沒有任何數(shù)據(jù)才能被刪除。全局臨時表支持的操作:

  • Create without a primary key

  • Rename table

  • Rename column

  • Truncate

  • Drop

  • Create or Drop view on top of global temporary table

  • Create synonym

  • Select

  • Select into or Insert

  • Delete

  • Update

  • Upsert or Replace

  • LOCAL TEMPORARY:

    表的定義和數(shù)據(jù)只在當(dāng)前會話可見,該表在會話結(jié)束時被截斷。

    元數(shù)據(jù)在會話間共享,并且是會話特定的,代表只有本地臨時表的所有者才允許查看。臨時表中的數(shù)據(jù)是會話特定的,代表只有本地臨時表的所有者才允許插入、讀取、刪除數(shù)據(jù),存在于會話持續(xù)期間,并且當(dāng)會話結(jié)束時,本地臨時表中的數(shù)據(jù)會自動刪除。

    本地臨時表支持的操作:

  • Create without a primary key

  • Truncate

  • Drop

  • Select

  • Select into or Insert

  • Delete

  • Update

  • Upsert or Replace

  • <table_contents_source> ::= (<table_element>, …)| <like_table_clause> [WITH [NO] DATA]| [(<column_name>, …)] <as_table_subquery> [WITH [NO] DATA]]

    <table_element> ::= <column_definition> [<column_constraint>]| <table_constraint> (<column_name>, … )

    <column_definition> ::= <column_name> <data_type> [<column_store_data_type>] [<ddic_data_type>][DEFAULT <default_value>] [GENERATED ALWAYS AS

    ]

    <data_type> ::= DATE | TIME | SECONDDATE | TIMESTAMP | TINYINT | SMALLINT | INTEGER | BIGINT |SMALLDECIMAL | DECIMAL | REAL | DOUBLE|

    VARCHAR | NVARCHAR | ALPHANUM | SHORTTEXT |VARBINARY |BLOB | CLOB | NCLOB | TEXT

    <column_store_data_type> ::= S_ALPHANUM | CS_INT | CS_FIXED | CS_FLOAT| CS_DOUBLE |CS_DECIMAL_FLOAT | CS_FIXED(p-s, s) | CS_SDFLOAT|

    CS_STRING | CS_UNITEDECFLOAT | CS_DATE |CS_TIME | CS_FIXEDSTRING | CS_RAW | CS_DAYDATE | CS_SECONDTIME | CS_LONGDATE |CS_SECONDDATE

    <ddic_data_type> ::= DDIC_ACCP | DDIC_ALNM | DDIC_CHAR | DDIC_CDAY | DDIC_CLNT | DDIC_CUKY| DDIC_CURR | DDIC_D16D | DDIC_D34D | DIC_D16R

    | DDIC_D34R | DDIC_D16S | DDIC_D34S| DDIC_DATS | DDIC_DAY | DDIC_DEC | DDIC_FLTP | DDIC_GUID | DDIC_INT1 | DDIC_INT2 | DDIC_INT4| DDIC_INT8 | DDIC_LANG | DDIC_LCHR | DDIC_MIN | DDIC_MON| DDIC_LRAW | DDIC_NUMC |DDIC_PREC |DDIC_QUAN | DDIC_RAW | DDIC_RSTR | DDIC_SEC | DDIC_SRST | DDIC_SSTR |DDIC_STRG | DDIC_STXT | DDIC_TIMS | DDIC_UNIT| DDIC_UTCM | DDIC_UTCL | DDIC_UTCS |DDIC_TEXT | DDIC_VARC | DDIC_WEEK

    <default_value> ::= NULL | <string_literal> | <signed_numeric_literal>| <unsigned_numeric_literal>

    DEFAULT:DEFAULT 定義了 INSERT 語句沒有為列提供值情況下,默認(rèn)分配的值。

    GENERATED ALWAYS AS:指定在運行時生成的列值的表達(dá)式。

    <column_constraint> ::= NULL| NOT NULL| UNIQUE [BTREE | CPBTREE]| PRIMARY KEY [BTREE | CPBTREE]

    NULL | NOT NULL:NOT NULL 禁止列的值為 NULL。如果指定了 NULL,將不被認(rèn)為是常量,其表示一列可能含有空值,默認(rèn)為 NULL。

    UNIQUE:指定為唯一鍵的列。一個唯一的復(fù)合鍵指定多個列作為唯一鍵。有了 unique 約束,多行不能在同一列中具有相同的值。

    PRIMARY KEY:主鍵約束是 NOT NULL 約束和 UNIQUE 約束的組合,其禁止多行在同一列中具有相同的值。

    BTREE | CPBTREE:指定索引類型。當(dāng)列的數(shù)據(jù)類型為字符串、二進(jìn)制字符串、十進(jìn)制數(shù)或者約束是一個組合鍵,或非唯一鍵,默認(rèn)的索引類型為 PBTREE,

    否則使用 BTREE。為了使用 B±樹索引,必須使用 BTREE 關(guān)鍵字;對于 CPB±樹索引,需使用 CPBTREE 關(guān)鍵字。B±樹是維護(hù)排序后的數(shù)據(jù)進(jìn)行高效的插入、刪除和搜索記錄的樹。CPB±樹表示壓縮前綴 B±樹,是基于 pkB-tree 樹。 CPB+樹是一個非常小的索引,因為它使用“部分鍵”,只是索引節(jié)點全部鍵的一部分。對于更大的鍵, CPB±樹展現(xiàn)出比 B±樹更好的性能。如果省略了索引類型, SAP HANA 數(shù)據(jù)庫將考慮列的數(shù)據(jù)類型選擇合適的索引。

    <table_constraint> ::= UNIQUE [BTREE | CPBTREE]| PRIMARY KEY [BTREE | CPBTREE]

    定義了表約束可以使用在表的一列或者多列上。

    <like_table_clause> ::= LIKE <table_name>

    創(chuàng)建與 like_table_name 定義相同的表。表中所有列的定義和默認(rèn)值拷貝自 like_table_name。當(dāng)提供了可選項 WITH DATA,數(shù)據(jù)將從指定的表填充,不過,默認(rèn)值為 WITH NO DATA。

    <as_table_subquery> ::= AS '()

    創(chuàng)建表并且用計算的數(shù)據(jù)填充。使用該子句只拷貝 NOT NULL 約束。如果指定了column_names,該指定的 column_names 將覆蓋中的列名。WITH [NO] DATA 指定數(shù)據(jù)拷貝自 或 <like_table_clause>。

    <logging_option> ::= LOGGING| NO LOGGING [RETENTION <retention_period>]

    <retention_period> ::= <unsigned_integer>

    LOGGING | NO LOGGING:LOGGING (默認(rèn)值)指定激活記錄表日志。NO LOGGING 指定停用記錄表日志。一張 NO LOGGING 表意味表定義是持久的且全局可見的,數(shù)據(jù)則為臨時和全局的。

    RETENTION:指定以秒為單位,NO LOGGING 列式表的保留時間。在指定的保留期限已過,如果使用物理內(nèi)存的主機達(dá)到 80%,上述表將被刪除。

    <auto_merge_option> ::= AUTO MERGE | NO AUTO MERGE

    AUTO MERGE | NO AUTO MERGE:AUTO MERGE (默認(rèn)值)指定觸發(fā)自動增量合并。

    <partition_clause> ::= PARTITION BY <hash_partition> [, <range_partition> | , <hash_partition>]| PARTITION BY <range_partition>| PARTITION BY <roundrobin_partition>

    [,<range_partition>]

    <hash_partition> ::= HASH (<partition_expression> [, …]) PARTITIONS {<num_partitions> |GET_NUM_SERVERS()}

    <range_partition> ::= RANGE (<partition_expression>) (<range_spec>, …)

    <roundrobin_partition> ::= ROUNDROBIN PARTITIONS {<num_partitions> | GET_NUM_SERVERS()} [,<range_partition>]

    <range_spec> ::= {<from_to_spec> | <single_spec>} [, …] [, PARTITION OTHERS]

    <from_to_spec> ::= PARTITION <lower_value> <= VALUES < <upper_value>

    <single_spec> ::= PARTITION VALUE <target_value>

    <lower_value> ::= <string_literal> | <numeric_literal>

    <upper_value> ::= <string_literal> | <numeric_literal>

    <target_value> ::= <string_literal> | <numeric_literal>

    <partition_expression> ::= <column_name> | YEAR(<column_name>) | MONTH(<column_name>)

    <num_partitions> ::= <unsigned_integer>

    GET_NUM_SERVERS()函數(shù)返回服務(wù)器數(shù)量。

    PARTITION OTHERS 表示分區(qū)定義中未指定的其余值成為一個分區(qū)。

    確定分區(qū)創(chuàng)建所在的索引服務(wù)器是可能的。如果你指定了 LOCATION,在這些實例中循環(huán)創(chuàng)建分區(qū)。列表中的重復(fù)項將被移除。如果你在分區(qū)定義中精確指定實例數(shù)為分區(qū)數(shù),則每個分區(qū)將分配至列表中各自實例。所有索引列表中的服務(wù)器必須屬于同一個實例。如果指定了 no location,將隨機創(chuàng)建分區(qū)。如果分區(qū)數(shù)與服務(wù)器數(shù)匹配-例如使用

    GET_NUM_SERVERS()-可以確保多個 CREATE TABLE 調(diào)用以同樣的方式分配分區(qū)。對于多級別分區(qū)的情況,其適用于第一級的分區(qū)數(shù)。這個機制是很有用的,如果創(chuàng)建彼此語義相關(guān)的多張表。

    <location_clause> ::= AT [LOCATION] {’:’ | (’:’, …)}

    AT LOCATION:表可以創(chuàng)建在 host:port 指定的位置,位置列表可以在創(chuàng)建分配至多個實例的分區(qū)表時定義。當(dāng)位置列表沒有提供<partition_clause>,表將創(chuàng)建至指定的第一個位置中。如果沒有提供位置信息,表將自動分配到一個節(jié)點中。此選項可用于在分布式環(huán)境中的行存儲和列存儲表

    描述:

    CREATE TABLE 創(chuàng)建一張表。表中未填充數(shù)據(jù),除了當(dāng)<as_table_subquery> 或 <like_table_clause>和WITH DATA 可選項一起使用。

    例子:

    創(chuàng)建了表 A,整數(shù)列 A 和 B。列 A 具有主鍵約束。

    CREATETABLE A (A INTPRIMARYKEY, B INT);

    創(chuàng)建了分區(qū)表 P1,日期列 U。列 U 具有主鍵約束并且作為 RANGE 分區(qū)列使用。

    CREATECOLUMNTABLE P1 (U DATEPRIMARYKEY) PARTITIONBY RANGE (U) (PARTITION’2010-02-03’<= VALUES < ‘2011-01-01’, PARTITIONVALUE = ‘2011-05-01’);

    創(chuàng)建了分區(qū)表 P2,整數(shù)列 I,J 和 K。列 I,J 組成鍵約束,并且作為哈希分區(qū)列使用。列 K 則為子哈希分區(qū)列。

    CREATECOLUMNTABLE P2 (I INT, J INT, K INT, PRIMARYKEY(I, J)) PARTITIONBY HASH (I, J) PARTITIONS 2, HASH (K) PARTITIONS 2;

    創(chuàng)建表 C1,與表 A 的定義相同,記錄也相同。

    CREATECOLUMNTABLE C1 LIKE A WITH DATA;

    創(chuàng)建表 C2,與表 A 的列數(shù)據(jù)類型和 NOT NULL 約束相同。表 C2 沒有任何數(shù)據(jù)。

    CREATETABLE C2 AS (SELECT * FROM A) WITHNO DATA;

    7.1.13 CREATE TRIGGER
    語法:

    CREATE TRIGGER <trigger_name> <trigger_action_time> <trigger_event> ON <subject_table_name> [REFERENCING <transition_list>][<for_each_row>]

    BEGIN

    [<trigger_decl_list>]

    [<proc_handler_list>]

    <trigger_stmt_list>

    END

    語法元素:

    <trigger_name> ::= 你創(chuàng)建的觸發(fā)器名稱。

    <subject_table_name> ::= 你創(chuàng)建的觸發(fā)器所在表的名稱。

    <trigger_action_time> ::= BEFORE | AFTER 指定觸發(fā)動作發(fā)生的 時間。

    BEFORE:操作主題表之前執(zhí)行觸發(fā)。

    AFTER:操作主題表之后執(zhí)行觸發(fā)。

    <trigger_event> ::= INSERT | DELETE | UPDATE 定義激活觸發(fā)器活動的數(shù)據(jù)修改命令

    <transition_list> ::= | <transition_list> ,

    ::= <trigger_transition_old_or_new> <trigger_transition_var_or_table> <trans_var_name>|<trigger_transition_old_or_new> <trigger_transition_var_or_table> AS <trans_var_name>

    當(dāng)聲明了 觸發(fā)器轉(zhuǎn)變變量,觸發(fā)器可以訪問 DML 正在修改的記錄。

    當(dāng)執(zhí)行了行級別觸發(fā)器, <trans_var_name>.<column_name>代表觸發(fā)器正在修改的記錄的相應(yīng)列。

    這里, <column_name>為主題表的列名。參見轉(zhuǎn)換變量的例子。

    <trigger_transition_old_or_new> ::= OLD | NEW

    <trigger_transition_var_or_table> ::= ROW

    OLD

    你可以訪問觸發(fā)器 DML 的舊記錄,取而代之的是更新的舊記錄或刪除的舊記錄。

    UPDATE 觸發(fā)器和 DELETE 觸發(fā)器可以有 OLD ROW 事務(wù)變量。

    NEW

    你可以訪問觸發(fā)器 DML 的新記錄,取而代之的是插入的新記錄或更新的新記錄。

    UPDATE 觸發(fā)器和 DELETE 觸發(fā)器可以有 NEW ROW 事務(wù)變量。

    只支持事務(wù)變量。

    事務(wù)表不被支持。

    如果你將’TABLE’作為<trigger_transition_var_or_table>,你將看到不支持功能錯誤。

    <for_each_row> ::= FOR EACH ROW

    觸發(fā)器將以逐行方式調(diào)用。

    默認(rèn)模式為執(zhí)行行級別觸發(fā)器,沒有 FOR EACH ROW 語法。

    目前,逐語句觸發(fā)不被支持。

    <trigger_decl_list> ::= DECLARE <trigger_decl>| <trigger_decl_list> DECLARE <trigger_decl>

    <trigger_decl> ::= <trigger_var_decl> | <trigger_condition_decl>

    <trigger_var_decl> ::= <var_name> CONSTANT <data_type> [<not_null>] [<trigger_default_assign>] ;| <var_name> <data_type> [NOT NULL] [<trigger_default_assign>] ;

    <data_type> ::= DATE | TIME | SECONDDATE | TIMESTAMP | TINYINT | SMALLINT | INTEGER| BIGINT |SMALLDECIMAL | DECIMAL | REAL | DOUBLE| VARCHAR | NVARCHAR | ALPHANUM | SHORTTEXT|VARBINARY | BLOB | CLOB| NCLOB | TEXT

    <trigger_default_assign> ::= DEFAULT | :=

    <trigger_condition_decl> ::= <condition_name> CONDITION ;| <condition_name> CONDITION FOR <sql_error_code> ;

    <sql_error_code> ::= SQL_ERROR_CODE <int_const>

    trigger_decl_list

    你可以聲明觸發(fā)器變量或者條件。

    聲明的變量可以在標(biāo)量賦值中使用或者在 SQL 語句觸發(fā)中引用。

    聲明的條件名可以在異常處理中引用。

    CONSTANT

    當(dāng)指定了 CONSTANT 關(guān)鍵字,你不可以在觸發(fā)器執(zhí)行時修改變量。

    <proc_handler_list> ::= <proc_handler>| <proc_handler_list> <proc_handler>

    <proc_handler> ::= DECLARE EXIT HANDLER FOR <proc_condition_value_list> <trigger_stmt>

    <proc_condition_value_list> ::= <proc_condition_value>| <proc_condition_value_list> , <proc_condition_value>

    <proc_condition_value> ::= SQLEXCEPTION
    | SQLWARNING
    | <sql_error_code>
    | <condition_name>
    異常處理可以聲明捕捉已存的 SQL 異常,特定的錯誤代碼或者條件變量聲明的條件名稱。
    <trigger_stmt_list> ::= <trigger_stmt>| <trigger_stmt_list> <trigger_stmt>
    <trigger_stmt> ::= <proc_block>
    | <proc_assign>
    | <proc_if>
    | <proc_loop>
    | <proc_while>
    | <proc_for>
    | <proc_foreach>
    | <proc_signal>
    | <proc_resignal>
    | <trigger_sql>
    觸發(fā)器主體的語法是過程體的語法的一部分。
    參見 SAP HANA Database SQLScript guide 中的 create procedure 定義。
    觸發(fā)器主體的語法遵循過程體的語法,即嵌套塊(proc_block),標(biāo)量變量分配(proc_assign), if 塊
    (proc_if),, loop 塊(proc_loop), for 塊(proc_for), for each 塊(proc_foreach), exception
    signal(proc_signal), exception resignal(proc_resignal),和 sql 語句(proc_sql)。
    <proc_block> ::= BEGIN
    [<trigger_decl_list>]
    [<proc_handler_list>]
    <trigger_stmt_list>
    END ;
    你可以以嵌套方式添加另外的’BEGIN … END;'塊。
    <proc_assign> ::= <var_name> := ;
    var_name 為變量名,應(yīng)該事先聲明。
    <proc_if> ::= IF THEN <trigger_stmt_list>
    [<proc_elsif_list>]
    [<proc_else>]
    END IF ;
    <proc_elsif_list> ::= ELSEIF THEN <trigger_stmt_list>

    <proc_else> ::= ELSE <trigger_stmt_list>
    關(guān)于 condition 的說明,參見 SELECT 的。
    你可以使用 IF … THEN … ELSEIF… END IF 控制執(zhí)行流程與條件。
    <proc_loop> ::= LOOP <trigger_stmt_list> END LOOP ;
    <proc_while> ::= WHILE DO <trigger_stmt_list> END WHILE ;
    <proc_for> ::= FOR <column_name> IN [] <DDOT_OP>
    DO <trigger_stmt_list>
    END FOR ;
    <column_name> ::=
    ::= REVERSE
    <DDOT_OP> ::= …
    <proc_foreach> ::= FOR <column_name> AS <column_name> [<open_param_list>] DO
    <trigger_stmt_list>
    END FOR ;
    <open_param_list> ::= ( <expr_list> )
    <expr_list> ::= | <expr_list> ,
    <proc_signal> ::= SIGNAL <signal_value> [<set_signal_info>] ;
    <proc_resignal> ::= RESIGNAL [<signal_value>] [<set_signal_info>] ;
    <signal_value> ::= <signal_name> | <sql_error_code>
    <signal_name> ::=
    <set_signal_info> ::= SET MESSEGE_TEXT = ‘<message_string>’
    <message_string> ::=
    SET MESSEGE_TEXT
    如果你為自己的消息設(shè)置 SET MESSEGE_TEXT,當(dāng)觸發(fā)器執(zhí)行時指定的錯誤被拋出,消息傳遞給用
    戶。
    SIGNAL 語句顯式拋出一個異常。
    用戶定義的范圍( 10000?19999)將被允許發(fā)行錯誤代碼。
    RESIGNAL 語句在異常處理中對活動語句拋出異常。
    如果沒有指定錯誤代碼, RESIGNAL 將拋出已捕捉的異常。

    <trigger_sql> ::= <select_into_stmt>
    | <insert_stmt>
    | <delete_stmt>
    | <update_stmt>
    | <replace_stmt>
    | <upsert_stmt>
    對于 insert_stmt 的詳情,參見 INSERT。
    對于 delete_stmt 的詳情,參見 DELETE。
    對于 update_stmt 的詳情,參見 UPDATE。
    對于 replace_stmt 和 upsert_stmt 的詳情,參見 REPLACE | UPSERT。
    <select_into_stmt> ::= SELECT <select_list> INTO <var_name_list>
    <from_clause >
    [<where_clause>]
    [<group_by_clause>]
    [<having_clause>]
    [{<set_operator> , … }]
    [<order_by_clause>]
    []
    <var_name_list> ::= <var_name> | <var_name_list> , <var_name>
    <var_name> ::=
    關(guān)于 select_list, from_clause, where_clause, group_by_clause, having_clause,set_operator, subquery,
    order_by_clause, limit 的詳情,參見 SELECT。
    var_name 是預(yù)先聲明的標(biāo)量變量名。
    你可以分配選中項至標(biāo)量變量中。
    描述:
    CREATE TRIGGER 語句創(chuàng)建觸發(fā)器。
    觸發(fā)器是一種特殊的存儲過程,在對表發(fā)生事件時自動執(zhí)行。
    CREATE TRIGGER 命令定義一組語句,當(dāng)給定操作(INSERT/UPDATE/DELETE)發(fā)生在給定對象(主題表)
    上執(zhí)行。
    只有對于給定的<subject_table_name>擁有 TRIGGER 權(quán)限的數(shù)據(jù)庫用戶允許創(chuàng)建表的觸發(fā)器。
    當(dāng)前觸發(fā)器限制描述如下:
    l不支持 INSTEAD_OF 觸發(fā)器。
    l訪問觸發(fā)器定義的主題表在觸發(fā)器主體中是不允許的,這代表對于觸發(fā)器所在的表的任何
    insert/update/delete/replace/select

    l只支持行級別觸發(fā)器,不支持語句級別觸發(fā)器。行級別觸發(fā)器表示觸發(fā)活動只有在每次行改
    變時執(zhí)行。語句級別觸發(fā)器代表觸發(fā)活動在每次語句執(zhí)行時運行。語法’FOR EACH ROW’表示
    行式執(zhí)行觸發(fā),為默認(rèn)模式;即時沒有指定’FOR EACH ROW’,仍然為行級別觸發(fā)器。
    l不支持事務(wù)表(OLD/NEW TABLE)。當(dāng)觸發(fā) SQL 語句想要引用正在被觸發(fā)器觸發(fā)事件如
    insert/update/delete 修改的數(shù)據(jù),事務(wù)變量/表將是觸發(fā)器主體中 SQL 語句訪問新數(shù)據(jù)和舊數(shù)
    據(jù)的方式。事務(wù)變量只在行級別觸發(fā)器中使用,而事務(wù)表則在語句級別觸發(fā)器中使用。
    l不支持從節(jié)點到多個主機或表中的分區(qū)表上執(zhí)行觸發(fā)器。
    l表只能為每個 DML 操作有一個觸發(fā)器,可能是插入觸發(fā)器、更新觸發(fā)器和刪除觸發(fā)器,并且
    它們?nèi)齻€可以一起激活。
    因此,一張表總共最多有三個觸發(fā)器。
    l不支持的觸發(fā)器動作(而存儲過程支持):
    resultset assignment(select resultset assignment to tabletype),
    exit/continue command(execution flow control),
    cursor open/fetch/close(get each record data of search result by cursor and access record in loop),
    procedure call(call another proecedure),
    dynomic sql execution(build SQL statements dynamically at runtime of SQLScript),
    return(end SQL statement execution)
    系統(tǒng)和監(jiān)控視圖:
    TRIGGER 為觸發(fā)器的系統(tǒng)視圖:
    系統(tǒng)視圖 TRIGGER 顯示:
    SCHEMA_NAME, TRIGGER_NAME, TRIGGER_OID, OWNER_NAME,
    OWNER_OID,SUBJECT_TABLE_SCHEMA,SUBJECT_TABLE_NAME, TRIGGER_ACTION_TIME,
    TRIGGER_EVENT, TRIGGERED_ACTION_LEVEL,DEFINITION
    例子:
    你先需要觸發(fā)器定義的表:
    CREATETABLE TARGET ( A INT);
    你也需要表觸發(fā)訪問和修改:
    CREATETABLE SAMPLE ( A INT);
    以下為創(chuàng)建觸發(fā)器的例子:

    CREATE TRIGGER TEST_TRIGGER AFTERINSERTON TARGET FOR EACH ROW

    BEGIN

    DECLARE SAMPLE_COUNT INT;SELECTCOUNT(*) INTO SAMPLE_COUNT FROM SAMPLE;IF :SAMPLE_COUNT = 0 THENINSERTINTO SAMPLE VALUES(5);ELSEIF :SAMPLE_COUNT = 1 THENINSERTINTO SAMPLE VALUES(6);ENDIF;

    END;

    觸發(fā)器 TEST_TRIGGER 將在任意記錄插入至 TARGET 表后執(zhí)行。由于在第一次插入中,表 SAMPLE 記錄數(shù)為 0,觸發(fā)器 TEST_TRIGGER 將插入 5 至表中。
    在第二次插入 TARGET 表時,觸發(fā)器插入 6,因為其計數(shù)為 1。
    INSERTINTO TARGET VALUES (1);

    SELECT * FROM SAMPLE;–5

    INSERTINTO TARGET VALUES (2);

    SELECT * FROM SAMPLE;–5 6

    7.1.14 CREATE VIEW
    語法:

    CREATE VIEW [<schema_name>.]<view_name> [(<column_name>, … )] AS

    描述:

    CREATE VIEW 可以有效地根據(jù) SQL 結(jié)果創(chuàng)建虛擬表,這不是真正意義上的表,因為它本身不包含數(shù)據(jù)。

    當(dāng)列名一起作為視圖的名稱,查詢結(jié)果將以列名顯示。如果列名被省略,查詢結(jié)果自動給出一個適當(dāng)?shù)牧忻A忻臄?shù)目必須與從返回的列數(shù)目相同。

    支持視圖的更新操作,如果滿足以下條件:

    視圖中的每一列必須映射到單個表中的一列。

    如果基表中的一列有 NOT NULL 約束,且沒有默認(rèn)值,該列必須包含在可插入視圖的列中。更新操作沒有該條件。

    例如在 SELECT 列表,必須不包含聚合或分析的功能,以下是不允許的:

    . 在 SELECT 列表中的 TOP, SET, DISTINCT 操作

    . GROUP BY, ORDER BY 子句

    在 SELECT 列表中必須不能含有子查詢。

    必須不能包含序列值(CURRVAL, NEXTVAL)。

    必須不能包含作為基視圖的列視圖。

    如果基視圖或表是可更新的,符合上述條件的基礎(chǔ)上,基視圖或表的視圖是可更新的。

    例子:

    選擇表 a 中的所有數(shù)據(jù)創(chuàng)建視圖 v:

    CREATEVIEW v ASSELECT * FROM a;

    7.1.15 DROP AUDIT POLICY
    語法:

    DROP AUDIT POLICY <policy_name>

    描述:

    DROP AUDIT POLICY 語句刪除審計策略。 <policy_name>必須指定已存在的審計策略。

    只有擁有系統(tǒng)權(quán)限 AUDIT ADMIN 的數(shù)據(jù)庫用戶允許刪除審計策略。每個擁有該權(quán)限的數(shù)據(jù)庫用戶可以刪除任意的審計策略,無論是否由該用戶創(chuàng)建。

    即使審計策略被刪除了,可能發(fā)生的是,定義在已刪除的審計策略中的活動將被進(jìn)一步審計;如果也啟用了其他審計策略和定義了審計活動。

    暫時關(guān)閉審計策略時,可以禁用而不用刪除。

    系統(tǒng)和監(jiān)控視圖:

    AUDIT_POLICY:顯示所有審計策略和狀態(tài)。

    M_INIFILE_CONTENTS:顯示數(shù)據(jù)庫系統(tǒng)配置參數(shù)。

    只有擁有系統(tǒng)權(quán)限 CATALOG READ, DATA ADMIN 或 INIFILE ADMIN 的用戶可以查看M_INIFILE_CONTENTS 視圖中的內(nèi)容,對于其他用戶則為空。

    例子:

    假設(shè)使用如下語句前,審計策略已創(chuàng)建:

    CREATEAUDIT POLICY priv_audit AUDITING SUCCESSFUL GRANT PRIVILEGE, REVOKE PRIVILEGE, GRANT ROLE, REVOKE ROLE LEVEL CRITICAL;

    現(xiàn)在,該審計策略必須刪除:

    DROPAUDIT POLICY priv_audit;

    7.1.16 DROP FULLTEXT INDEX
    語法:

    DROP FULLTEXT INDEX <fulltext_index_name>

    描述:

    DROP FULLTEXT INDEX 語句移除全文索引。

    例子:

    DROP FULLTEXT INDEX idx;

    7.1.17 DROP INDEX
    語法:

    DROP INDEX <index_name>

    描述:

    DROP INDEX 語句移除索引。

    例子:

    DROPINDEX idx;

    7.1.18 DROP SCHEMA
    語法:

    DROP SCHEMA <schema_name> [<drop_option>]

    語法元素:

    <drop_option> ::= CASCADE | RESTRICT

    Default = RESTRICT

    有限制的刪除操作將刪除對象當(dāng)其沒有依賴對象時。如果存在依賴對象,將拋出錯誤。

    CASCADE級聯(lián)刪除:將刪除對象以及其依賴對象。

    描述:

    DROP SCHEMA 語句移除schema。

    例子:

    創(chuàng)建集合 my_schema,表 my_schema.t,然后 my_schema 將使用 CASCADE 選項刪除。

    CREATESCHEMA my_schema;

    CREATETABLE my_schema.t (a INT);

    DROPSCHEMA my_schema CASCADE;

    7.1.19 DROP SEQUENCE
    語法:

    DROP SEQUENCE <sequence_name> [<drop_option>]

    語法元素:

    <drop_option> ::= CASCADE | RESTRICT

    Default = RESTRICT

    級聯(lián)刪除將刪除對象以及其依賴對象。當(dāng)未指定 CASCADE 可選項,將執(zhí)行非級聯(lián)刪除對象,不會刪除依賴對象,而是使依賴對象 (VIEW, PROCEDURE) 無效。

    無效的對象可以重新驗證當(dāng)一個對象有同樣的集合,并且已創(chuàng)建了對象名。對象 ID,集合名以及對象名為重新驗證依賴對象而保留。

    有限制的刪除操作將刪除對象當(dāng)其沒有依賴對象時。如果存在依賴對象,將拋出錯誤。

    描述:

    DROP SEQUENCE 語句移除序列。

    例子:

    DROPSEQUENCE s;

    7.1.20 DROP SYNONYM
    語法:

    DROP [PUBLIC] SYNONYM <synonym_name> [<drop_option>]

    語法元素:

    <drop_option> ::= CASCADE | RESTRICT

    Default = RESTRICT

    級聯(lián)刪除將刪除對象以及其依賴對象。當(dāng)未指定 CASCADE 可選項,將執(zhí)行非級聯(lián)刪除操作,不會刪除依賴對象,而是使依賴對象 (VIEW, PROCEDURE) 無效。

    無效的對象可以重新驗證當(dāng)一個對象有同樣的集合,并且已創(chuàng)建了對象名。對象 ID,集合名以及對象名為重新驗證依賴對象而保留。

    有限制的刪除操作將刪除對象當(dāng)其沒有依賴對象時。如果存在依賴對象,將拋出錯誤。

    描述:

    DROP SYNONYM 刪除同義詞。可選項 PUBLIC 允許刪除公用同義詞。

    例子:

    表 a 已創(chuàng)建,然后為表 a 創(chuàng)建同義詞 a_synonym 和公用同義詞 pa_synonym:

    CREATETABLE a (c INT);

    CREATESYNONYM a_synonym FOR a;

    CREATEPUBLICSYNONYM pa_synonym FOR a;

    刪除同義詞 a_synonym 和公用同義詞 pa_synonym

    DROPSYNONYM a_synonym;

    DROPPUBLICSYNONYM pa_synonym;

    7.1.21 DROP TABLE
    語法:

    DROP TABLE [<schema_name>.]<table_name> [<drop_option>]

    語法元素:

    <drop_option> ::= CASCADE | RESTRICT

    Default = RESTRICT

    級聯(lián)刪除將刪除對象以及其依賴對象。當(dāng)未指定 CASCADE 可選項,將執(zhí)行非級聯(lián)刪除操作,不會刪除依賴對象,而是使依賴對象 (VIEW, PROCEDURE) 無效。

    無效的對象可以重新驗證當(dāng)一個對象有同樣的集合,并且已創(chuàng)建了對象名。對象 ID,集合名以及對象名為重新驗證依賴對象而保留。

    有限制的刪除操作將刪除對象當(dāng)其沒有依賴對象時。如果存在依賴對象,將拋出錯誤。

    描述:

    DROP TABLE 語句刪除表。

    例子:

    創(chuàng)建表 A,然后刪除。

    CREATETABLE A(C INT);

    DROPTABLE A;

    7.1.22 DROP TRIGGER
    DROP TRIGGER <trigger_name>

    描述:

    DROP TRIGGER 語句刪除一個觸發(fā)器。

    只有在觸發(fā)器所作用表上有 TRIGGER 權(quán)限的數(shù)據(jù)庫用戶才允許刪除該表的觸發(fā)器。

    例子:

    對于這個例子,你需要先創(chuàng)建一個名為 test_trigger 的觸發(fā)器,如下:

    CREATETABLE TARGET ( A INT);

    CREATETABLE SAMPLE ( A INT);

    CREATE TRIGGER TEST_TRIGGER AFTERUPDATEON TARGET

    BEGIN

    INSERTINTO SAMPLE VALUES(3);

    END;

    現(xiàn)在你可以刪除觸發(fā)器:

    DROP TRIGGER TEST_TRIGGER;

    7.1.23 DROP VIEW
    語法:

    DROP VIEW [<schema_name>.]<view_name> [<drop_option>]

    語法元素:

    <drop_option> ::= CASCADE | RESTRICT

    Default = RESTRICT

    級聯(lián)刪除將刪除對象以及其依賴對象。當(dāng)未指定 CASCADE 可選項,將執(zhí)行非級聯(lián)刪除操作,不會刪除依賴對象,而是使依賴對象 (VIEW, PROCEDURE) 無效。

    無效的對象可以重新驗證當(dāng)一個對象有同樣的集合,并且已創(chuàng)建了對象名。對象 ID,集合名以及對象名為重新驗證依賴對象而保留。

    有限制的刪除操作將刪除對象當(dāng)其沒有依賴對象時。如果存在依賴對象,將拋出錯誤。

    描述:

    DROP VIEW 語句刪除視圖。

    例子:

    表 t 已創(chuàng)建,然后選擇表 a 中的所有數(shù)據(jù)創(chuàng)建視圖 v:

    CREATETABLE t (a INT);

    CREATEVIEW v ASSELECT * FROM t;

    刪除視圖 v:

    DROPVIEW v;

    7.1.24 RENAME COLUMN
    語法:

    RENAME COLUMN <table_name>.<old_column_name> TO <new_column_name>

    描述:

    RENAME COLUMN 語句修改列名:

    例子:

    創(chuàng)建表 B:

    CREATETABLE B (A INTPRIMARYKEY, B INT);

    顯示表 B 中列名的列表:

    SELECT COLUMN_NAME, POSITION FROM TABLE_COLUMNS WHERE SCHEMA_NAME =CURRENT_SCHEMA AND TABLE_NAME = 'B’ORDERBYPOSITION;

    列 A 重名為 C:

    RENAMECOLUMN B.A TO C;

    7.1.25 RENAME INDEX
    語法:

    RENAME INDEX <old_index_name> TO <new_index_name>

    描述:

    RENAME INDEX 語句重命名索引名。

    例子:

    表 B 已創(chuàng)建,然后索引 idx 建立在表 B 的列 B:

    CREATETABLE B (A INTPRIMARYKEY, B INT);

    CREATEINDEX idx on B(B);

    顯示表 B 的索引名列表:

    SELECT INDEX_NAME FROM INDEXES WHERE SCHEMA_NAME = CURRENT_SCHEMA AND TABLE_NAME=‘B’;

    索引 idx 重名為 new_idx:

    RENAMEINDEX idx TO new_idx;

    7.1.26 RENAME TABLE
    語法:

    RENAME TABLE <old_table_name> TO <new_table_name>

    描述:

    RENAME TABLE 語句在同一個Schema下,將表名修改為 new_table_name。

    例子:

    在當(dāng)前集合創(chuàng)建表 A:

    CREATETABLE A (A INTPRIMARYKEY, B INT);

    顯示當(dāng)前集合下表名的列表:

    SELECT TABLE_NAME FROM TABLES WHERE SCHEMA_NAME = CURRENT_SCHEMA;

    表 A 重命名為 B:

    RENAMETABLE A TO B;

    SCHEMA mySchema 已創(chuàng)建,然后創(chuàng)建表 mySchema.A:

    CREATESCHEMA mySchema;

    CREATETABLE mySchema.A (A INTPRIMARYKEY, B INT);

    顯示模式 mySchema 下表名的列表:

    SELECT TABLE_NAME FROM TABLES WHERE SCHEMA_NAME = ‘MYSCHEMA’;

    表 mySchema.A 重命名為 B:

    RENAMETABLE mySchema.A TO B;注:修改后B還是在mySchema里

    7.1.27 ALTER TABLE ALTER TYPE
    語法:

    <table_conversion_clause> ::= [ALTER TYPE] { ROW [THREADS <number_of_threads>] | COLUMN [THREADS <number_of_threads> [BATCH <batch_size>]] }

    語法元素:

    <number_of_threads> ::= <numeric_literal>

    指定進(jìn)行表轉(zhuǎn)換的并行線程數(shù)。線程數(shù)目的最佳值應(yīng)設(shè)置為可用的 CPU 內(nèi)核的數(shù)量。

    <batch_size> ::= <numeric_literal>

    指定批插入的行數(shù),默認(rèn)值為最佳值 2,000,000。插入表操作在每個<batch_size>記錄插入后立即提交,可以減少內(nèi)存消耗。 BATCH 可選項只可以在表 從行轉(zhuǎn)換為列時使用。然而,大于 2,000,000的批大小可能導(dǎo)致高內(nèi)存消耗,因此不建議修改該值。

    描述:

    通過復(fù)制現(xiàn)有的表中的列和數(shù)據(jù),可以從現(xiàn)有的表創(chuàng)建一個不同存儲類型的新表。該命令用來把表從行轉(zhuǎn)換為列或從列轉(zhuǎn)換為行。如果源表是行式存儲,則新建的表為列式存儲。

    配置參數(shù):

    用于表轉(zhuǎn)換的默認(rèn)線程數(shù)在 indexserver.ini 的[sql]部分定義, table_conversion_parallelism =<numeric_literal> (初始值為 8)。

    例子:

    對于這個例子,你需要先創(chuàng)建欲進(jìn)行轉(zhuǎn)換的表:

    CREATECOLUMNTABLE col_to_row (col1 INT, col2 INT)

    CREATEROWTABLE row_to_col (col1 INT, col2 INT)

    表 col_to_row 將以列式存儲方式創(chuàng)建,表 row_to_col 則為行式存儲。

    現(xiàn)在你可以將表 col_to_row 的存儲類型從列轉(zhuǎn)為行:

    ALTERTABLE col_to_row ALTERTYPEROW

    你也可以將表 row_to_col 的存儲類型從行轉(zhuǎn)為列:

    ALTERTABLE row_to_col ALTERTYPECOLUMN

    為了使用批量轉(zhuǎn)換模式,你需要在語句結(jié)尾處添加批選項:

    ALTERTABLE row_to_col ALTERTYPECOLUMN BATCH 10000

    7.1.28 TRUNCATE TABLE
    語法:

    TRUNCATE TABLE <table_name>

    描述:

    刪除表中所有記錄。當(dāng)從表中刪除所有數(shù)據(jù)時, TRUNCATE 比 DELETE FROM 快,但是 TRUNCATE無法回滾。要回滾刪除的記錄,應(yīng)使用"DELETE FROM <table_name>"。

    HISTORY 表可以通過執(zhí)行該語句像正常表一樣刪除。歷史表的所有部分(main, delta, history main and history delta)將被刪除并且內(nèi)容會丟失。

    7.2數(shù)據(jù)操縱語句
    7.2.1 DELETE
    語法:

    DELETE [HISTORY] FROM [<schema_name>.]<table_name> [WHERE ]

    ::= OR | AND | NOT | ( )|

    關(guān)于謂詞的詳情,請參閱 Predicates。

    描述:

    DELETE 語句當(dāng)滿足條件時,從表中刪除所有記錄。如果省略了 WHERE 子句,將刪除表中所有記錄。

    DELETE HISTORY

    DELETE HISTORY 將標(biāo)記選中的歷史表中歷史記錄進(jìn)行刪除。這表示執(zhí)行完該語句后,引用已刪除記錄的時間旅行查詢語句可能仍然可以查看這些數(shù)據(jù)。 為了在物理上刪除這些記錄,必須執(zhí)行下面的語句:

    ALTER SYSTEM RECLAIM VERSION SPACE; MERGE HISTORY DELTA of <table_name>;

    請注意:在某些情況中,即使執(zhí)行了上述兩條語句,仍無法從物理上刪除。

    欲檢查記錄是否已從物理上刪除,以下語句會有幫助:

    SELECT * FROM <table_name> WHERE WITH PARAMETERS (‘REQUEST_FLAGS’=(‘ALLCOMMITTED’,‘HISTORYONLY’));

    注意: “WITH PARAMETERS (‘REQUEST_FLAGS’= (‘ALLCOMMITTED’,‘HISTORYONLY’))”子句可能只適用于驗證 DELETE HISTORY 語句的執(zhí)行結(jié)果。

    例子:

    CREATETABLE T (KEYINTPRIMARYKEY, VAL INT);

    INSERTINTO T VALUES (1, 1);

    INSERTINTO T VALUES (2, 2);

    INSERTINTO T VALUES (3, 3);

    在下面的例子中,將刪除一條記錄:

    DELETEFROM T WHEREKEY = 1;

    7.2.2 EXPLAIN PLAN
    語法:

    EXPLAIN PLAN [SET STATEMENT_NAME = <statement_name>] FOR <sql_subquery>

    語法元素:

    <statement_name> ::= string literal used to identify the name of a specific executi on plan in the output table for a given SQL statement.

    如果未指定 SET STATEMENT_NAME,則將設(shè)為 NULL。

    描述:

    EXPLAIN PLAN 語句用來評估 SAP HANA 數(shù)據(jù)庫遵循的執(zhí)行 SQL 語句的執(zhí)行計劃。評估的結(jié)果存在視圖 EXPLAIN_PLAN_TABLE,以便稍后的用戶檢查。

    SQL 語句必須是數(shù)據(jù)操縱語句,因此Schema定義語句不能在 EXPLAIN STATEMENT 中使用。

    你可以從 EXPLAIN_PLAN_TABLE 視圖中得到 SQL 計劃,該視圖為所有用戶共享。這里是從視圖讀取 SQL 計劃的例子:

    SELECT * FROM EXPLAIN_PLAN_TABLE;

    EXPLAIN_PLAN_TABLE 視圖中的列:表 1:列名和描述

    EXPLAIN_PLAN_TABLE 視圖中的 OPERATOR_NAME 列。 表 2: OPERATOR_NAME 列顯示的列式引擎操作符列表:

    COLUMN SEARCH 為列式引擎操作符起始位置標(biāo)記, ROW SEARCH 為行式引擎操作符起始位置標(biāo)記。在以下的例子中, COLUMN SEARCH (ID 10)生成的中間結(jié)果被 ROW SEARCH (ID 7)使用, ROWSEARCH (ID 7) 被另一個 COLUMN SEARCH (ID 1)使用。位于 COLUMN SEARCH (ID 10) 最底層的操作符解釋了 COLUMN SEARCH (ID 10) 是如何執(zhí)行的。 ROW SEARCH (ID 7) 和 COLUMN SEARCH (ID 10) 之間的操作符說明了 ROW SEARCH (ID 7) 如何處理由 COLUMN SEARCH (ID 10) 生成的中間結(jié)果。位于COLUMN SEARCH (ID 1) 和 ROW SEARCH (ID 7)頂層的操作符解釋了頂層 COLUMN SEARCH (ID 1) 是如何處理由 ROW SEARCH (ID 7)生成的中間結(jié)果。

    SQL 計劃解釋例子。

    該語句來自語 TPC-H 基準(zhǔn)。例子中的所有表都是行式存儲。

    setschema hana_tpch;

    DELETEFROM explain_plan_table WHERE statement_name = ‘TPC-H Q10’;

    EXPLAINPLANSET STATEMENT_NAME = 'TPC-H Q10’FOR

    SELECT TOP 20 c_custkey,c_name,SUM(l_extendedprice * (1 - l_discount)) AS revenue,c_acctbal,n_name,c_address,c_phone,c_commentFROMcustomer,orders ,lineitem,nationWHEREc_custkey = o_custkeyAND l_orderkey = o_orderkeyAND o_orderdate >= '1993-10-01'AND o_orderdate < ADD_MONTHS('1993-10-01',3)AND l_returnflag = 'R'AND c_nationkey = n_nationkeyGROUPBYc_custkey,c_name,c_acctbal ,c_phone,n_name,c_address ,c_commentORDERBY revenue DESC;

    SELECT operator_name, operator_details , table_name FROM explain_plan_table WHERE statement_name = ‘TPC-H Q10’;

    以下是對這個查詢語句的計劃解釋:

    7.2.3 INSERT
    語法:

    INSERT INTO [ <schema_name>. ]<table_name> [ <column_list_clause> ] { <value_list_clause> | }

    語法元素:

    <column_list_clause> ::= ( <column_name>, … )

    <value_list_clause> ::= VALUES ( , … )

    描述:

    INSERT 語句添加一條到表中。返回記錄的子查詢可以用來插入表中。如果子查詢沒有返回任何結(jié)果,數(shù)據(jù)庫將不會插入任何記錄。可以使用 INSERT 語句指定列的列表。不在列表中的列將顯示默認(rèn)值。如果省略了列的列表,數(shù)據(jù)庫插入所有記錄到表中。

    例子:

    CREATETABLE T (KEYINTPRIMARYKEY, VAL1 INT, VAL2 NVARCHAR(20));

    在以下的例子中,你可以插入值:

    INSERTINTO T VALUES (1, 1, ‘The first’);

    你可以將值插入到指定的列:

    INSERTINTO T (KEY) VALUES (2);

    你也可以使用子查詢:

    INSERTINTO T SELECT 3, 3, 'The third’FROM DUMMY;

    7.2.4 LOAD
    語法:

    LOAD <table_name> {DELTA | ALL | (<column_name>, …)}

    描述:

    LOAD 語句明確地加載列式(注:Load只支持列式存儲,對于行式存儲不能使用)存儲表的數(shù)據(jù)至內(nèi)存中,而非第一次訪問時加載。

    DELTA

    使用 DELTA,列式表的一部分將加載至內(nèi)存。由于列式存儲對于讀操作做了優(yōu)化和壓縮,增量用來優(yōu)化插入或更新。 所有的插入被傳遞給一個增量。

    ALL

    主要的和增量的列存儲表中所有數(shù)據(jù)加載到內(nèi)存中。

    例子:

    以下的例子加載整張表 a_table 至內(nèi)存中。

    LOAD a_table all;

    以下的例子加載列 a_column 和表 a_table 列 another_column 至內(nèi)存中。

    LOAD a_table (a_column,another_column);

    表加載狀態(tài)可以查詢:

    select loaded from m_cs_tables where table_name = ‘<table_name>’

    7.2.5 MERGE DELTA
    語法:

    MERGE [HISTORY] DELTA OF [<schema_name>.]<table_name> [PART n] [WITH PARAMETERS (<parameter_key_value>, …)]

    語法元素:

    WITH PARAMETERS (<parameter_list>):

    <parameter_list> ::= ,<parameter_list>

    ::= <parameter_name> = <parameter_setting>

    <parameter_name> ::= ‘SMART_MERGE’ | ‘MEMORY_MERGE’

    <parameter_setting> ::= ‘ON’ | ‘OFF’

    當(dāng)前參數(shù): ‘SMART_MERGE’ = ‘ON’ | ‘OFF’。當(dāng) SMART_MERGE 為 ON,數(shù)據(jù)庫執(zhí)行智能合并,這代表數(shù)據(jù)庫基于 Indexserver 配置中定義的合并條件來決定是否合并。‘MEMORY_MERGE’ = ‘ON’ | ‘OFF’ 數(shù)據(jù)庫只合并內(nèi)存中表的增量部分,不會被持久化。

    描述:

    使用 DELTA,列式表的一部分將加載至內(nèi)存。由于列式存儲對于讀操作做了優(yōu)化和壓縮,增量用來優(yōu)化插入或更新。 所有的插入被傳遞至一個增量部分。

    HISTORY 可以指定合并歷史表增量部分到臨時表的主要歷史部分。

    PART-可以指定合并歷史表增量部分到臨時表的主要歷史部分,該表已分區(qū)。

    例子:

    MERGEDELTAOF A;

    Merges the column store table delta part to its main part.

    MERGEDELTAOF A WITH PARAMETERS(‘SMART_MERGE’ = ‘ON’);

    Smart merges the column store table delta part to its main part.

    MERGEDELTAOF A WITH PARAMETERS(‘SMART_MERGE’ = ‘ON’, ‘MEMORY_MERGE’ = ‘ON’);

    Smart merges the column store table delta part to its main part non-persistent, in memory only.

    MERGEDELTAOF A PART 1;

    Merge the delta of partition no. 1 of table with name “A” to main part of partion no. 1.

    MERGEHISTORYDELTAOF A;

    Merge the history delta part of table with name “A” into its history main part.

    MERGEHISTORYDELTAOF A PART 1;

    Merges the column store table delta part of the history of table with name “A” to its history main part.

    7.2.6 REPLACE | UPSERT
    語法:

    UPSERT [ <schema_name>. ]<table_name> [ <column_list_clause> ] { <value_list_clause> [ WHERE | WITH PRIMARY KEY ] | }

    REPLACE [ <schema_name>. ]<table_name> [ <column_list_clause> ] { <value_list_clause> [ WHERE | WITH PRIMARY KEY ] | }

    語法元素:

    <column_list_clause> ::= ( <column_name>, … )

    <value_list_clause> ::= VALUES ( , … )

    ::= OR | AND | NOT | ( )|

    有關(guān)謂詞的詳情,請參閱 Predicates。

    描述:

    沒有子查詢的 UPSERT 或者 REPLACE 語句與 UPDATE 相似。唯一的區(qū)別是當(dāng) WHERE 子句為假(或沒有Where子句)時,該語句像 INSERT 一樣添加一條新的記錄到表中。

    對于表有 PRIMARY KEY 的情況,主鍵列必須包含在列的列表中。沒有默認(rèn)設(shè)定,由 NOT NULL 定義的列也必須包含在列的列表中。

    有子查詢的 UPSERT 或者 REPLACE 語句與 INSERT 一樣,除了如果表中舊記錄與主鍵的新記錄值相同,則舊記錄將被子查詢返回的記錄所修改。除非表有一個主鍵,否則就變得等同于 INSERT(即如果表沒有設(shè)定主鍵,則為INSERT?),因為沒有使用索引來判斷新記錄是否與舊記錄重復(fù)。

    有’WITH PRIMARY KEY’的 UPSERT 或 REPLACE 語句與有子查詢的語句相同。其在 PRIMARY KEY 基礎(chǔ)上工作。

    例子:

    CREATETABLE T (KEYINTPRIMARYKEY, VAL INT);

    你可以插入一條新值:

    UPSERT T VALUES (1, 1);–沒有Where與子查詢,直接插入

    如果 WHERE 子句中的條件為假,將插入一條新值:

    UPSERT T VALUES (2, 2) WHEREKEY = 2; --沒有就插入

    你可以更新列"VAL"的第一條記錄

    UPSERT T VALUES (1, 9) WHEREKEY = 1;–有就更新

    或者你可以使用"WITH PRIMARY KEY" 關(guān)鍵字

    UPSERT T VALUES (1, 8) WITHPRIMARYKEY;–根據(jù)主鍵進(jìn)行更新,如果不存在,則插入

    你可以使用子查詢插入值:

    UPSERT T SELECTKEY + 2, VAL FROM T;–將子查詢的結(jié)果插入,如果存在,則更新

    UPSERT T VALUES (5, 1) WITHPRIMARYKEY;–根據(jù)主鍵查詢時不存在,則插入

    UPSERT T SELECT 5,3 from dummy;–存在,則更新

    7.2.7 SELECT
    語法:

    <select_statement> ::= [ <for_update> | <time_travel> ]| ( ) [ <for_update> | <time_travel> ]

    ::= <select_clause> <from_clause> [<where_clause>] [<group_by_clause>] [<having_clause>] [{<set_operator> , … }] [<order_by_clause>] []

    語法元素:

    SELECT 子句:

    SELECT 子句指定要返回給用戶或外部的 select 子句一個輸出,如果存在的話。

    <select_clause> ::= SELECT [TOP ] [ ALL | DISTINCT ] <select_list>

    <select_list> ::= <select_item>[, …]

    <select_item> ::= [<table_name>.] *| [ AS <column_alias> ]

    TOP n:TOP n 用來返回 SQL 語句的前 n 條記錄。

    DISTINCT 和 ALL:可以使用 DISTINCT 返回重復(fù)的記錄,每一組選擇只有一個副本。使用 ALL 返回選擇的所有記錄,包括所有重復(fù)記錄的拷貝。默認(rèn)值為 ALL。

    Select_list:select_list 允許用戶定義他們想要從表中選擇的列。

    *:可以從 FROM 子句中列出的表或視圖中選擇所有列。如果集合名和表名或者表名帶有星號(),其用來限制結(jié)果集至指定的表。

    column_alias:column_alias 可以用于簡單地表示表達(dá)式。

    FROM:FROM 子句中指定輸入值,如表、視圖、以及將在 SELECT 語句中使用的子查詢。

    <from_clause> ::= FROM {

    , … }

    ::= [ [AS] ] | [ [AS] ] |

    <joined_table> ::=

    [<join_type>] JOIN
    ON |
    CROSS JOIN
    | <joined_table>

    <join_type> ::= INNER | { LEFT | RIGHT | FULL } [OUTER]

    table alias:表別名可以用來簡單地表示表或者子查詢。

    join_type 定義了將執(zhí)行的聯(lián)接類型, LEFT 表示左外聯(lián)接, RIGHT 表示右外聯(lián)接, FULL 表示全外聯(lián)接。執(zhí)行聯(lián)接操作時, OUT 可能或者可能不使用。

    ON :ON 子句定義聯(lián)接謂詞。

    CROSS JOIN:CROSS 表示執(zhí)行交叉聯(lián)接,交叉聯(lián)接生成兩表的交叉積結(jié)果。

    WHERE 子句

    WHERE 子句用來指定 FROM 子句輸入的謂詞, 使用戶可以檢索所需的記錄。

    <where_clause> ::= WHERE

    ::= OR | AND | NOT | ( ) |

    ::= <comparison_predicate> | <range_preciate> | <in_predicate> | <exist_predicate> | <like_predicate> | <null_predicate>

    <comparison_predicate> ::= { = | != | <> | > | < | >= | <= } [ ANY | SOME | ALL ] ({<expression_list> | })

    <range_predicate> ::= [NOT] BETWEEN AND

    <in_predicate> ::= [NOT] IN ( { <expression_list> | } )

    <exist_predicate> ::= [NOT] EXISTS ( )

    <like_predicate> ::= [NOT] LIKE [ESCAPE ]

    <null_predicate> ::= IS [NOT] NULL

    <expression_list> ::= {, … }

    GROUP BY 子句

    <group_by_clause> ::=GROUP BY { { , … } | <grouping_set> }

    <grouping_set> ::= { GROUPING SETS | ROLLUP | CUBE }[BEST ] [LIMIT [OFFSET ] ] [WITH SUBTOTAL] [WITH BALANCE] [WITH TOTAL]

    [TEXT_FILTER [FILL UP [SORT MATCHES TO TOP]]] [STRUCTURED RESULT [WITH OVERVIEW] [PREFIX <string_literal>] | MULTIPLE RESULTSETS] ( <grouping_expression_list> )

    <grouping_expression_list> ::= { <grouping_expression>, … }

    <grouping_expression> ::=| ( , … ) | ( ( , … ) <order_by_clause> )

    GROUP BY 用來對基于指定列值選定的行進(jìn)行分組。

    GROUPING SETS

    在一條語句中, 生成多個特定數(shù)據(jù)分組結(jié)果。如果沒有設(shè)置例如 best 和 limit 的可選項,結(jié)果將和 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

    在一條語句中,生成多級聚合結(jié)果。例如, "rollup (col1, col2,col3)"與有額外 聚合,但沒有分組的"grouping sets ( (col1, col2, col3), (col1, col2), (col1) )"結(jié)果相同。因此,結(jié)果集所包含的分組的數(shù)目是 ROLLUP 列表中的列加上一個最后聚合的數(shù)目,如果沒有額外的選項。

    CUBE

    在一條語句中,生成多級聚合的結(jié)果。例如, “cube (col1, col2,col3)” 與有額外聚合,但沒有分組的"grouping sets ( (col1, col2, col3), (col1, col2), (col1, col3), (col2, col3), (col1), (col2),(col3) )"結(jié)果相同。因此,結(jié)果集所包含分組的數(shù)目與所有可能排列在 CUBE 列表的列加上一個最后聚合的數(shù)目是相同的,如果沒有附加的選項。

    BEST n

    返回每個以行聚合數(shù)降序排列的分組集中前 n 個分組集(返回的是某個分組里的所有記錄,而不是某幾條)。 n 可以是任意零,正數(shù)或負(fù)數(shù)。當(dāng) n 為零時,作用和沒有 BEST 選項一樣。當(dāng) n 為負(fù)數(shù)表示以升序排序。

    LIMIT n1 [OFFSET n2]

    返回每個分組集中(取每個組中的部分行)第一個 N1 分組記錄跳過 N2 個后的結(jié)果。

    WITH SUBTOTAL

    返回每個分組集中由 OFFSET 或者 LIMIT 控制的返回結(jié)果的分類匯總。除非設(shè)置了 OFFSET 和LIMIT,返回值將和 WITH TOTAL 相同。

    WITH BALANCE

    返回每個分組集中 OFFSET 或者 LIMIT 沒有返回的其余結(jié)果值。

    WITH TOTAL

    返回每個分組集中額外的合計總值行。 OFFSET 和 LIMIT 選項不能修改該值。

    TEXT_FILTER

    執(zhí)行文本過濾或者用高亮分組列, 為單引號字符串,語法如下:

    ::= ‘[]{, …}’

    ::= + | - | NOT

    ::= |

    ::= !! Unicode letters or digits

    ::= !! double-quoted string that does not contain double quotations inside

    ::= [<prefix_subsequent>]

    <prefix_subsequent> ::= + | - | NOT | AND | AND NOT | OR

    定義的過濾是由與邏輯操作符 AND, OR 和 NOT 連接的標(biāo)記/詞組或者短語組成。 一個標(biāo)記相匹配的字符串,其中包含對應(yīng)不區(qū)分大小寫的單詞, ‘a(chǎn)b’ 匹配 ‘a(chǎn)b cd’ 和 ‘cd Ab’ ,但不匹配’abcd’。一個標(biāo)記可以包含通配字符’,匹配任何字符串, ’匹配任意字母。但是在詞組內(nèi), ’和’不是通配符。邏輯運算符 AND, OR 和 NOT 可以與標(biāo)記,詞組一起使用。由于 OR 是默認(rèn)操作符, ‘a(chǎn)b cd’ 和’ab OR cd’意義一樣。注意,邏輯運算符應(yīng)該大寫。作為一種邏輯運算符,前綴’+’ 和 '-'各自表示包含(AND) 和不包含 (AND NOT)。例如, ‘a(chǎn)b -cd’ 和 'ab AND NOT cd’意義相同。如果沒有 FILL UP 選項,只返回含有匹配值的分組記錄。 需要注意的是一個過濾器僅被運用到每個分組集的第一個分組列。

    FILL UP

    不僅返回匹配的分組記錄,也包含不匹配的記錄。 text_filter 函數(shù)對于識別哪一個匹配是很有用的。參閱下面的’Related Functions’。

    SORT MATCHES TO TOP

    返回匹配值位于非匹配值前的分組集。該選項不能和 SUBTOTAL, BALANCE 和 TOTAL 一起使用。

    STRUCTURED RESULT

    結(jié)果作為臨時表返回。 對于每一個分組集創(chuàng)建一個臨時表,如果設(shè)置 WITH OVERVIEW 選項,將為分組集的總覽創(chuàng)建額外的臨時表,該臨時表的名字由 PREFIX 選項定義。

    WITH OVERVIEW

    將總覽返回至單獨的額外一張表中。

    PREFIX 值

    使用前綴命名臨時表。必須以"#“開始,代表是臨時表。如果省略,默認(rèn)前綴為”#GN", 然后,連接該前綴值和一個非負(fù)整數(shù),用作臨時表的名稱,比如"#GN0", “#GN1” 和 “#GN2”。

    MULTIPLE RESULTSETS

    返回多個結(jié)果集中的結(jié)果。

    相關(guān)函數(shù)

    grouping_id ( <grouping_column1, …, grouping_columnn> )函數(shù)返回一個整數(shù),判斷每個分組記錄屬于哪個分組集。 text_filter ( <grouping_column> ) 函數(shù)與 TEXT_FILTER, FILL UP, 和 SORT MATCHES TO TOP 一起使用,顯示匹配值或者 NULL。當(dāng)指定了 FILL UP 選項時,未匹配值顯示為 NULL。

    返回格式

    如果 STRUCTURED RESULT 和 MULTIPLE RESULTSETS 都沒有設(shè)置,返回所有分組集 的聯(lián)合,以及對于沒有包含在指定分組集中的屬性填充的 NULL 值。使用 STRUCTURED RESULT,額外的創(chuàng)建臨時表,在同一會話中用"SELECT * FROM

    "可以查詢。表名遵循的格式:

    0:如果定義了 WITH OVERVIEW,該表將包含總覽。

    n: 由 BEST 參數(shù)重新排序的第 n 個分組集。

    使用 MULTIPLE RESULTSETS,將返回多個結(jié)果集。每個分組集的分組記錄都在單個結(jié)果集中。

    HAVING 子句:

    HAVING 子句用于選擇滿足謂詞的特定分組。如果省略了該子句,將選出所有分組。

    <having_clause> ::= HAVING

    SET OPERATORS

    SET OPERATORS 使多個 SELECT 語句相結(jié)合,并只返回一個結(jié)果集。

    <set_operator> ::= UNION [ ALL | DISTINCT ] | INTERSECT [DISTINCT] | EXCEPT [DISTINCT]

    UNION ALL

    選擇所有 select 語句中的所有(并集)記錄。重復(fù)記錄將不會刪除。

    UNION [DISTINCT]

    選擇所有 SELECT 語句中的唯一記錄,在不同的 SELECT 語句中刪除重復(fù)記錄。 UNION 和 UNION DISTINCT 作用相同。

    INTERSECT [DISTINCT]

    選擇所有 SELECT 語句中共有(交集)的唯一記錄。

    EXCEPT [DISTINCT]

    在位于后面的 SELECT 語句刪除(差集)重復(fù)記錄后,返回第一個 SELECT 語句中所有唯一的記錄。

    ORDER BY 子句

    <order_by_clause> ::= ORDER BY { <order_by_expression>, … }

    <order_by_expression> ::= [ ASC | DESC ]| [ ASC | DESC]

    ::=

    ORDER BY 子句用于根據(jù)表達(dá)式或者位置對記錄排序。位置表示選擇列表的索引。對"select col1,col2 from t order by 2", 2 表示 col2 在選擇列表中使用的第二個表達(dá)式。 ASC 用于按升序排列記錄,DESC 用于按降序排列記錄。默認(rèn)值為 ASC。

    LIMIT

    LIMIT 關(guān)鍵字定義輸出的記錄數(shù)量。

    ::= LIMIT [ OFFSET ]

    LIMIT n1 [OFFSET n2]:返回跳過 n2 條記錄后的最先 n1 條記錄。

    FOR UPDATE

    FOR UPDATE 關(guān)鍵字鎖定記錄,以便其他用戶無法鎖定或修改記錄,直到本次事務(wù)結(jié)束。

    <for_update> ::= FOR UPDATE

    TIME TRAVEL

    該關(guān)鍵字與時間旅行有關(guān),用于語句級別時間旅行回到 commit_id 或者時間指定的快照。

    <time_travel> ::= AS OF { { COMMIT ID <commit_id> } | { UTCTIMESTAMP }}時間旅行只對歷史列表適用。 <commit_id>在每次提交后可以從 m_history_index_last_commit_id 獲得,其相關(guān)的可以從 sys.m_transaction_history 讀取。

    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 查詢相等。 需要注意的是,兩組在第一個查詢的分組集內(nèi)指定的各組在第二個查詢。

    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語句的字段個數(shù),對應(yīng)字段的類型要相同。BW中的MultiCube是將多個InfoProvider的記錄插入到MultiCube所對應(yīng)的物理表中,這一過程并不是通過Union SQL語句來完成的,而是一個個將InfoProvider的數(shù)據(jù)插入到MultiCube中,所以來自InfoProvider的字段個數(shù)可以不同,只是在報表展示時,通過 Group進(jìn)行了合并

    ROLLUP 和 CUBE 經(jīng)常使用的分組集的簡明表示。 下面的 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 限制每組最大記錄數(shù)為 2。對于(customer, year) 組,存在 4 條記錄,只返回前 2 條記錄;(product)組的記錄條數(shù)為 2,因此返回所有結(jié)果。

    select customer, year, product, sum(sales) from t1 groupbygrouping sets LIMIT 2((customer, year),(product));

    WITH SUBTOTAL 為每一組生成額外的一條記錄,顯示返回結(jié)果的分類匯總(沒有顯示出來的不會被統(tǒng)計,這與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 為每一組生成額外的一條記錄,顯示未返回結(jié)果的分類匯總(如果未返回結(jié)果行不存在,則以分類匯總行還是會顯示,只不過都是問號,而不是不顯示)。

    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為每一組生成額外的一條記錄,顯示所有分組記錄的匯總,不考慮該分組記錄是否返回(即沒有顯示在分組里的數(shù)據(jù)也會匯總起來,如下面的 300 + 500 <> 1250,因為使用了Limit限制了每組返回的條數(shù),但那些未顯示出來的數(shù)據(jù)也會被一起統(tǒng)計,這與 With SubTotal不一樣)。

    select customer, year, product, sum(sales) from t1 groupbygrouping sets LIMIT 2 WITH TOTAL((customer, year),(product))

    TEXT_FILTER 允許用戶獲得有指定的的分組的第一列。以下查詢將搜索以’2’結(jié)尾的列:對于第一個分組集為 customers, 第二個為 products。只返回三條匹配的記錄。在 SELECT 列表中的 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 用于返回含有的匹配和不匹配的記錄。 因此,下面的查詢返回 6 條記錄,而先前的查詢返回 3 條。

    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 用于提高匹配記錄。對于每個分組集,將對其分組記錄進(jìn)行排序。

    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 為每個分組集創(chuàng)建一張臨時表,并且可選地,為總覽表也創(chuàng)建一張。表"#GN1" 為 分組集(customer, year),表"#GN2" 為分組集(product)。注意,每張表只含有一列相關(guān)列。也就是說,表"#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 為總覽表創(chuàng)建臨時表"#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 關(guān)鍵字修改臨時表的名字。注意,名字必須以臨時表的前綴’#'開始,下面與上面結(jié)果是一樣,只是臨時表名不一樣而已:

    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";

    當(dāng)相應(yīng)的會話被關(guān)閉或用戶執(zhí)行 drop 命令,臨時表被刪除。 臨時列表是顯示在m_temporary_tables。

    select * from m_temporary_tables;

    MULTIPLE RESULTSETS 返回多個結(jié)果的結(jié)果集。在 SAP HANA Studio 中,以下查詢將返回三個結(jié)果集:一個為總覽表,兩個為分組集。

    select customer, year, product, sum(sales) from t1 groupbygrouping sets MULTIPLE RESULTSETS((customer, year),(product));

    7.2.8 UNLOAD
    語法:

    UNLOAD <table_name>

    描述:

    UNLOAD 語句從內(nèi)存中卸載列存儲表, 以釋放內(nèi)存。表將在下次訪問時重新加載。

    例子:

    在下面的例子中,表 a_table 將從內(nèi)存中卸載。

    UNLOAD a_table;

    卸載表的狀態(tài)可以通過以下語句查詢:

    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> = },…

    關(guān)于表達(dá)式的詳情,請參見 Expressions。

    ::= OR | AND | NOT | ( ) |

    關(guān)于謂詞的詳情,請參見 Predicates。

    描述:

    UPDATE 語句修改滿足條件的表中記錄的值。如果 WHERE 子句中條件為真,將分配該列至表達(dá)式的結(jié)果中。如果省略了 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系統(tǒng)管理語句
    7.3.1 SET SYSTEM LICENSE
    語法:

    SET SYSTEM LICENSE ‘’

    描述:

    安裝許可證密鑰的數(shù)據(jù)庫實例。許可證密鑰(="">) 將從許可證密鑰文件中復(fù)制黏貼。

    執(zhí)行該命令需要系統(tǒng)權(quán)限 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 (, [, <layer_name>]) SET | UNSET <parameter_key_value_list> [ WITH RECONFIGURE]

    語法元素:

    ::= <string_literal>

    行存儲引擎配置的情況下,文件名是’indexserver.ini’。 所使用的文件名必須是一個位于’DEFAULT’層的 ini 文件。如果選擇文件的文件名在所需的層不存在,該文件將用 SET 命令創(chuàng)建。

    ::= <string_literal>

    設(shè)置配置變化的目標(biāo)層。 該參數(shù)可以是’SYSTEM’或’HOST’。 SYSTEM 層為客戶設(shè)置的推薦層。 HOST層應(yīng)該一般僅可用于少量的配置,例如, daemon.ini 包含的參數(shù)。

    <layer_name> ::= <string_literal>

    如果上述的層設(shè)為’HOST’, layer_name 將用于設(shè)置目標(biāo) tenant 名或者目標(biāo)主機名。例如,

    ‘selxeon12’ 為目標(biāo) ‘selxeon12’ 主機名。

    SET

    SET 命令更新鍵值,如果該鍵已存在,或者需要的話插入該鍵值。

    UNSET

    UNSET 命令刪除鍵及其關(guān)聯(lián)值。

    <parameter_key_value_list> ::={(<section_name>,<parameter_name>) = <parameter_value>},…

    指定要修改的 ini 文件的段、鍵和值語句如下:

    <section_name> ::= <string_literal>

    將要修改的參數(shù)段名:

    <parameter_name> ::= <string_literal>

    將要修改的參數(shù)名:

    <parameter_value> ::= <string_literal>

    將要修改的參數(shù)值。

    WITH RECONFIGURE

    當(dāng)指定了 WITH RECONFIGURE,配置的修改將直接應(yīng)用到 SAP HANA 數(shù)據(jù)庫實例。

    當(dāng)未指定 WITH RECONFIGURE,新的配置將寫到文件 ini 中,然而,新的值將不會應(yīng)用到當(dāng)前運行系統(tǒng)中,只在數(shù)據(jù)庫下次的啟動時應(yīng)用。這意味 ini 文件中的內(nèi)容可能和 SAP HANA 數(shù)據(jù)庫使用的實際配置值存在不一致。

    描述:

    設(shè)置或刪除 ini 文件中的配置參數(shù)。 ini 文件配置用于 DEFAULT, SYSTEM, HOST 層。

    注意: DEFAULT 層配置不能使用此命令更改或刪除。

    以下為 ini 文件位置的例子:

    DEFAULT: /usr/sap//HDB/exe/config/indexserver.ini

    SYSTEM: /usr/sap//SYS/global/hdb/custom/config/indexserver.ini

    HOST: /usr/sap//HDB//indexserver.ini

    配置層的優(yōu)先級: DEFAULT < SYSTEM < HOST。這表示 HOST 層具有最高優(yōu)先級,跟著是 SYSTEM層,最后是 DEFAULT 層。最高優(yōu)先級的配置將應(yīng)用到運行環(huán)境中。 如果最高優(yōu)先級的配置被刪除,具有下一個最高優(yōu)先級的配置將被應(yīng)用。

    系統(tǒng)和監(jiān)控視圖:

    目前可供使用的 ini 文件在系統(tǒng)表 M_INIFILES 列出,并且當(dāng)前配置在系統(tǒng)表 M_INIFILE_CONTENTS可見。

    例子:

    修改系統(tǒng)層配置的例子如下:

    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>

    應(yīng)當(dāng)設(shè)置變量的會話的 ID。

    ::= <string_literal>

    會話變量的鍵值,最大長度為 32 個字符。

    ::= <string_literal>

    會話變量的期望值,最大長度為 512 個字符。

    描述:

    使用該命令,你可以設(shè)置數(shù)據(jù)庫會話的會話變量:

    注意:有幾個只讀會話變量,你不能使用該命令修改值: APPLICATION, APPLICATIONUSER,TRACEPROFILE。

    會話變量可以使用 SESSION_CONTEXT 函數(shù)獲得,使用 ALTER SYSTEM ALTER SESSION UNSET 命令取消設(shè)置。

    例子:

    在以下的例子中,你在會話 200006 將變量’MY_VAR’ 設(shè)為 ‘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>

    應(yīng)當(dāng)取消設(shè)置變量的會話 ID。

    ::= <string_literal>

    會話變量的鍵值, 最大長度為 32 個字符。

    描述:

    使用該命令,你可以取消設(shè)置數(shù)據(jù)庫會話的會話變量。

    會話可以通過 SESSION_CONTEXT 函數(shù)獲得。

    例子:

    獲得當(dāng)前會話的會話變量:

    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 取消當(dāng)前正在運行的語句。取消的會話將在取消后回滾,執(zhí)行中的語句將返回錯誤代碼 139(current operation cancelled by request and transaction rolled back)。

    例子:

    你可以使用下面的查詢來獲取當(dāng)前的連接 ID 和它們執(zhí)行的語句。

    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,你現(xiàn)在可以取消一條正在運行的查詢,語句如下:

    ALTERSYSTEM CANCEL SESSION ‘400037’;

    7.3.6 ALTER SYSTEM CLEAR SQL PLAN CACHE
    語法:

    ALTER SYSTEM CLEAR SQL PLAN CACHE

    描述:

    SQL PLAN CACHE 存儲之前執(zhí)行的 SQL 語句生成的計劃, SAP HANA 數(shù)據(jù)庫使用該計劃緩存加速查詢語句的執(zhí)行,如果同樣的 SQL 語句 再次執(zhí)行。計劃緩存也收集關(guān)于計劃準(zhǔn)備和執(zhí)行的數(shù)據(jù)。

    你可以從以下的監(jiān)控視圖中找到更多有關(guān) SQL 緩存計劃的內(nèi)容:

    M_SQL_PLAN_CACHE, M_SQL_PLAN_CACHE_OVERVIEW

    ALTER SYSTEM CLEAR SQL PLAN CACHE 語句刪除所有當(dāng)前計劃緩存沒有執(zhí)行的 SQL 計劃。該命令還可以從計劃緩存中刪除所有引用計數(shù)為 0 的計劃,并重置所有剩余計劃的統(tǒng)計數(shù)據(jù)。最后,該命令也重置監(jiān)控視圖 M_SQL_PLAN_CACHE_OVERVIEW 的內(nèi)容。

    例子:

    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>

    你可以通過設(shè)置 trace_type 為以下類型之一,有選擇地清除特定的追蹤文件:

    描述:

    你可以使用 ALTER SYSTEM CLEAR TRACES 清除追蹤文件中的追蹤內(nèi)容。當(dāng)您使用此命令所有開設(shè)了 SAP HANA 數(shù)據(jù)庫的跟蹤文件將被刪除或清除。在分布式系統(tǒng)中,該命令將清除所有主機上的所有跟蹤文件。

    使用此命令可以減少大跟蹤文件使用的磁盤空間,例如,當(dāng)追蹤組件設(shè)為 INFO 或 DEBUG。

    你可以使用系統(tǒng)表 M_TRACEFILES, M_TRACEFILE_CONTENTS 各自監(jiān)控追蹤文件及其內(nèi)容。

    例子:

    要清除警告的跟蹤文件,使用下面的命令:

    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 來斷開數(shù)據(jù)庫指定的會話。在斷開連接之前,與會話相關(guān)聯(lián)的所有正在運行的操作將被終止。

    例子:

    你使用如下的命令獲得空閑會話的會話 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

    描述:

    啟動或禁用日志。

    日志記錄被禁用后,任何日志條目將不會持久化。當(dāng)完成一個保存點,只有數(shù)據(jù)區(qū)被寫入數(shù)據(jù)。

    這可能會導(dǎo)致?lián)p失已提交的事務(wù),當(dāng) indexserver 在加載中時被終止。在終止的情況下,你必須截斷,并再次插入的所有數(shù)據(jù)。

    啟用日志記錄后,你必須執(zhí)行一個保存點,以確保所有的數(shù)據(jù)都保存,并且你必須執(zhí)行數(shù)據(jù)備份,否則你將不能恢復(fù)這些數(shù)據(jù)。

    只在初次加載時使用該命令!

    你可以使用 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’

    指定服務(wù)器在持久層應(yīng)減少的大小:

    <percentage_of_overload_size> ::= <int_const>

    指定過載的數(shù)據(jù)量應(yīng)減少的百分比。

    <shrink_mode> ::= DEFRAGMENT | SPARSIFY

    指定持續(xù)層減少大小的策略,默認(rèn)值為 DEFRAGEMENT。請注意, SPARSIFY 尚未支持,并保留以備將來使用

    描述:

    該命令應(yīng)在持久層中未使用的空間釋放時使用。 它減少數(shù)據(jù)量到過載量的 N%; 它的工作原理就像一個硬盤進(jìn)行碎片整理,散落在頁面的數(shù)據(jù)將被移動到數(shù)據(jù)量的前端和數(shù)據(jù)量尾端的自由空間將被截斷。

    如果省略了<host_port> ,該語句將持久化地分配至所有服務(wù)器。

    例子:

    在下面的例子中,架構(gòu)中的所有服務(wù)器持久層將進(jìn)行碎片整理,并減少至過載尺寸的 120%。

    ALTERSYSTEM RECLAIM DATAVOLUME 120 DEFRAGMENT

    7.3.11 ALTER SYSTEM RECLAIM LOG
    語法:

    ALTER SYSTEM RECLAIM LOG

    描述:

    當(dāng)數(shù)據(jù)庫中已經(jīng)積累了大量的日志段時,你可以使用此命令,收回磁盤空間目前未使用的日志段。

    日志段的積累,可以以多種方式引起。 例如,當(dāng)自動日志備份不可長期操作或日志保存點被阻塞很長時間, 當(dāng)這樣的問題發(fā)生時,你只能在修復(fù)日志積累的根本原因后, 使用 ALTER SYSTEM CLAIM LOG 命令。

    例子:

    你回收目前未使用的日志段的磁盤空間,使用下面的命令:

    ALTERSYSTEM RECLAIM LOG

    7.3.12 ALTER SYSTEM RECLAIM VERSION SPACE
    語法:

    ALTER SYSTEM RECLAIM VERSION SPACE

    描述:

    執(zhí)行 MVCC 版本垃圾回收來重用資源。

    7.3.13 ALTER SYSTEM RECONFIGURE SERVICE
    語法:

    ALTER SYSTEM RECONFIGURE SERVICE (<service_name>,,)

    語法元素:

    <service_name> ::= <string_literal>

    你希望重新配置的服務(wù)名稱。關(guān)于可用的服務(wù)類型的列表,請參閱監(jiān)控視圖 M_SERVICE_TYPES。

    ::= <string_literal>

    ::=

    你將重新配置服務(wù)的主機和端口號。

    描述:

    你可以使用 ALTER SYSTEM RECONFIGURE SERVICE 通過應(yīng)用當(dāng)前配置參數(shù),重新配置指定的服務(wù)。

    在使用沒有 RECONFIGURE 選項的 ALTER CONFIGURATION 修改多個配置參數(shù)使用該命令。參見ALTER SYSTEM ALTER CONFIGURATION。

    欲重新配置特定的服務(wù),指定 和 的 值, 而<service_name> 留空。

    欲重新配置一種類型的所有服務(wù),指定<service_name> 的值, 而 host> 和 留空。

    欲重新配置所有服務(wù),所有參數(shù)留空。

    例子:

    你可以使用以下命令來重新配置 ld8520.sap.com 主機上所有使用端口號 30303 的服務(wù):

    ALTERSYSTEM RECONFIGURE SERVICE (’’,‘ld8520.sap.com’,30303)

    你可以使用以下命令重新配置類型 indexserver 的所有服務(wù):

    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_name_list> ::= <trace_file>,…

    語法元素:

    :== <string_literal>

    將要刪除追蹤記錄的主機名。

    <trace_file_name_list> ::= <trace_file> [,…]

    你可以通過在逗號分隔的列表中添加多條 trace_file 記錄,同時刪除多條追蹤記錄。

    <trace_file> :== see table below.

    你可以將 trace_file 設(shè)置為以下類型之一:

    描述:

    你可以使用該命令刪除指定主機中的追蹤文件,減少大追蹤文件占用的硬盤空間。當(dāng)某個服務(wù)的追蹤文件已打開,則不能被刪除。這種情況下,你可以使用 ALTER SYSTEM CLEAR TRACES 命令清除追蹤文件。

    例子:

    你使用以下命令刪除主機 lu873.sap.com 上所有 ALERT 追蹤文件:

    ALTERSYSTEM REMOVE TRACES (‘lu873.sap.com’, ‘a(chǎn)lert_.trc’);

    參見 ALTER SYSTEM CLEAR TRACES。

    7.3.15 ALTER SYSTEM RESET MONITORING VIEW
    語法:

    ALTER SYSTEM RESET MONITORING VIEW <view_name>

    語法元素:

    <view_name> ::=

    重設(shè)可重置監(jiān)控視圖的名字。

    注意:不是所有監(jiān)控視圖可以使用該命令進(jìn)行重置。可重設(shè)視圖的名字后綴為"_RESET",你可以通過其名字判斷是否可以重置。

    描述:

    你可以使用此命令重置指定的監(jiān)視視圖的統(tǒng)計數(shù)據(jù)。

    你可以使用此命令來定義測量的起始點。首先,你重置監(jiān)控視圖,然后執(zhí)行一個操作。當(dāng)該操作完成后,查詢監(jiān)控視圖"_RESET"版本獲得從上次重置之后收集到的統(tǒng)計信息。

    例子:

    在以下的例子中,你重置"SYS"."M_HEAP_MEMORY_RESET"監(jiān)控視圖:

    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>

    原始性能數(shù)據(jù)保存的文件。

    描述:

    你可以使用命令收集.prf 文件中的原始性能數(shù)據(jù),保存該信息至.tpt 文件。 .tpt 文件保存在 SAP HANA 數(shù)據(jù)庫實例的追蹤文件目錄中。如果你未指定文件名,則文件將保存為’perftrace.tpt’。

    性能追蹤數(shù)據(jù)文件(.tpt)可以從’SAP HANA Computing Studio’->Diagnosis-Files 下載,之后性能追蹤可以利用 SAP HANA 實例中的 HDBAdmin 加載和分析。

    監(jiān)控視圖:

    性能文件的狀態(tài)可以從 M_PERFTRACE 監(jiān)控。

    例子:

    你可以使用如下命令將原始性能數(shù)據(jù)保存至’mytrace.tpt’文件:

    ALTERSYSTEM SAVE PERFTRACE INTO FILE ‘mytrace.tpt’

    7.3.17 ALTER SYSTEM SAVEPOINT
    語法:

    ALTER SYSTEM SAVEPOINT

    描述:

    持久層管理器上執(zhí)行保存點。 保存點是一個數(shù)據(jù)庫的完整連續(xù)鏡像保存在磁盤上的時間點,該鏡像可以用于重啟數(shù)據(jù)庫。

    通常情況下,保存點定期執(zhí)行,由[persistence]部分的參數(shù) savepoint_interval_s 配置。 對于特殊的(通常測試)的目的,保存點可能會被禁用。在這種情況下,你可以使用此命令來手動執(zhí)行保存點。

    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,應(yīng)用用戶可以通過會話變量 APPLICATIONUSER 定義。

    PLAN_EXECUTION

    收集計劃執(zhí)行細(xì)節(jié):

    FUNCTION_PROFILER

    收集函數(shù)級別細(xì)節(jié):

    <duration_seconds> ::=

    經(jīng)過 duration_seconds 后, perftrace 自動停止。如果未指定該參數(shù),僅停止有 ALTER SYSTEM STOP PERFTRACE 的 perftrace。

    描述:

    開始性能追蹤。

    利用’Explain Plan’ 或 ‘Visualize Plan’,你可以在邏輯級別查看語句的執(zhí)行。利用’Perfomance Trace’,語句的執(zhí)行將記錄在線程和函數(shù)級別。

    一次只能有一個 perftrace 活動。

    性能追蹤文件狀態(tài)可以從 M_PERFTRACE 監(jiān)控。

    例子:

    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 收集和保存性能追蹤數(shù)據(jù)。

    例子:

    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>)

    將停止的服務(wù)的位置。

    IMMEDIATE

    立即停止(中止)服務(wù),無需等待正常關(guān)機。

    WITH COREFILE

    寫入 core 文件。

    描述:

    停止或終止單個或者多個服務(wù)。 通常,該服務(wù)將由守護(hù)進(jìn)程重新啟動。

    修改了不能在線更改的參數(shù)之后使用。

    例子:

    ALTERSYSTEM STOP SERVICE ‘ld8520:30303’

    UNSET SYSTEM LICENSE ALL

    語法:

    7.3.21 UNSET SYSTEM LICENSE ALL
    描述:

    刪除所有已安裝的許可證密鑰。 使用此命令后,系統(tǒng)將被立即鎖定,并且需要一個新的有效許可證密鑰,然后才可以繼續(xù)使用。執(zhí)行該命令需要有 LICENSE ADMIN 權(quán)限。

    例子:

    UNSET SYSTEM LICENSE ALL

    7.4會話管理語句
    7.4.1 CONNECT
    語法:

    CONNECT <connect_option>

    語法元素:

    <connect_option> ::=<user_name> PASSWORD | WITH SAML ASSERTION ‘’

    描述:

    通過指定 user_name 和密碼或者指定 SAML 斷言連接數(shù)據(jù)庫實例。

    例子:

    CONNECT my_user PASSWORD myUserPass1

    7.4.2 SET HISTORY SESSION
    語法:

    SET HISTORY SESSION TO

    語法元素:

    :

    用戶應(yīng)該指定一個確切的會話旅行的時間。

    ::= NOW | COMMIT ID <commit_id> | UTCTIMESTAMP <utc_timestamp>

    描述:

    SET HISTORY SESSION 使當(dāng)前會話查看歷史記錄表過去的版本。用戶可以指定 COMMIT ID 中的版本或 UTCTIMESTAMP 格式,或者通過指定 NOW 回到當(dāng)前版本。發(fā)布帶有 COMMIT ID 或UTCTIMESTAMP 的 SET HISTORY SESSION 之后,當(dāng)前會話中看到了一個舊版本的歷史記錄表,而不能寫進(jìn)系統(tǒng)任何東西。如果給定了 NOW 選項,當(dāng)前會話恢復(fù)到一個正常的會話,看到當(dāng)前版本的歷史記錄表,并能寫入系統(tǒng)。 此命令只適用于歷史記錄表,普通表的可見性不會受到影響。

    例子:

    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>

    描述:

    你可以修改會話的當(dāng)前schema。 如果表前不限制schema,則使用當(dāng)前用戶的schema。

    7.4.4 SET [SESSION]
    語法:

    SET [SESSION] =

    (SESSION選項可以省略)

    語法元素:

    ::= <string_literal>

    會話變量的鍵值,最大長度為 32 個字符。

    ::= <string_literal>

    會話變量的期望值,最大長度為 512 個字符。

    描述:

    你可以使用該命令設(shè)置你數(shù)據(jù)庫會話的會話變量,通過提供鍵值對。

    注意:有幾個只讀會話變量,你不能使用該命令修改值: APPLICATION, APPLICATIONUSER,TRACEPROFILE。

    會話變量可以使用 SESSION_CONTEXT 函數(shù)獲得,使用 UNSET [SESSION]命令取消設(shè)置。

    例子:

    SET’MY_VAR’ = ‘dummy’;

    SELECT SESSION_CONTEXT(‘MY_VAR’) FROM dummy;

    UNSET ‘MY_VAR’;

    7.4.5 UNSET [SESSION]
    語法:

    UNSET [SESSION]

    語法元素:

    ::= <string_literal>

    會話變量的鍵值,最大長度為 32 個字符。

    描述:

    你可以使用 UNSET [SESSION]取消設(shè)置當(dāng)前會話的會話變量。

    注意:有幾個只讀會話變量,你不能使用該命令修改值: APPLICATION, APPLICATIONUSER,TRACEPROFILE。

    例子:

    SET’MY_VAR’= ‘dummy’;

    SELECT SESSION_CONTEXT(‘MY_VAR’) FROM dummy;

    UNSET ‘MY_VAR’;

    7.5事務(wù)管理語句
    7.5.1 COMMIT
    語法:

    COMMIT

    描述:

    該系統(tǒng)支持事務(wù)一致性,保證了當(dāng)前作業(yè)是完全應(yīng)用到系統(tǒng)中或者棄用。如果用戶希望持久地應(yīng)用當(dāng)前作業(yè)至系統(tǒng)中,用戶應(yīng)使用 COMMIT 命令。 如果 COMMIT 命令發(fā)出后,并成功處理,任何改變將應(yīng)用到當(dāng)前事務(wù)完成的系統(tǒng)中,改變也將對其他未來開始的作業(yè)可見。通過 COMMIT 命令已經(jīng)承諾的工作,將不能恢復(fù)。 分布式系統(tǒng)中,遵守標(biāo)準(zhǔn)的兩階段提交協(xié)議。在第一階段, 事務(wù)處理協(xié)調(diào)器將詢問每一位參與者是否準(zhǔn)備提交,并將結(jié)果發(fā)送到第二階段的參與者。 COMMIT 命令只適用于’autocommit’的禁用會話。

    例子:

    COMMIT

    7.5.2 LOCK TABLE
    語法:

    LOCK TABLE <table_name> IN EXCLUSIVE MODE [NOWAIT]

    描述:

    LOCK TABLE 命令顯式地嘗試獲取表的互斥鎖。如果指定了 NO WAIT 選項, 其只是試圖獲得表的鎖。如果指定了 NOWAIT 選項不能獲得鎖,將返回一個錯誤代碼,但是當(dāng)前事務(wù)將回滾。

    例子:

    LOCKTABLE t1 INEXCLUSIVEMODE NOWAIT

    7.5.3 ROLLBACK
    語法:

    ROLLBACK

    描述:

    該系統(tǒng)支持事務(wù)一致性,保證了當(dāng)前作業(yè)是完全應(yīng)用到系統(tǒng)中或者棄用。在事務(wù)的中間過程, 可以顯式恢復(fù),因為由于 ROLLBACK 命令,事務(wù)尚未執(zhí)行。發(fā)布 ROLLBACK 命令后, 將完全恢復(fù)事務(wù)系統(tǒng)做的任何變化,當(dāng)前會話將處于閑置狀態(tài)。 ROLLBACK 命令只適用于’autocommit’的禁用會話。

    例子:

    ROLLBACK

    7.5.4 SET TRANSACTION
    語法:

    SET TRANSACTION <isolation_level> | <transaction_access_mode>

    語法元素:

    isolation_level ::= ISOLATION LEVEL

    隔離級別設(shè)置數(shù)據(jù)庫中的數(shù)據(jù)語句級讀一致性。如果省略了 isolation_level,默認(rèn)值為 READ COMMITTED。

    level ::= READ COMMITTED(提交讀取) | REPEATABLE READ(可重復(fù)讀) | SERIALIZABLE(序列化讀)

    READ COMMITTED

    READ COMMITTED 隔離級別提供事務(wù)過程中語句級別讀一致性。 在語句開始執(zhí)行時,事務(wù)中的每條語句都能看到已提交狀態(tài)的數(shù)據(jù)。這意味著在同一事務(wù)中,每個語句可能會看到執(zhí)行時數(shù)據(jù)庫中不同的快照,因為數(shù)據(jù)可以在事務(wù)中提交。

    REPEATABLE READ/SERIALIZABLE

    REPEATABLE READ/SERIALIZABLE 隔離級別提供了事務(wù)級快照隔離。事務(wù)所有語句共享數(shù)據(jù)庫同樣的快照。該快照包含所有已提交的事務(wù)開始的時間以及事務(wù)本身的修改。

    transaction_access_mode ::= READ ONLY | READ WRITE

    SQL 事務(wù)訪問模式控制事務(wù)是否可以在執(zhí)行期間修改數(shù)據(jù)。如果省略了transaction_access_mode,默認(rèn)值為 READ ONLY。

    READ ONLY

    如果設(shè)置了 READ ONLY 訪問模式,則只允許只讀的 SELECT 語句。如果在這種模式下嘗試更新或插入操作,會拋出一個異常。

    READ WRITE

    如果設(shè)置了 READ WRITE 訪問模式,在一個事務(wù)中的語句可以按需自由地讀取或更改數(shù)據(jù)庫的數(shù)據(jù)。

    描述:

    SAP HANA 數(shù)據(jù)庫使用多版本并發(fā)控制 (MVCC) 確保讀取操作的一致性(提交讀取隔離級別+MVCC,可以解決數(shù)據(jù)不可重復(fù)讀的問題)。并發(fā)的讀操作不阻塞并發(fā)寫操作數(shù)據(jù)庫中的數(shù)據(jù)的一致視圖。并發(fā)的讀操作不阻塞并發(fā)寫數(shù)據(jù)庫數(shù)據(jù)的一致視圖。更新操作通過插入數(shù)據(jù)的新版本而不是覆蓋已有數(shù)據(jù)執(zhí)行。

    指定的隔離級別確定將要使用的鎖操作類型。系統(tǒng)同時支持語句級快照隔離和事務(wù)級快照隔離。

    ? 對于語句級快照隔離,使用READ COMMITED。

    ? 對于事務(wù)級快照隔離,使用REPEATABLE READ 或者 SERIALIZABLE。

    在一個事務(wù)中,當(dāng)記錄被插入、更新或刪除時,系統(tǒng)對事務(wù)執(zhí)行中,受影響的記錄設(shè)置互斥鎖的持續(xù)時間,也對受影響的表設(shè)置鎖。這樣可以保證當(dāng)表中的記錄正在更新時,該表不會被刪除或更改。數(shù)據(jù)庫在事務(wù)結(jié)束時釋放這些鎖。

    注意:讀取操作不設(shè)置任何數(shù)據(jù)庫中表或行的鎖,無論使用何種隔離級別。

    數(shù)據(jù)定義語言和事務(wù)隔離

    數(shù)據(jù)定義語言(DDL) 語句(CREATE TABLE, DROP TABLE, CREATE VIEW, etc )總是立即對隨后的 SQ 語句生效,無論使用何種隔離級別。對于這種行為的一個例子,請考慮下面的順序:

  • 一個長期運行 SERIALIZABLE 的隔離事務(wù)在表 C 開始操作。

  • 一些 DDL 語句在事務(wù)外運行,添加一列新列至表 C。

  • 在 SERIALIZABLE 隔離事務(wù)內(nèi),只要 DDL 語句執(zhí)行完畢,新生成的列可以要訪問。訪問發(fā)生不論使用何種隔離級別。

  • 例子:

    SETTRANSACTION READ COMMITTED;

    數(shù)據(jù)庫的隔離級別:并發(fā)性作用。

    l Read Uncommited(未提交讀):沒有提交就可以讀取到數(shù)據(jù)(發(fā)出了Insert,但沒有commit就可以讀取到。)很少用。在該隔離級別,所有事務(wù)都可以看到其他未提交事務(wù)的執(zhí)行結(jié)果。本隔離級別很少用于實際應(yīng)用,因為它的性能也不比其他級別好多少。讀取未提交的數(shù)據(jù),也被稱之為臟讀(Dirty Read)。

    l Read Commited(提交讀):只有提交后才可以讀,常用。這是大多數(shù)數(shù)據(jù)庫系統(tǒng)的默認(rèn)隔離級別(但不是MySQL默認(rèn)的,MySql默認(rèn)為可重復(fù)讀)。它滿足了隔離的簡單定義:一個事務(wù)只能看見已經(jīng)提交事務(wù)所做的改變。解決了臟讀問題。

    l Repeatable Read(可重復(fù)讀):mysql默認(rèn)級別, 必需提交才能見到,讀取數(shù)據(jù)時數(shù)據(jù)被鎖住。它確保同一事務(wù)的多個實例在并發(fā)讀取數(shù)據(jù)時,會看到同樣的數(shù)據(jù)行。不過理論上,這會導(dǎo)致另一個棘手的問題:幻讀 (Phantom Read)。簡單的說,幻讀指當(dāng)用戶讀取某一范圍的數(shù)據(jù)行時,另一個事務(wù)又在該范圍內(nèi)插入了新行,當(dāng)用戶再讀取該范圍的數(shù)據(jù)行時,會發(fā)現(xiàn)有新的“幻影” 行。InnoDB和Falcon存儲引擎通過多版本并發(fā)控制(MVCC,Multiversion Concurrency Control)機制解決了該問題。解決了不可重復(fù)讀的問題

    l Serialiazble(序列化讀):最高隔離級別,串型的,你操作完了,我才可以操作,并發(fā)性特別不好。這是最高的隔離級別,它通過強制事務(wù)排序,使之不可能相互沖突,從而解決幻讀問題。簡言之,它是在每個讀的數(shù)據(jù)行上加上共享鎖。在這個級別,可能導(dǎo)致大量的超時現(xiàn)象和鎖競爭。

    隔離級別

    是否存在臟讀

    是否存在不可重復(fù)讀

    是否存在幻讀

    Read Uncommitted(未提交讀)

    Y

    Y

    Y

    Read Commited(提交讀)

    N

    Y(可采用悲觀鎖解決)

    Y

    Repeatable Read(可重復(fù)讀)

    N

    N

    Y

    Serialiazble(序列化讀)

    N

    N

    N

    事務(wù)并發(fā)時可能出現(xiàn)問題:臟讀、不可重復(fù)讀、幻讀

    臟讀:沒有提交就可以讀取到數(shù)據(jù)稱為臟讀

    不可重復(fù)讀:再重復(fù)讀一次,數(shù)據(jù)與你上的不一樣。稱不可重復(fù)讀。

    幻讀:在查詢某一條件的數(shù)據(jù),開始查詢的后,別人又加入或刪除些數(shù)據(jù),再讀取時與原來的數(shù)據(jù)不一樣了。

    臟讀(Drity Read):某個事務(wù)已更新一份數(shù)據(jù),另一個事務(wù)在此時讀取了同一份數(shù)據(jù),由于某些原因前一個RollBack了操作,則后一個事務(wù)所讀取的數(shù)據(jù)就會是不正確的。

    不可重復(fù)讀(Non-repeatable read):在一個事務(wù)的兩次查詢之中數(shù)據(jù)不一致,這可能是兩次查詢過程中間插入了一個事務(wù)更新的原有的數(shù)據(jù)。

    幻讀(Phantom Read):在一個事務(wù)的兩次查詢中數(shù)據(jù)筆數(shù)不一致,例如有一個事務(wù)查詢了幾行(Row)數(shù)據(jù),而另一個事務(wù)卻在此時插入了新的幾行數(shù)據(jù),先前的事務(wù)在接下來的查詢中,就會發(fā)現(xiàn)有幾列數(shù)據(jù)是它先前所沒有的。

    設(shè)置 JDBC 事務(wù)隔離級別(注意多數(shù)數(shù)據(jù)庫都不支持所有的隔離級別):

    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

    一般我們將級別設(shè)置為1(提交讀)級別后,再通過程序的方式來避免“不可重復(fù)讀”問題。

    如果我們在Hibernate中沒有設(shè)置數(shù)據(jù)庫的隔離級別,則默認(rèn)是依賴于數(shù)據(jù)庫的,所以我們最好設(shè)置。

    銀行系統(tǒng)需要將數(shù)據(jù)庫的隔離級別設(shè)置成“可重復(fù)讀”。

    一、悲觀鎖
    悲觀鎖:具有排他性(我鎖住當(dāng)前數(shù)據(jù)后,別人看到不此數(shù)據(jù))

    悲觀鎖一般由數(shù)據(jù)機制來做到的。select … for update

    1、 悲觀鎖的實現(xiàn)
    通常依賴于數(shù)據(jù)庫機制,在整修過程中將數(shù)據(jù)鎖定,其它任何用戶都不能讀取或修改(如:必需我修改完之后,別人才可以修改)

    2、 悲觀鎖的適用場景:
    悲觀鎖一般適合短事務(wù)比較多(如某一數(shù)據(jù)取出后加1,立即釋放)

    長事務(wù)占有時間(如果占有1個小時,那么這個1小時別人就不可以使用這些數(shù)據(jù)),不常用。

    3、 實例:

    用戶1、用戶2 同時讀取到數(shù)據(jù),但是用戶2先 -200,這時數(shù)據(jù)庫里的是800,現(xiàn)在用戶1也開始-200,可是用戶1剛才讀取到的數(shù)據(jù)是1000,現(xiàn)在用戶用剛剛一開始讀取的數(shù)據(jù)1000-200為800,而用戶1在更新時數(shù)據(jù)庫里的是用房更新的數(shù)據(jù)800,按理說用戶1應(yīng)該是800-200=600,而現(xiàn)在是800,這樣就造成的更新丟失。這種情況該如何處理呢,可采用兩種方法:悲觀鎖、樂觀鎖。先看看悲觀鎖:用戶1讀取數(shù)據(jù)后,用鎖將其讀取的數(shù)據(jù)鎖上,這時用戶2是讀取不到數(shù)據(jù)的,只有用戶1釋放鎖后用戶2才可以讀取,同樣用戶2讀取數(shù)據(jù)也鎖上。這樣就可以解決更新丟失的問題了。

    二、樂觀鎖
    樂觀鎖:不是鎖,是一種沖突檢測機制,如Hibernate就是這樣。

    樂觀鎖的并發(fā)性較好,因為我改的時候,別人隨邊修改。樂觀鎖的實現(xiàn)方式:常用的是版本的方式(每個數(shù)據(jù)表中有一個版本字段version,某一個用戶更新數(shù)據(jù)后,版本號+1,另一個用戶修改后再+1,當(dāng)用戶更新發(fā)現(xiàn)數(shù)據(jù)庫當(dāng)前版本號與讀取數(shù)據(jù)時版本號不一致(等于小于數(shù)據(jù)庫當(dāng)前版本號),則更新不了。

    7.5.4.1 數(shù)據(jù)庫鎖相關(guān)概念
    為了確保并發(fā)用戶在存取同一數(shù)據(jù)庫對象時的正確性(即無丟失修改、可重復(fù)讀、不讀“臟”數(shù)據(jù)),數(shù)據(jù)庫中引入了鎖機制。基本的鎖類型有兩種:排它鎖(exclusive locks 記為x 鎖)和共享鎖(share locks記為 s鎖)。加鎖是實現(xiàn)數(shù)據(jù)庫并發(fā)控制的一個非常重要的技術(shù)。當(dāng)事務(wù)在對某個數(shù)據(jù)對象進(jìn)行操作前,先向系統(tǒng)發(fā)出請求,對其加鎖。加鎖后事務(wù)就對該數(shù)據(jù)對象有了一定的控制,在該事務(wù)釋放鎖之前,其他的事務(wù)不能對此數(shù)據(jù)對象進(jìn)行更新操作。

    排它鎖:若事務(wù)t對數(shù)據(jù)d加x鎖,則其它任何事務(wù)都不能再對d加任何類型的鎖,直至t 釋放d 上的x 鎖;一般要求在修改數(shù)據(jù)前要向該數(shù)據(jù)加排它鎖,所以排它鎖又稱為寫鎖。

    共享鎖:若事務(wù)t對數(shù)據(jù)d加s 鎖,則其它事務(wù)只能對d加 s鎖,而不能加x 鎖,直至t 釋放d 的s 鎖;一般要求在讀取數(shù)據(jù)前要向該數(shù)據(jù)加共享鎖,所以共享鎖又稱為讀鎖。

    7.5.4.1.1 悲觀封鎖
    鎖在用戶修改之前就發(fā)揮作用:
    Select …for update(nowait)
    Select * from tab1 for update
    用戶發(fā)出這條命令之后,oracle將會對返回集中的數(shù)據(jù)建立行級封鎖,以防止其他用戶的修改。
    如果此時其他用戶對上面返回結(jié)果集的數(shù)據(jù)進(jìn)行dml或ddl操作都會返回一個錯誤信息或發(fā)生阻塞。
    1:對返回結(jié)果集進(jìn)行update或delete操作會發(fā)生阻塞。
    2:對該表進(jìn)行ddl操作將會報:Ora-00054:resource busy and acquire with nowait specified.

    原因分析
    此時Oracle已經(jīng)對返回的結(jié)果集上加了排它的行級鎖,所有其他對這些數(shù)據(jù)進(jìn)行的修改或刪除操作都必須等待這個鎖的釋放,產(chǎn)生的外在現(xiàn)象就是其他的操作將發(fā)生阻塞,這個這個操作commit或rollback.
    同樣這個查詢的事務(wù)將會對該表加表級鎖,不允許對該表的任何ddl操作,否則將會報出ora-00054錯誤::resource busy and acquire with nowait specified.

    7.5.4.1.2 樂觀封鎖
    樂觀的認(rèn)為數(shù)據(jù)在select出來到update進(jìn)取并提交的這段時間數(shù)據(jù)不會被更改。這里面有一種潛在的危險就是由于被選出的結(jié)果集并沒有被鎖定,是存在一種可能被其他用戶更改的可能。因此Oracle仍然建議是用悲觀封鎖,因為這樣會更安全。樂觀鎖一般通過程序版本控制來實現(xiàn),如Hibernate

    7.5.4.1.3 阻塞
    定義:
    當(dāng)一個會話保持另一個會話正在請求的資源上的鎖定時,就會發(fā)生阻塞。被阻塞的會話將一直掛起,直到持有鎖的會話放棄鎖定的資源為止。4個常見的dml語句會產(chǎn)生阻塞
    INSERT
    UPDATE
    DELETE
    SELECT…FOR UPDATE

    INSERT

    Insert發(fā)生阻塞的唯一情況就是用戶擁有一個建有主鍵約束的表。當(dāng)2個的會話同時試圖向表中插入相同的數(shù)據(jù)時,其中的一個會話將被阻塞,直到另外一個會話提交或會滾。一個會話提交時,另一個會話將收到主鍵重復(fù)的錯誤。回滾時,被阻塞的會話將繼續(xù)執(zhí)行。

    UPDATE 和DELETE當(dāng)執(zhí)行Update和delete操作的數(shù)據(jù)行已經(jīng)被另外的會話鎖定時,將會發(fā)生阻塞,直到另一個會話提交或會滾。

    Select …for update

    當(dāng)一個用戶發(fā)出select…for update的錯作準(zhǔn)備對返回的結(jié)果集進(jìn)行修改時,如果結(jié)果集已經(jīng)被另一個會話鎖定,就是發(fā)生阻塞。需要等另一個會話結(jié)束之后才可繼續(xù)執(zhí)行。可以通過發(fā)出 select… for update nowait的語句來避免發(fā)生阻塞,如果資源已經(jīng)被另一個會話鎖定,則會返回以下錯誤:Ora-00054:resource busy and acquire with nowait specified.

    7.5.4.1.4 死鎖-deadlock
    定義:當(dāng)兩個用戶希望持有對方的資源時就會發(fā)生死鎖.
    即兩個用戶互相等待對方釋放資源時,oracle認(rèn)定為產(chǎn)生了死鎖,在這種情況下,將以犧牲一個用戶作為代價,另一個用戶繼續(xù)執(zhí)行,犧牲的用戶的事務(wù)將回滾.
    例子:
    1:用戶1對A表進(jìn)行Update,沒有提交。
    2:用戶2對B表進(jìn)行Update,沒有提交。
    此時雙反不存在資源共享的問題。
    3:如果用戶2此時對A表作update,則會發(fā)生阻塞,需要等到用戶一的事物結(jié)束。
    4:如果此時用戶1又對B表作update,則產(chǎn)生死鎖。此時Oracle會選擇其中一個用戶進(jìn)行會滾,使另一個用戶繼續(xù)執(zhí)行操作。
    起因:
    Oracle的死鎖問題實際上很少見,如果發(fā)生,基本上都是不正確的程序設(shè)計造成的,經(jīng)過調(diào)整后,基本上都會避免死鎖的發(fā)生。

    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 數(shù)據(jù)庫已知的 SAML 提供商的屬性。

    <saml_provider_name> 必須是一個現(xiàn)有的 SAML 提供商。只有擁有系統(tǒng)權(quán)限 USER ADMIN 的數(shù)據(jù)庫

    用戶允許修改 SAML 提供商。

    <subject_name> 以及 <issuer_distinguished_name>是 SAML 身份提供程序中證書對應(yīng)的名字。

    系統(tǒng)和監(jiān)控視圖:

    SAML_PROVIDER:顯示所有 SAML 提供商主題名和 issuer_name。

    7.6.2 ALTER USER
    語法:

    ALTER USER <user_name> <alter_user_option>

    語法元素:

    <alter_user_option> ::=PASSWORD [<user_parameter_option>]

    | <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>

    ::=<letter_or_digit>…

    <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 語句修改數(shù)據(jù)庫用戶。 <user_name>必須指定一個現(xiàn)有的數(shù)據(jù)庫用戶。

    每個用戶可以為自己執(zhí)行 ALTER USER。但并非所有<alter_user_option>可以由用戶自己指定。對于<alter_user_option>其他用戶,只有擁有系統(tǒng)權(quán)限 USER ADMIN 權(quán)限的用戶可以執(zhí)行 ALTER USER。

    使用 PASSWORD 創(chuàng)建的用戶不能修改為 EXTERNALLY,反之亦然。但他們的或者<external_identity>是可以修改的。

    你可以使用此命令更改用戶的密碼。密碼的修改必須遵循當(dāng)前數(shù)據(jù)庫定義的規(guī)則,包括最小密碼長度和定義的字符類型(大寫、小寫、數(shù)字、特殊字符)必須是密碼的一部分。用戶根據(jù)指定數(shù)據(jù)庫實例定義的策略,必須定期更換密碼,或者由首次連接到數(shù)據(jù)庫實例的用戶,自己更改密碼。

    你可以更改外部認(rèn)證。外部用戶使用外部系統(tǒng)需要進(jìn)行身份驗證,例如, Kerberos 系統(tǒng)。這些用戶沒有密碼,但是有 Kerberos 實體名稱。有關(guān)外部身份的詳細(xì)信息,請聯(lián)系您的域管理員。

    <user_parameter_option>可以用來設(shè)置、修改或者清除用戶參數(shù) CLIENT。

    <set_user_parameters>用來為數(shù)據(jù)庫中的用戶設(shè)置用戶參數(shù) CLIENT。

    當(dāng)使用報表時,該用戶參數(shù) CLIENT 可以用于限制用戶 <user_name>訪問有關(guān)特定客戶端的信息。

    <user_parameter_option>不能由用戶自己指定。

    如果在成功連接(正確的用戶/密碼組合)前,達(dá)到參數(shù) MAXIMUM_INVALID_CONNECT_ATTEMPTS(參見監(jiān)控視圖 M_PASSWORD_POLICY)定義的錯誤次數(shù),用戶將在允許重新連接前,被鎖定幾分鐘。擁有系統(tǒng)權(quán)限 USER ADMIN 的用戶或者用戶自己,可以使用命令 ALTER USER <user_name>

    RESET CONNECT ATTEMPTS 可以刪除已發(fā)生的無效連接嘗試的信息。

    擁有系統(tǒng)權(quán)限 USER ADMIN 的用戶可以使用命令 ALTER USER <user_name> DISABLE PASSWORD

    LIFETIME 排除用戶<user_name>的所有密碼生命周期檢查。這應(yīng)該只為技術(shù)用戶使用,而非正常的數(shù)據(jù)庫用戶。

    擁有系統(tǒng)權(quán)限 USER ADMIN 的用戶可以使用命令 ALTER USER <user_name> FORCE PASSWORD CHANGE 強制用戶<user_name>在下次連接后立即修改密碼,然后才可以正常工作。

    擁有系統(tǒng)權(quán)限 USER ADMIN 的用戶可以使用命令 ALTER USER <user_name> DEACTIVATE USER NOW關(guān)閉/鎖定用戶<user_name>的賬號。用戶<user_name>的賬號關(guān)閉/鎖定之后,用戶將不能連接到

    SAP HANA 數(shù)據(jù)庫。欲重新激活/解鎖用戶<user_name>,系統(tǒng)權(quán)限 USER ADMIN 用戶使用命令USER <user_name> ACTIVATE USER NOW,或者,在用戶使用 PASSWORD 身份驗證機制的情況下,使用 ALTER USER <user_name> PASSWORD 重設(shè)用戶密碼。

    擁有系統(tǒng)權(quán)限 USER ADMIN 的用戶可以使用命令 ALTER USER <user_name> ACTIVATE USER NOW 重新激活/解鎖之前已經(jīng)關(guān)閉的用戶<user_name>賬號。

    配置參數(shù):

    有關(guān)密碼的配置參數(shù),可以查看監(jiān)控視圖 M_PASSWORD_POLICY。這些參數(shù)存儲在

    indexserver.ini, 'password policy’部分中。相關(guān)的參數(shù)描述可以在 SAP HANA 安全指南,附錄,密碼策略參數(shù)中找到。

    系統(tǒng)和監(jiān)控視圖:

    USERS: 顯示所有用戶、用戶的創(chuàng)建者、創(chuàng)建時間和當(dāng)前狀態(tài)的信息。

    USER_PARAMETERS:顯示定義的 user_parameters,目前只提供 CLIENT。

    INVALID_CONNECT_ATTEMPTS:顯示每個用戶無效連接的嘗試次數(shù)。

    LAST_USED_PASSWORDS: 顯示用戶上次密碼修改日期。

    M_PASSWORD_POLICY:顯示描述密碼所允許的樣式的配置參數(shù)及其生命周期。

    例子:

    在可能使用給定的密碼連接數(shù)據(jù)庫以及已有的 SAML 提供商 OUR_PROVIDER 斷言之前,用戶名為NEW_USER 的用戶已經(jīng)創(chuàng)建完成。由于斷言將提供數(shù)據(jù)庫用戶名, <mapped_user_name>設(shè)為ANY。這由如下的語句完成:

    CREATEUSER new_user PASSWORD Password1 WITHIDENTITYANYFOR SAML PROVIDER OUR_PROVIDER;

    現(xiàn)在,該用戶將被強制修改密碼,用戶被禁止使用 SAML。

    ALTERUSER new_user FORCE PASSWORD CHANGE;

    ALTERUSER new_user DISABLE SAML;

    假設(shè)用戶已經(jīng)過于頻繁的嘗試一個錯誤的密碼,管理員將重置無效的連接嘗試數(shù)為零。

    ALTERUSER new_user RESETCONNECT ATTEMPTS;

    用戶 new_user 應(yīng)當(dāng)允許使用 KERBEROS 機制進(jìn)行身份驗證。因此,需要定義該連接的外部身份。

    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 的所有連接,因為他最近執(zhí)行的可疑操作。

    ALTERUSER new_user DEACTIVATE;

    7.6.3 CREATE ROLE
    語法:

    CREATE ROLE <role_name>

    語法元素:

    <role_name> ::=

    描述:

    CREATE ROLE 語句創(chuàng)建一個新的角色。

    只有擁有系統(tǒng)權(quán)限 ROLE ADMIN 的用戶可以創(chuàng)建新角色。

    指定的角色名稱不能與現(xiàn)有用戶或角色的名稱相同。

    角色是權(quán)限的一個命名集合,可以授予一個用戶或角色。如果你想允許多個數(shù)據(jù)庫用戶執(zhí)行相同的操作,你可以創(chuàng)建一個角色,授予該角色所需的權(quán)限,并將角色授予不同的數(shù)據(jù)庫用戶。

    每個用戶允許將權(quán)限授予一個已有的角色,但只有只有擁有系統(tǒng)權(quán)限 ROLE ADMIN 的用戶可以將角色授予角色和用戶。

    SAP HANA 數(shù)據(jù)庫提供了四種角色:

    PUBLIC:每個數(shù)據(jù)庫用戶默認(rèn)已被授予該角色。

    該角色包括只讀訪問系統(tǒng)視圖、監(jiān)控視圖和一些存儲過程的執(zhí)行權(quán)限。這些權(quán)限可以被撤銷。

    該角色可以授予過后將被撤銷的權(quán)限。

    MODELING:該角色包含使用 SAP HANA Studio 信息建模器所需的權(quán)限。

    CONTENT_ADMIN:該角色包含與 MODELING 角色相同的角色,但是使用擴(kuò)展該角色將被允許授予其他用戶這些權(quán)限。此外,它包含了與導(dǎo)入對象工作的元庫權(quán)限。

    MONITORING:該角色包含所有元數(shù)據(jù)、當(dāng)前的系統(tǒng)狀態(tài)、監(jiān)控視圖和服務(wù)器統(tǒng)計數(shù)據(jù)的只讀訪問。

    系統(tǒng)和監(jiān)控視圖:

    ROLES:顯示所有角色、它們的創(chuàng)建者和創(chuàng)建時間。

    GRANTED_ROLES:顯示每個用戶或角色被授予的角色。

    GRANTED_PRIVILEGES:顯示每個用戶或角色被授予的權(quán)限。

    例子:

    創(chuàng)建名稱為 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 數(shù)據(jù)庫已知的 SAML 提供商。 <saml_provider_name>必須與已有的 SAML 提供商不同。

    只有擁有系統(tǒng)權(quán)限 USER ADMIN 的用戶可以創(chuàng)建 SAML 提供商,每個有該權(quán)限的用戶允許刪除任何 SAML 提供商。

    需要一個現(xiàn)有的 SAML 提供商,能夠為用戶指定 SAML 連接。 <subject_distinguished_name> 和<issuer_distinguished_name>是 SAML 提供商使用的 X.509 證書的主題和發(fā)布者的 X.500 可分辨名字。這些名字的語法可以在 ISO/IEC 9594-1 中找到。

    SAML 概念的詳細(xì)細(xì)節(jié)可以在 Oasis SAML 2.0 中找到。

    系統(tǒng)和監(jiān)控視圖:

    SAML_PROVIDERS:顯示所有 SAML 提供商主題名和發(fā)布者名字。

    例子:

    創(chuàng)建一個名稱為 gm_saml_provider 的 SAML 提供商,指定主題和發(fā)布者所屬的公司。

    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 ] [IDENTIFIED EXTERNALLY AS <external_identity>] [WITH IDENTITY <provider_identity>…] [<set_user_parameters>]

    語法元素:

    <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 創(chuàng)建一個新的數(shù)據(jù)庫用戶。

    只有擁有系統(tǒng)權(quán)限 USER ADMIN 的用戶可以創(chuàng)建另一個數(shù)據(jù)庫用戶。

    指定的用戶名必須不能與已有的用戶名、角色名或集合名相同。

    SAP HANA 數(shù)據(jù)庫提供的用戶有: SYS, SYSTEM, _SYS_REPO,_SYS_STATISTICS。

    數(shù)據(jù)庫中的用戶可以通過不同的機制進(jìn)行身份驗證,內(nèi)部使用密碼的身份驗證機制和而外部則使用 Kerberos 或 SAML 等機制驗證。用戶可以同時使用不止一種方式進(jìn)行身份驗證,但在同一時間,只有一個密碼和一個外部識別有效。與之相反的是,同一時間可以有一個以上<provider_identity>為一個用戶存在。至少需指定一種驗證機制允許用戶連接和在數(shù)據(jù)庫實例上工作。

    由于兼容性原因,語法 IDENTIFIED EXTERNALLY AS <external_identity>以及<external_identity> FORKERBEROS 會繼續(xù)使用。

    密碼必須遵循當(dāng)前數(shù)據(jù)庫定義的規(guī)則。密碼的修改必須遵循當(dāng)前數(shù)據(jù)庫定義的規(guī)則,包括最小密碼長度和定義的字符類型(大寫、小寫、數(shù)字、特殊字符)必須是密碼的一部分.用戶根據(jù)指定數(shù)據(jù)庫實例定義的策略,必須定期更換密碼。在執(zhí)行 CREATE USER 命令期間提供的密碼將被視為已提供, <user_name>將會修改為大寫作為每個<simple_identifier>。

    外部用戶使用外部系統(tǒng)進(jìn)行身份驗證,例如 Kerberos 系統(tǒng)。這些用戶沒有密碼,但是有 Kerberos實體名稱。有關(guān)外部身份的詳細(xì)信息,請聯(lián)系您的域管理員。

    如果 ANY 作為映射的用戶名, SAML 斷言將包含斷言生效的數(shù)據(jù)庫用戶名。 <saml_provider_name>必須指定一個已有的 SAML 提供商。

    <set_user_parameters>可以用于為數(shù)據(jù)庫中的用戶設(shè)置用戶參數(shù) CLIENT。

    當(dāng)使用報表時,該用戶參數(shù) CLIENT 可以用于限制用戶 <user_name>訪問有關(guān)特定客戶端的信息。

    <user_parameter_option>不能由用戶自己指定。

    對于每個數(shù)據(jù)庫用戶,數(shù)據(jù)集合將以包含用戶名方式創(chuàng)建。這是不能顯式刪除。用戶刪除時,該集合也將被刪除。數(shù)據(jù)庫用戶擁有該集合,并當(dāng)他不顯式指定集合名稱時,作為自己的默認(rèn)集合使用。

    配置參數(shù):

    與密碼相關(guān)的配置參數(shù)可以在監(jiān)控視圖 M_PASSWORD_POLICY 查看。這些參數(shù)存儲 indexserver.ini的’password policy’部分中。相關(guān)的參數(shù)描述可以在 SAP HANA 安全指南,附錄,密碼策略參數(shù)中找到。

    系統(tǒng)和監(jiān)控視圖:

    USERS: 顯示所有用戶、用戶的創(chuàng)建者、創(chuàng)建時間和當(dāng)前狀態(tài)的信息。

    USER_PARAMETERS:顯示定義的 user_parameters,目前只提供 CLIENT。

    INVALID_CONNECT_ATTEMPTS:顯示每個用戶無效連接的嘗試次數(shù)。

    LAST_USED_PASSWORDS: 顯示用戶上次密碼修改日期。

    M_PASSWORD_POLICY:顯示描述密碼所允許的樣式的配置參數(shù)及其生命周期。

    SAML_PROVIDERS;顯示已有的 SAML 提供商。

    SAML_USER_MAPPING:顯示每個 SAML 提供商的映射用戶名。

    例子:

    在可能使用給定的密碼連接數(shù)據(jù)庫以及已有的 SAML 提供商 OUR_PROVIDER 斷言之前,用戶名為NEW_USER 的用戶已經(jīng)創(chuàng)建完成。由于斷言將提供數(shù)據(jù)庫用戶名, <mapped_user_name>設(shè)為ANY。 這由如下的語句完成:

    CREATEUSER new_user PASSWORD Password1 WITHIDENTITYANYFOR SAML PROVIDER OUR_PROVIDER;

    7.6.6 DROP ROLE
    語法:

    DROP ROLE <role_name>

    例子:

    DROP ROLE 語句刪除角色。 <drop_name>必須指定已經(jīng)存在的角色。

    只有擁有系統(tǒng)權(quán)限 ROLE ADMIN 的用戶可以刪除角色。任何有該權(quán)限的用戶允許刪除任意角色。

    只有 SAP HANA 提供的角色可以刪除: PUBLIC, CONTENT_ADMIN, MODELING and MONITORING。

    如果一個角色授予用戶或角色,在角色刪除時將被撤銷。撤銷角色可能會導(dǎo)致一些視圖無法訪問或者存儲過程再也不工作,如果一個視圖或存儲過程依賴于該角色中的任意權(quán)限,會發(fā)生這種情況。

    系統(tǒng)和監(jiān)控視圖:

    ROLES:顯示所有角色、它們的創(chuàng)建者和創(chuàng)建時間。

    GRANTED_ROLES:顯示每個用戶或角色被授予的角色。

    GRANTED_PRIVILEGES:顯示每個用戶或角色被授予的權(quán)限。

    例子:

    創(chuàng)建名為 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 用戶使用,則該提供商不能被刪除。

    只有擁有系統(tǒng) USER ADMIN 權(quán)限的用戶可以刪除 SAML 提供商。

    系統(tǒng)和監(jiān)控視圖:

    SAML_PROVIDERS:顯示所有 SAML 提供商主題名稱和 issuer_name。

    7.6.8 DROP USER
    語法:

    DROP USER <user_name> [<drop_option>]

    語法元素:

    <drop_option> ::= CASCADE | RESTRICT

    Default = RESTRICT

    描述:

    DROP USER 語句刪除數(shù)據(jù)庫用戶。 <user_name>必須指定一個已有的數(shù)據(jù)庫用戶。

    只有擁有系統(tǒng) USER ADMIN 權(quán)限的用戶可以刪除用戶。擁有該權(quán)限的用戶可以刪除任何用戶。 SAPHANA 數(shù)據(jù)庫提供的用戶不能刪除: SYS, SYSTEM, _SYS_REPO,_SYS_STATISTICS。

    如果顯式或隱式指定了<drop_option> RESTRICT,則當(dāng)用戶為數(shù)據(jù)集合的所有者或以及創(chuàng)建了其他集合,或者該用戶集合下存有非本人創(chuàng)建的對象時,該用戶不能被刪除。

    如果指定了<drop_option> CASCADE,包含用戶名的集合和屬于該用戶的集合,連同所有存在這些集合中的對象(即使是由其他用戶創(chuàng)建)一起刪除。用戶擁有的對象,即使為其他集合中的一部分,將被刪除。依賴于已刪除對象的對象將被刪除,即使已刪除的用戶所擁有的公共同義詞。

    已刪除對象的權(quán)限將被撤銷,授予已刪除用戶的權(quán)限也將被撤銷。撤銷權(quán)限可能會造成更多的撤銷操作,如果這些權(quán)限被進(jìn)一步授予。

    已刪除用戶創(chuàng)建的用戶和由他們創(chuàng)建的角色將不會被刪除。已刪除的用戶創(chuàng)建的審核策略也不會被刪除。

    如果用戶存在一個已打開的會話,仍然可以刪除該用戶。

    系統(tǒng)和監(jiān)控視圖:

    已刪除用戶將從以下視圖刪除:

    USERS: 顯示所有用戶、用戶的創(chuàng)建者、創(chuàng)建時間和當(dāng)前狀態(tài)的信息。

    USER_PARAMETERS:顯示定義的 user_parameters,目前只提供 CLIENT。

    INVALID_CONNECT_ATTEMPTS:顯示每個用戶無效連接的嘗試次數(shù)。

    LAST_USED_PASSWORDS: 顯示用戶上次密碼修改日期。

    M_PASSWORD_POLICY:顯示描述密碼所允許的樣式的配置參數(shù)及其生命周期。

    對象的刪除可能影響所有描述對象的系統(tǒng)視圖,例如 TABLES, VIEWS,PROCEDURES, … .

    對象的刪除可能影響描述權(quán)限的視圖:例如 GRANTED_PRIVILEGES 以及所有監(jiān)控視圖,例如M_RS_TABLES, M_TABLE_LOCATIONS, …

    例子:

    例如,使用這條語句創(chuàng)建名稱為 NEW_USERd 的用戶:

    CREATEUSER new_user PASSWORD Password1;

    已有的用戶 new_user 將被刪除,連同其所有對象一起:

    DROPUSER new_user CASCADE;

    7.6.9 GRANT
    語法:

    GRANT <system_privilege>,… TO [WITH ADMIN OPTION] | GRANT <schema_privilege>,… ON SCHEMA <schema_name> TO [WITH GRANT OPTION]| GRANT <object_privilege>,… ON <object_name> TO [WITH GRANT OPTION] | GRANT <role_name>,… TO [WITH ADMIN OPTION]| GRANT STRUCTURED PRIVILEGE <privilege_name> 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| .

    系統(tǒng)權(quán)限用來限制管理任務(wù)。定義如下的系統(tǒng)權(quán)限:

    AUDIT ADMIN

    該權(quán)限控制以下審計有關(guān)命令的執(zhí)行: CREATE AUDIT POLICY, DROP AUDIT POLICY and ALTER AUDIT POLICY.

    BACKUP ADMIN

    該權(quán)限授權(quán) ALTER SYSTEM BACKUP 命令來定義和啟動備份進(jìn)程或執(zhí)行恢復(fù)過程。

    CATALOG READ

    該權(quán)限賦予所有用戶未經(jīng)過濾的只讀訪問所有的系統(tǒng)和監(jiān)控視圖。正常情況下,這些視圖的內(nèi)容根據(jù)正在訪問用戶的權(quán)限過濾。權(quán)限 CATALOG READ 使用戶有只讀訪問所有的系統(tǒng)和監(jiān)控視圖的內(nèi)容。

    CREATE SCENARIO

    該權(quán)限控制計算場景和多維數(shù)據(jù)集(數(shù)據(jù)庫計算)的創(chuàng)建。

    CREATE SCHEMA

    該權(quán)限控制使用 CREATE SCHEMA 命令創(chuàng)建數(shù)據(jù)庫數(shù)據(jù)集合。每個用戶都有個集合。擁有該權(quán)限,用戶允許創(chuàng)建更多的集合。

    CREATE STRUCTURED PRIVILEGE

    該權(quán)限授權(quán)創(chuàng)建結(jié)構(gòu)化權(quán)限(分析權(quán)限)。注意,只有分析權(quán)限的所有者可以進(jìn)一步授予其他用戶或者角色,以及撤銷。

    DATA ADMIN

    該強大的權(quán)限授權(quán)讀取系統(tǒng)和監(jiān)控視圖中的所有數(shù)據(jù),包括在 SAP HANA 數(shù)據(jù)庫中執(zhí)行 DDL (DataDefinition Language) 以及 DDL 命令。這表示擁有該權(quán)限的用戶不能選擇或者修改存儲在其他用戶表中的數(shù)據(jù),但是可以修改表的定義或甚至刪除該表。

    EXPORT

    該權(quán)限授權(quán)通過 EXPORT TABLE 命令導(dǎo)出數(shù)據(jù)庫中的活動。注意,除了該權(quán)限,用戶仍需要將要導(dǎo)出的源表 SELECT 權(quán)限。

    IMPORT

    該權(quán)限授權(quán)通過 IMPORT TABLE 命令導(dǎo)入數(shù)據(jù)庫中的活動。注意,除了該權(quán)限,用戶仍需要將要導(dǎo)入的目標(biāo)表 SELECT 權(quán)限。

    INIFILE ADMIN

    該權(quán)限授權(quán)修改系統(tǒng)設(shè)置的不同方式。

    LICENSE ADMIN

    該權(quán)限授權(quán) SET SYSTEM LICENSE 命令安裝一個新的許可。

    LOG ADMIN

    該權(quán)限授權(quán) ALTER SYSTEM LOGGING [ON|OFF] 命令啟用或禁用 刷新日志機制。

    MONITOR ADMIN

    該權(quán)限授權(quán)關(guān)于 EVENT 的 ALTER SYSTEM 命令。

    OPTIMIZER ADMIN

    該權(quán)限授權(quán)關(guān)于 SQL PLAN CACHE 和 ALTER SYSTEM 的 ALTER SYSTEM 命令。

    UPDATE STATISTICS 命令影響查詢優(yōu)化器的行為。

    RESOURCE ADMIN

    該權(quán)限授權(quán)關(guān)于資源,例如 ALTER SYSTEM RECLAIM、 DATAVOLUME 和 ALTER SYSTEM RESET

    MONITORING VIEW 的命令,并且授權(quán) Management Console 中的許多命令。

    ROLE ADMIN

    該權(quán)限授權(quán)使用 CREATE ROLE 命令創(chuàng)建和刪除角色。同時也授權(quán)使用 GRANT 和 REVOKE 命令授予和撤銷角色。

    SAVEPOINT ADMIN

    該權(quán)限使用 ALTER SYSTEM SAVEPOINT 命令授權(quán)保存點流程的執(zhí)行。

    SCENARIO ADMIN

    該權(quán)限授權(quán)所有計算場景相關(guān)的活動,包括新建。

    SERVICE ADMIN

    該權(quán)限授權(quán) ALTER SYSTEM [START|CANCEL|RECONFIGURE] 命令,用于管理數(shù)據(jù)庫中的系統(tǒng)服務(wù)。

    SESSION ADMIN

    該權(quán)限授權(quán)會話相關(guān)的 ALTER SYSTEM 命令 ,停止或重新連接用戶會話或者修改會話參數(shù)。

    STRUCTUREDPRIVILEGE ADMIN

    該權(quán)限授權(quán)結(jié)構(gòu)化權(quán)限的創(chuàng)建、重新激活和刪除。

    TRACE ADMIN

    該權(quán)限授權(quán)數(shù)據(jù)庫追蹤文件的操作 ALTER SYSTEM [CLEAR|REMOVE] TRACES 命令。

    USER ADMIN

    該權(quán)限授權(quán)使用 CREATE USER, ALTER USER, and DROP 命令創(chuàng)建和修改用戶。

    VERSION ADMIN

    該權(quán)限授權(quán)多版本并發(fā)控制(MVCC) ALTER SYSTEM RECLAIM VERSION SPACE command 命令。

    .

    SAP HANA 數(shù)據(jù)庫組件可以創(chuàng)建自己需要的權(quán)限。這些權(quán)限使用組件名作為系統(tǒng)權(quán)限的第一標(biāo)識符,使用組件-權(quán)限-名字作為第二標(biāo)識符。目前元庫使用該特點。有關(guān)名為 REPO.的權(quán)限,請參閱元庫手冊。

    <schema_privilege> ::=CREATE ANY| DEBUG| DELETE| DROP| EXECUTE| INDEX| INSERT| SELECT| TRIGGER| UPDATE

    數(shù)據(jù)集合權(quán)限用于集合和存儲在該集合中對象的訪問和修改。集合權(quán)限的定義如下:

    CREATE ANY

    該權(quán)限允許用戶在數(shù)據(jù)庫中創(chuàng)建各種對象,尤其是表、視圖、序列、同義詞、 SQL 腳本、或者存儲過程。

    DELETE, DROP, EXECUTE, INDEX, INSERT, SELECT, UPDATE

    指定的權(quán)限被授予每個目前和以后存儲在集合中的每個對象。有關(guān)權(quán)限詳細(xì)說明,請參閱下面的描述對象權(quán)限的部分,請檢查以下權(quán)限適用于哪些類型的對象。

    <object_privilege> ::=ALL PRIVILEGES| ALTER| DEBUG| DELETE| DROP| EXECUTE| INDEX| INSERT| SELECT| TRIGGER| UPDATE| .

    對象權(quán)限用于限制用戶訪問和修改數(shù)據(jù)庫對象,例如表、 視圖、序列或者存儲過程以及諸如此類。并不是所有的這些權(quán)限適用于所有類型的數(shù)據(jù)庫對象。

    對于對象類型允許的權(quán)限,見下表。

    對象權(quán)限的定義如下:

    ALL PRIVILEGES

    該權(quán)限為所有 DDL(數(shù)據(jù)定義語言)和 DML(數(shù)據(jù)操縱語言)權(quán)限的組合。該權(quán)限一方面是授予人目前有的和允許進(jìn)一步授予的權(quán)限,另一方面,特定對象上可以被授予的權(quán)限。該組合為給定的授予人和對象進(jìn)行動態(tài)評估。 ALL PRIVILEGES 適用于表或試圖。

    ALTER

    該 DDL 權(quán)限授權(quán)對象的 ALTER 命令。

    DEBUG

    該 DML 權(quán)限授權(quán) 存儲過程或者計算視圖的調(diào)試功能。

    DELETE

    該 DML 權(quán)限授權(quán)對象的 DELETE 和 TRUNCATE 命令。

    DROP

    該 DDL 權(quán)限授權(quán)對象的 DROP 命令。

    EXECUTE

    該 DML 權(quán)限授權(quán) SQL Script 函數(shù)或者使用 CALLS 或 CALL 命令的存儲過程。

    INDEX

    該 DDL 權(quán)限授權(quán)對象索引的創(chuàng)建、修改或者刪除。

    INSERT

    該 DML 權(quán)限授權(quán)對象的 INSERT 命令。 INSERT 連同 UPDATE 權(quán)限一起允許使用對該對象的 REPLACE

    和 UPSERT 命令。

    SELECT

    該 DML 權(quán)限授予對象的 SELECT 命令或者序列的使用。

    TRIGGER

    該 DDL 權(quán)限授權(quán)指定表或者指定集合中表的 CREATE TRIGGER / DROP TRIGGER 命令。

    UPDATE

    該 DML 權(quán)限授權(quán)對象的 UPDATE 命令 INSERT 連同 UPDATE 權(quán)限一起允許使用對該對象的 REPLACE

    和 UPSERT 命令。

    .

    SAP HANA 數(shù)據(jù)庫組件可以創(chuàng)建自己需要的權(quán)限。這些權(quán)限使用組件名作為系統(tǒng)權(quán)限的第一標(biāo)識符,使用組件-權(quán)限-名字作為第二標(biāo)識符。目前元庫使用該特點。有關(guān)名為 REPO.的權(quán)限,請參閱元庫手冊。

    對視圖的 DELETE, INSERT and UPDATE 操作只適用于可更新的視圖,表示這些視圖遵守這樣的一些限制:不包含聯(lián)接、 UNION,沒有聚合以及進(jìn)一步的一些限制。

    DEBUG 只對計算視圖適用,而非其他類型的視圖。

    這些限制適用于同義詞,以及同義詞代表的對象也適用。

    <object_name> ::=<table_name>| <view_name>| <sequence_name>| <procedure_name>| <synonym_name>

    對象權(quán)限用于限制用戶訪問和修改數(shù)據(jù)庫對象,例如表、 視圖、序列、存儲過程和同義詞。

    :: =<user_name>| <role_name>

    grantee 可以是一個用戶或者角色。在權(quán)限或角色授予角色的情況下,角色授予的所有用戶,將有指定的權(quán)限或角色。

    角色是權(quán)限的一個命名集合,可以授予一個用戶或角色。

    如果你想允許多個數(shù)據(jù)庫用戶執(zhí)行相同的操作,你可以創(chuàng)建一個角色,授予該角色所需的權(quán)限,并將角色授予不同的數(shù)據(jù)庫用戶。

    當(dāng)授予角色給角色時,將建立一顆角色樹。當(dāng)將一個角色?授予另一個角色或者用戶(G) , G 將擁有所有直接授予 R 的權(quán)限和角色。

    描述:

    GRANT 用于授予權(quán)限和結(jié)構(gòu)化權(quán)限給用戶和角色,也用于授予權(quán)限給用戶和其他角色。

    指定的用戶、角色、對象和結(jié)構(gòu)化權(quán)限必須在使用 GRANT 命令前已經(jīng)存在。

    只有擁有權(quán)限并且允許進(jìn)一步授予權(quán)限的用戶才能授予權(quán)限。每個擁有 ROLE ADMIN 權(quán)限的用戶允許授予角色給其他角色和用戶。

    用戶不能授予自己權(quán)限。

    SYSTEM 用戶有至少一個系統(tǒng)權(quán)限和 PUBLIC 角色。所有其他用戶也有 PUBLIC 角色。這些權(quán)限和角色不能自己撤銷。

    雖然 SYSTEM 用戶擁有許多權(quán)限,該用戶不能選擇或者修改其他用戶的表,如果他沒有顯式地授權(quán)可以這樣做。

    SYSTEM 用戶有在自己默認(rèn)集合中創(chuàng)建對象的權(quán)限,名字和用戶本身一樣。

    對于由用戶創(chuàng)建的表,他們擁有所有權(quán)限并且可以將權(quán)限授予給用戶和角色。

    對依賴于例如基于表的視圖的其他對象,可能發(fā)生的是用戶如果沒有底層對象的權(quán)限則在依賴對象也沒有權(quán)限。或者可能發(fā)生的是用戶有權(quán)限,但是不允許進(jìn)一步授權(quán)。該用戶將不能授予這些權(quán)限。

    WITH ADMIN OPTION 和 WITH GRANT OPTION 指定了已分配的權(quán)限可以被特定的用戶進(jìn)一步分配,或者被擁有指定角色的用戶分配。

    使用 GRANT STRUCTURED PRIVILEGE <structured_privilege_name>,一個之前定義過的分析權(quán)限(基于通用結(jié)構(gòu)化權(quán)限)被分配給用戶或角色。該分析權(quán)限用于限制只讀訪問分析視圖、屬性視圖和計算視圖特定的數(shù)據(jù),通過過濾屬性值。

    系統(tǒng)和監(jiān)控視圖:

    USERS: 顯示所有用戶、用戶的創(chuàng)建者、創(chuàng)建時間和當(dāng)前狀態(tài)的信息。

    ROLES:顯示所有角色、它們的創(chuàng)建者和創(chuàng)建時間。

    GRANTED_ROLES:顯示每個用戶或角色被授予的角色。

    GRANTED_PRIVILEGES:顯示每個用戶或角色被授予的權(quán)限。

    例子:

    假設(shè)已經(jīng)創(chuàng)建了擁有創(chuàng)建集合、角色和用戶權(quán)限的用戶,他新建了數(shù)據(jù)集合:

    CREATESCHEMA myschema;

    另外,他還在該集合中新建了一張名為 work_done 的表。

    CREATETABLE myschema.work_done (t TIMESTAMP, userNVARCHAR (256), work_done VARCHAR (256);

    他創(chuàng)建了一個新的用戶 named worker,在可能使用給定的密碼和名為role_for_work_on_my_schema 的角色連接數(shù)據(jù)庫

    CREATEUSER worker PASSWORD His_Password_1;

    CREATE ROLE role_for_work_on_my_schema;

    他將其集合下所有對象的 SELECT 權(quán)限授予 role_for_work_on_my_schema 角色:

    GRANTSELECTONSCHEMA myschema TO role_for_work_on_my_schema;

    另外,用戶將表 work_done to 的 INSERT 權(quán)限授予 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 用戶被直接授予表刪除權(quán)限。該權(quán)限的選項允許進(jìn)一步授予此權(quán)限。

    GRANTDELETEON myschema.work_done TO worker;

    現(xiàn)在,用戶將創(chuàng)建任何類型對象的權(quán)限授予 worker 用戶:

    GRANTCREATEANYONSCHEMA myschema TO worker;

    結(jié)果, worker 用戶擁有集合 myschema 下所有表和視圖的 SELECT 權(quán)限,表 myschema.work_done的 INSERT 和 DELETE 權(quán)限,以及在集合 myschema 下創(chuàng)建對象的權(quán)限。另外,該用戶允許授予表myschema.work_done 的 DELETE 權(quán)限給其他用戶和角色。

    第二個例子中,用戶有相應(yīng)的權(quán)限,包括允許進(jìn)一步授予權(quán)限、將系統(tǒng)權(quán)限 INIFILE ADMIN 和TRACE ADMIN 授予已有的用戶 worker。他允許 worker 進(jìn)一步授予這些權(quán)限。

    GRANT INIFILE ADMIN, TRACE ADMIN TO worker WITH ADMIN OPTION;

    7.6.10 REVOKE
    語法:

    REVOKE <system_privilege>,… FROM || REVOKE <schema_privilege>,… ON SCHEMA <schema_name> FROM | REVOKE <object_privilege>,… ON <object_name> FROM | REVOKE <role_name>,… FROM | REVOKE STRUCTURED PRIVILEGE <privilege_name> FROM

    語法元素:

    有關(guān)語法元素的定義,參見 GRANT。

    描述:

    REVOKE 語句撤銷指定的角色或者結(jié)構(gòu)化權(quán)限或者從指定用戶或角色的指定對象中撤銷權(quán)限。

    只有擁有授權(quán)的用戶可以撤銷該權(quán)限。這對于有 ROLE ADMIN 的用戶和角色的撤銷也一樣。

    SYSTEM 用戶有至少一個系統(tǒng)權(quán)限和 PUBLIC 角色。所有其他用戶也有 PUBLIC 角色。這些權(quán)限和角色不能自己撤銷。

    如果用戶也被授予一個角色,就不可能撤銷屬于該角色的一些權(quán)限。這種情況下,必須撤銷所有角色,并且需要用戶已授予給他的權(quán)限。

    如果一個角色授予用戶或角色,在角色刪除時將被撤銷。撤銷角色可能會導(dǎo)致一些視圖無法訪問或者存儲過程再也不工作,如果一個視圖或存儲過程依賴于該角色中的任意權(quán)限,會發(fā)生這種情況。

    撤銷已用 WITH GRANT OPTION 或 WITH ADMIN OPTION 授權(quán)的權(quán)限將導(dǎo)致不僅從指定的用戶中撤銷,也將從所有該用戶直接或間接授權(quán)給用戶和角色的權(quán)限中撤銷。

    由于權(quán)限可以用個不同的用戶授給用戶或角色,用戶撤銷該權(quán)限并一定意味著,該用戶將失去這權(quán)限。有關(guān)語法元素的詳請,請參見 GRANT。

    系統(tǒng)和監(jiān)控視圖:

    USERS: 顯示所有用戶、用戶的創(chuàng)建者、創(chuàng)建時間和當(dāng)前狀態(tài)的信息。

    ROLES:顯示所有角色、它們的創(chuàng)建者和創(chuàng)建時間。

    GRANTED_ROLES:顯示每個用戶或角色被授予的角色。

    GRANTED_PRIVILEGES:顯示每個用戶或角色被授予的權(quán)限。

    例子:

    假設(shè)用戶已經(jīng)執(zhí)行如下語句:

    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;

    已授權(quán)的用戶允許撤銷這些權(quán)限。他從角色中撤銷權(quán)限,因此,暗示著從所有已授予角色的用戶撤銷權(quán)限。另外, worker 用戶將不再有 TRACE ADMIN 權(quán)限。撤銷權(quán)限將導(dǎo)致撤回操作發(fā)生至worker 用戶授予該權(quán)限的所有用戶。

    REVOKESELECTONSCHEMA myschema FROM role_for_work_on_my_schema;

    REVOKE TRACE ADMIN FROM worker;

    7.7數(shù)據(jù)導(dǎo)入導(dǎo)出語句
    7.7.1 EXPORT
    語法:

    EXPORT <object_name_list> AS <export_format> INTO [WITH <export_option_list>]

    語法元素:

    WITH <export_option_list>:

    可以使用 WITH 子句傳入 EXPORT 選項。

    <object_name_list> ::= <OBJECT_NAME>,… | ALL

    <export_import_format> ::= BINARY | CSV

    ::= ‘FULL_PATH’

    <export_option_list> ::= <export_option> | <export_option_list> <export_option>

    <export_option> ::=REPLACE |CATALOG ONLY |NO DEPENDENCIES |SCRAMBLE [BY ] |THREADS <number_of_threads>

    描述:

    EXPORT 命令以指定的格式 BINARY 或者 CSV,導(dǎo)出表、視圖、列視圖、同義詞、序列或者存儲過程。臨時表的數(shù)據(jù)和"no logging"表不能使用 EXPORT 導(dǎo)出表。

    OBJECT_NAME

    將導(dǎo)出對象的 SQL 名。欲導(dǎo)出所有集合下的所有對象,你要使用 ALL 關(guān)鍵字。如果你想導(dǎo)出指定集合下的對象,你應(yīng)該使用集合名和星號,如"SYSTEM"."*"。

    BINARY

    表數(shù)據(jù)將以內(nèi)部 BINARY 格式導(dǎo)出。使用這種方式導(dǎo)出數(shù)據(jù)比以 CSV 格式快幾個數(shù)量級。只有列式表可以以二進(jìn)制格式導(dǎo)出。行式表總是以 CSV 格式導(dǎo)出,即使指定了 BINARY 格式。

    CSV

    表數(shù)據(jù)將以 CSV 格式導(dǎo)出。導(dǎo)出的數(shù)據(jù)可以導(dǎo)入至其他數(shù)據(jù)庫中。另外,導(dǎo)出的數(shù)據(jù)順序可能被打亂。列式和行式表都可以以 CSV 格式導(dǎo)出。

    FULL_PATH

    將導(dǎo)出的服務(wù)器路徑。

    注意:當(dāng)使用分布式系統(tǒng), FULL_PATH 必須指向一個共享磁盤。由于安全性原因,路徑可能不包含符號鏈接,也可能不指向數(shù)據(jù)庫實例的文件夾內(nèi),除了’backup’ 和 'work’子文件夾。有效路徑(假設(shè)數(shù)據(jù)庫實例位于/usr/sap/HDB/HDB00)的例子:

    ‘/tmp’

    ‘/usr/sap/HDB/HDB00/backup’

    ‘/usr/sap/HDB/HDB00/work’

    REPLACE

    使用 REPLACE 選項,之前導(dǎo)出的數(shù)據(jù)將被刪除,而保存最新導(dǎo)出的數(shù)據(jù)。如果未指定 REPLACE 選項,如果在指定目錄下存在先前導(dǎo)出的數(shù)據(jù),將拋出錯誤。

    CATALOG ONLY

    使用 CATALOG ONLY 選項,只導(dǎo)出數(shù)據(jù)庫目錄,不含有數(shù)據(jù)。

    NO DEPENDENCIES

    使用 NO DEPENDENCIES 選項,將不導(dǎo)出已導(dǎo)出對象的相關(guān)對象。

    SCRAMBLE

    以 CSV 格式導(dǎo)出時,使用 SCRAMBLE [BY ‘’],可以擾亂敏感的客戶數(shù)據(jù)。當(dāng)未指定額外的數(shù)據(jù)庫,將使用默認(rèn)的擾亂密碼。只能擾亂字符串?dāng)?shù)據(jù)。導(dǎo)入數(shù)據(jù)時,擾亂數(shù)據(jù)將以亂序方式導(dǎo)入,使最終用戶無法讀取數(shù)據(jù),并且不可能回復(fù)原狀。

    THREADS

    表示用于并行導(dǎo)出的線程數(shù)。

    使用的線程數(shù)

    給定 THREADS 數(shù)目指定并行導(dǎo)出的對象數(shù),默認(rèn)為 1。增加數(shù)字可能減少導(dǎo)出時間,但也會影響系統(tǒng)性能。

    應(yīng)當(dāng)考慮如下:

    ? 對于單個表, THREADS 沒有效果。

    ? 對于視圖或者存儲過程,應(yīng)使用2 個或更多的線程(最多取決于對象數(shù))。

    ? 對于整個集合,考慮使用多余10 個線程(最多取決于系統(tǒng)內(nèi)核數(shù))。

    ? 對于整個 BW / ERP 系統(tǒng)( ALL 關(guān)鍵字)的上千張表,數(shù)量大的線程是合理的(最多 256)。

    系統(tǒng)和監(jiān)控視圖:

    你可以使用系統(tǒng)視圖 M_EXPORT_BINARY_STATUS 監(jiān)控導(dǎo)出的進(jìn)度。

    你可以在如下語句中,使用會話 ID 從相應(yīng)的視圖中終止導(dǎo)出會話。

    ALTERSYSTEM CANCEL [WORKIN] SESSION ‘sessionId’

    導(dǎo)出的詳細(xì)結(jié)果存儲在本地會話臨時表#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_option_list>:可以使用 WITH 子句傳入 IMPORT 選項。

    <object_name_list> ::= <object_name>,… | ALL

    <import_format> ::= BINARY | CSV

    ::= ‘FULL_PATH’

    <import_option_list> ::= <import_option> | <import_option_list> <import_option>

    <import_option> ::=REPLACE |CATALOG ONLY |NO DEPENDENCIES |THREADS <number_of_threads>

    描述:

    IMPORT 命令導(dǎo)入表、視圖、列視圖、同義詞、序列或者存儲過程。臨時表的數(shù)據(jù)和"no logging"表不能使用 IMPORT 導(dǎo)入。

    OBJECT_NAME

    將導(dǎo)入對象的 SQL 名。欲導(dǎo)入路徑中的所有對象,你要使用 ALL 關(guān)鍵字。如果你想將對象導(dǎo)入至指定集合下,你應(yīng)該使用集合名和星號,如"SYSTEM"."*"。

    BINARY | CSV

    導(dǎo)入過程可能忽略格式的定義,因為在導(dǎo)入過程中,將自動檢測格式。將以導(dǎo)出的同樣格式導(dǎo)入。

    FULL_PATH

    從該服務(wù)器路徑導(dǎo)入。

    注意:當(dāng)使用分布式系統(tǒng), FULL_PATH 必須指向一個共享磁盤。如果未指定 REPLACE 選項,在指定目錄下存在相同名字的表,將拋出錯誤。

    CATALOG ONLY

    使用 CATALOG ONLY 選項,只導(dǎo)入數(shù)據(jù)庫目錄,不含有數(shù)據(jù)。

    NO DEPENDENCIES

    使用 NO DEPENDENCIES 選項,將不導(dǎo)入已導(dǎo)入對象的相關(guān)對象。

    THREADS

    表示用于并行導(dǎo)入的線程數(shù)。

    使用的線程數(shù)

    給定 THREADS 數(shù)目指定并行導(dǎo)入的對象數(shù),默認(rèn)為 1。增加數(shù)字可能減少導(dǎo)入時間,但也會影響系統(tǒng)性能。

    應(yīng)當(dāng)考慮如下:

    ? 對于單個表, THREADS 沒有效果。

    ? 對于視圖或者存儲過程,應(yīng)使用2 個或更多的線程(最多取決于對象數(shù))。

    ? 對于整個集合,考慮使用多余10 個線程(最多取決于系統(tǒng)內(nèi)核數(shù))。

    ? 對于整個 BW / ERP 系統(tǒng)( ALL 關(guān)鍵字)的上千張表,數(shù)量大的線程是合理的(最多 256)。

    系統(tǒng)和監(jiān)控視圖:

    你可以使用系統(tǒng)視圖 M_IMPORT_BINARY_STATUS 監(jiān)控導(dǎo)入的進(jìn)度。

    你可以在如下語句中,使用會話 ID 從相應(yīng)的視圖中終止導(dǎo)入會話。

    ALTER SYSTEM CANCEL [WORK IN] SESSION ‘sessionId’

    導(dǎo)入的詳細(xì)結(jié)果存儲在本地會話臨時表#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 文件的數(shù)據(jù)導(dǎo)入至一個已有的表中。

    THREADS:表示可以用于并行導(dǎo)出的線程數(shù)。默認(rèn)值為 1,最大值為 256。

    BATCH:表示每個提交中可以插入的記錄數(shù)。

    THREADS 和 BATCH 可以通過啟用并行加載和一次提交多條記錄,實現(xiàn)加載的高性能。一般而言,對于列式表, 10 個并行加載線程以及 10000 條記錄的提交頻率是比較好的設(shè)置。

    TABLE LOCK:鎖住表為了更快的導(dǎo)入數(shù)據(jù)至列式表。如果指定了 NO TYPE CHECK,記錄將在插入時,不檢查每個字段的類型。

    SKIP FIRST ROW:跳過插入前 n 條記錄。

    COLUMN LIST IN FIRST ROW:表示在 CSV 文件中第一行的列。

    COLUMN LIST ( <column_name_list> ):表示將要插入的字段列表。

    RECORD DELIMITED BY ‘’:表示 CSV 文件中的記錄分隔符。

    FIELD DELIMITED BY ‘’:表示 CSV 文件中的字段分隔符。

    OPTIONALLY ENCLOSED BY ‘’:表示字段數(shù)據(jù)的可選關(guān)閉符。

    DATE FORMAT ‘’:表示字符的日期格式。如果 CSV 文件有日期類型,將為日期類型字段使用指定的格式。

    TIME FORMAT ‘’:表示字符的時間格式。如果 CSV 文件有時間類型,將為時間類型字段使用指定的格式。

    TIMESTAMP FORMAT ‘’:表示字符的時間戳格式。如果 CSV 文件有時間戳類型,將為日期類型字段使用指定的格式。

    例子:

    IMPORTFROM CSV FILE ‘/data/data.csv’INTO"MYSCHEMA"."MYTABLE"WITH RECORD DELIMITED BY’\n’ FIELD DELIMITED BY’,’

    總結(jié)

    以上是生活随笔為你收集整理的hana SQL函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。