SQL References (C~G)

CLOSE cursor_name

기능

커서를 닫는다.

구문

<close statement> ::=
    CLOSE cursor_name
    ;

구문 규칙 및 파라미터

cursor_name

커서가 open 되어 있어야 한다.
세션 내에서 DECLARE cursor_name 구문으로 선언된 커서이어야 한다.

설명

Cursor는 session 내에 존재하는 객체이고 서로 다른 session의 cursor에 영향을 주지 않는다.

사용 예

다음은 interactive SQL tool (gsql)을 사용하여 커서를 DECLARE, OPEN, FETCH, CLOSE 하는 예이다.

gSQL> DECLARE cur1 CURSOR FOR SELECT id, data FROM t1;

Cursor declared.

gSQL> OPEN cur1;

Cursor is open.

gSQL> \var v_id   INTEGER
gSQL> \var v_data VARCHAR(128)

gSQL> FETCH cur1 INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   1 data_1

1 row fetched.


gSQL> FETCH cur1 INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   2 data_2

1 row fetched.

gSQL> FETCH cur1 INTO :v_id, :v_data;

no rows fetched.

gSQL> CLOSE cur1;

Cursor closed.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

B031

Basic dynamic SQL

O

참조

관련 내용은 다음을 참조한다.

COMMENT ON name IS

기능

객체에 대한 설명을 dictionary에 저장한다.

구문

<comment statement> ::=
    COMMENT ON <comment object> IS 'comment string'
    ;

<comment object> ::=
      CLUSTER GROUP group_name
    | CLUSTER MEMBER member_name
    | DATABASE
    | PROFILE profile_name
    | AUDIT POLICY policy_name
    | AUTHORIZATION user_name
    | TABLESPACE tablespace_name
    | SCHEMA schema_name
    | TABLE [schema_name].table_name
    | COLUMN [schema_name].table_name.column_name
    | INDEX [schema_name].index_name
    | SEQUENCE [schema_name].sequence_name
    | CONSTRAINT [schema_name].constraint_name
    | PROCEDURE [schema_name].procedure_name

사용 범위 및 접근 권한

<comment statement> 구문을 수행하려면 각 객체에 대하여 다음과 같이 권한을 변경해야 한다.

구문 규칙 및 파라미터

<comment object>

설명을 저장할 대상 객체로써 다음과 같은 database 객체에 대한 comment를 저장할 수 있다.

Schema object의 경우 schema_name을 기술하지 않으면 구문을 수행하는 사용자의 Schema Path에 의해 스키마 이름이 결정된다.

COMMENT ON TABLE test_table IS 'test comment'; 
→ COMMENT ON TABLE user_default_schema.test_table IS 'test comment';

'comment string'

저장할 comment 문장을 기술한다. 
Comment를 삭제하려면 다음과 같이 empty string ('')을 사용한다.
COMMENT ON TABLE test_table IS '';

comment string의 길이는 1024 bytes를 초과할 수 없다.

설명

다음 dictionary view의 COMMENTS column으로부터 객체 유형별 정보를 확인할 수 있다.

각 view에 대한 자세한 내용은 DICTIONARY_SCHEMA를 참조한다.

사용 예

다음은 테이블에 주석을 작성하는 예이다.

gSQL> COMMENT ON TABLE t1 IS 'test comment on table t1';

Comment created.

다음은 column에 주석을 작성하는 예이다.

gSQL> COMMENT ON COLUMN t1.id IS 'test comment on column t1.id';

Comment created.

다음은 스키마에 주석을 작성하는 예이다.

gSQL> COMMENT ON SCHEMA s1 IS 'test comment on schema s1';

Comment created.

호환성

SQL 표준에는 <comment statement>가 없다.

COMMIT

기능

현재 트랜잭션을 종료하고, 변경된 모든 내용을 영속화한다.

구문

<commit statement> ::=
    COMMIT [ WORK ] 
       [ [ <commit comment clause> ] [ <commit write clause> ] |
         [ <commit force clause> ] [ <commit comment clause> ] ]
    ;

<commit comment clause> ::=
      COMMENT 'comment_string'

<commit write clause> ::=
      WRITE [ WAIT | NOWAIT ]

<commit force clause> ::=
    FORCE 'xid_string'

구문 규칙 및 파라미터

WORK

동작에 영향을 미치지 않는 예약어이다.

<commit comment clause>

<commit write clause>

Commit 연산으로 생성된 redo log가 redo log file에 기록될 때까지 기다릴지 여부를 결정한다.

<commit force clause>

분산 트랜잭션을 수동으로 commit 할 때 사용한다.

설명

COMMIT 구문은 트랜잭션 내에서 수행된 다음 구문들을 완료한다.

예외적으로, DDL 중에 OS 자원을 다루거나 DATA TYPE을 변경하는 다음 구문들은 자동으로 COMMIT 된다.

COMMIT을 수행하면 WITHOUT HOLD 옵션으로 열린 커서는 자동으로 닫힌다. 커서에 대한 자세한 내용은 다음의 커서 관련 구문을 참조한다.

트랜잭션이 지연된 (DEFERRED) 제약 조건을 위반하면 COMMIT 구문의 수행은 실패하고 트랜잭션은 ROLLBACK 된다. 지연된 제약 조건에 대한 자세한 내용은 SET CONSTRAINTS 구문의 설명을 참조한다.

사용 예

다음은 INSERT 구문을 수행한 후에 COMMIT을 수행하는 예이다.

gSQL> INSERT INTO t1 VALUES ( 1, 'anonymous' );

1 row created.

gSQL> COMMIT WORK COMMENT 'INSERT T1';

Commit complete.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

T261

Chained transactions

X

참조

관련 내용은 다음을 참조한다.

CREATE AUDIT POLICY

기능

Audit policy 객체를 생성한다. 
생성한 audit policy 객체를 활성화하려면 AUDIT POLICY 구문을 수행하여야 한다.

구문

<audit policy definition> ::= 
    CREATE AUDIT POLICY policy_name
    { <privilege_audit_clause> |  <action_audit_clause> | <privilege_audit_clause> <action_audit_clause> }
    ; 

<privilege_audit_clause> ::=
    PRIVILEGES <database_privilege> [, ...]

<action_audit_clause> ::=
    ACTIONS { <object_action_audit> | <system_action_audit> } [, ...]

<object_action_audit> ::=
      ALL ON [schema_name.]object_name
    | <object_action> ON [schema_name.]object_name

<system_action_audit> ::=
      ALL
    | DDL
    | <system_action>

사용 범위 및 접근 권한

<audit policy definition> 구문을 수행하려면 사용자에게 AUDIT SYSTEM ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

policy_name

생성할 audit policy의 이름이다.

<privilege_audit_clause>

권한 감사는 database privilege를 이용해 SQL 구문을 성공적으로 수행한 경우를 감사한다. 
특정 사용자가 database privilege를 이용해 SQL 구문을 수행하는 것을 감사할 수 있으며, database의 소유자인 SYS 사용자에 대해서는 권한 감사 기록을 남기지 않는다.

다음은 u1 사용자에게 SELECT ANY TABLE 권한을 부여하고 audit policy를 활성화하는 예이다.

CREATE AUDIT POLICY p1 
       PRIVILEGES SELECT ANY TABLE;

AUDIT POLICY p1;

사용자 u1이 다음과 같은 SQL 구문을 수행할 경우 권한 감사가 다르게 동작한다.

권한 감사에 기술할 수 있는 <database_privilege>는 다음 질의로 조회할 수 있다.

SELECT PRIVILEGE_NAME FROM V$AUDITABLE_DB_PRIVILEGES;

<action_audit_clause>

특정 객체에 대한 action과 database 전체에 대한 action을 감사한다.

<object_action_audit>

ALL ON object_name

object_name에 해당하는 객체에 대해 나열할 수 있는 모든 action을 의미한다.

각 객체 유형별로 감사할 수 있는 audit action은 다음 표와 같다.

객체별 audit action

Object type

Action

Table

ALTER, COMMENT, DELETE, GRANT, INDEX, INSERT, LOCK, RENAME, SELECT, UPDATE

View

ALTER, COMMENT, GRANT, SELECT

Sequence

ALTER, COMMENT, GRANT, SELECT

Stored function/

procedure

ALTER, COMMENT, EXECUTE, GRANT

<object_action> ON object_name

특정 object에 대한 개별 action들은 다음과 같이 ON 절을 명시하여 하나씩 나열한다.

CREATE AUDIT POLICY p1
       ACTIONS INSERT ON u1.t1
             , DELETE ON u1.t1
             , UPDATE ON u1.t1
;

EXECUTE action 유의 사항

Stored function이나 stored procedure의 EXECUTE action 성공, 실패 여부에 대한 감사는 실제 수행 시점의 수행 가능 여부만으로 판단한다.

<system_action_audit>

특정 객체와 관계없이 database에 발생하는 system action을 감사한다.

유효한 system action은 다음 질의로 조회할 수 있다.

SELECT ACTION_NAME FROM V$AUDITABLE_SYSTEM_ACTIONS;

모든 system action을 의미한다.

모든 Data Definition Language (DDL) 구문을 의미한다.

설명

Audit policy 객체는 감사할 대상들을 정의한 객체이다.  
Audit policy를 활성화하기 위해서는 AUDIT POLICY 구문을 수행해야 한다.
다수의 audit policy 를 정의하고 활성화할 수 있지만, 제한된 개수의 audit policy를 유지하는 것이 바람직하다.  
여러 개의 작은 policy 조각들을 묶어 소수의 policy group으로 만드는 것이 바람직하다.

생성한 audit policy 객체의 옵션 정보는 다음과 같이 AUDIT_POLICY_OPTIONS view를 통해 조회할 수 있다.

SELECT audit_option
     , audit_option_type
     , object_schema
     , object_name
  FROM audit_policy_options
 WHERE policy_name = 'P1'
;

AUDIT_OPTION AUDIT_OPTION_TYPE OBJECT_SCHEMA  OBJECT_NAME
------------ ----------------- -------------- ------------
DELETE         OBJECT ACTION     U1          T1
INSERT         OBJECT ACTION     U1          T1
UPDATE         OBJECT ACTION     U1          T1

Audit Record의 생성

여러 감사 조건에 부합하는 action이 발생할 경우, 한 개 이상의 audit record를 생성한다.

다음과 같이 유사한 audit option을 나열한 경우 하나의 audit record를 생성한다.

CREATE AUDIT POLICY p1
       PRIVILEGES SELECT ANY TABLE
       ACTIONS SELECT;

AUDIT POLICY p1;
SELECT * FROM other_user.t1;

다음과 같이 서로 다른 audit option을 나열한 경우 두 개의 audit record를 생성한다.

CREATE AUDIT POLICY p1
       ACTIONS SELECT ON u1.t1
             , SELECT ON u2.t2;

AUDIT POLICY p1;
SELECT COUNT(*) FROM u1.t1 A, u2.t2 B WHERE A.id = B.id;

다음과 같이 동일한 action에 대해 여러 audit policy를 활성화한 경우, 두 개의 audit record를 생성한다.

CREATE AUDIT POLICY p1
       PRIVILEGES SELECT ANY TABLE;
AUDIT POLICY p1;

CREATE AUDIT POLICY p2
       ACTIONS SELECT;
AUDIT POLICY p2;
SELECT * FROM other.t1;

사용 예

다음은 권한을 감사하는 audit policy를 정의하는 예이다.

CREATE AUDIT POLICY policy_table
       PRIVILEGES CREATE ANY TABLE
                , DROP ANY TABLE
;

다음은 객체에 대한 action을 감사하는 audit policy를 정의하는 예이다.

CREATE AUDIT POLICY policy_dml
       ACTIONS INSERT ON u1.t1
             , DELETE ON u1.t1
             , UPDATE ON u1.t1
             , ALL    ON u1.t2
;

다음은 system action을 감사하는 audit policy를 정의하는 예이다.

CREATE AUDIT POLICY policy_drop
       ACTIONS DROP TABLE, TRUNCATE TABLE
;

다음은 위의 예를 모두 합친 audit policy를 정의하는 예이다.

CREATE AUDIT POLICY policy_group
       PRIVILEGES CREATE ANY TABLE
                , DROP ANY TABLE
       ACTIONS INSERT ON u1.t1
             , DELETE ON u1.t1
             , UPDATE ON u1.t1
             , ALL    ON u1.t2
             , DROP TABLE
             , TRUNCATE TABLE
;

호환성

SQL 표준에는 audit policy가 없다.

참조

관련 내용은 다음을 참조한다.

CREATE CLUSTER GROUP

기능

Cluster system에 참여할 cluster group을 생성한다.

구문

<cluster group definition> ::=
    CREATE CLUSTER GROUP group_name 
        <cluster member definition> [, ...]
    ;

<cluster member definition> ::=
    CLUSTER MEMBER member_name <connection attribute> [<member position>]

<connection attribute> ::=
    HOST 'address' PORT port_no

<member position> ::=
    POSITION DEFAULT
  | POSITION MAX
  | POSITION number

사용 범위 및 접근 권한

Cluster system에서 수행할 수 있다.

<cluster group definition> 구문을 수행하려면 사용자에게 ADMINISTRATION ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

group_name

Cluster group의 이름이다. 
동일한 cluster group, cluster member 이름이 존재하지 않아야 한다. 
이름의 길이는 128 바이트보다 작아야 한다.

<cluster member definition>

Cluster group에 포함될 cluster member를 정의한다.
Cluster group은 cluster member를 최대 32 개까지 포함할 수 있다.
Cluster system에 최초로 생성하는 cluster group에는 cluster member를 한 개만 정의할 수 있고 자기 자신을 cluster member로 포함해야 한다.

member_name

Cluster member의 이름이다. 
Cluster member 이름은 해당 member의 database를 생성할 때 정의한 member 이름과 동일해야 한다.
동일한 cluster group, cluster member 이름이 존재하지 않아야 한다. 
이름의 길이는 128 바이트보다 작아야 한다.

Cluster member의 start-up 단계는 GLOBAL OPEN 단계여야 한다.

<connection attribute>

Cluster member간 통신을 위한 연결 정보를 정의한다. 
<connection attribute>는 해당 member의 database를 생성할 때 정의한 HOST, PORT와 동일해야 한다.
HOST와 PORT 조합은 cluster system 내에서 유일해야 한다.

<member position>

Cluster member의 position number를 지정한다.

Cluster member의 member_position 정보는 DBA_CLUSTER view를 통해 조회할 수 있다.

SELECT member_name, member_id, member_position FROM dba_cluster;

예를 들어 다음과 같은 position number가 사용되고 있는 경우,

각 옵션에 따라, 다음과 같은 값을 지정한다.

설명

<cluster group definition> 구문은 table들의 shard를 재배치하지 않는다.

추가된 cluster group에 shard를 재배치하려면 다음 구문을 수행해야 한다.

사용 예

다음은 두 개의 cluster member로 구성된 cluster group을 생성하는 예이다.

gSQL> 
CREATE CLUSTER GROUP g1
    CLUSTER MEMBER g1n1 HOST '192.168.0.11' PORT 10110
;

Cluster Group created.

gSQL>
ALTER CLUSTER GROUP g1
    ADD CLUSTER MEMBER g1n2 HOST '192.168.0.12' PORT 10120
;

Cluster Group altered.

gSQL> 
CREATE CLUSTER GROUP g2
    CLUSTER MEMBER g2n1 HOST '192.168.0.21' PORT 10210,
    CLUSTER MEMBER g2n2 HOST '192.168.0.22' PORT 10220
;

Cluster Group created.

호환성

SQL 표준에서는 cluster에 대한 개념을 정의하지 않고 있다.

참조

관련 내용은 다음을 참조한다.

CREATE CLUSTER LOCATION

기능

Cluster member의 접속 정보를 생성한다.

구문

<cluster location definition> ::=
    CREATE CLUSTER LOCATION member_name 
    <cluster connection attribute>
    ;

<cluster connection attribute> ::
       HOST 'address' PORT port_no

사용 범위 및 접근 권한

Cluster system에서 수행할 수 있다.

<cluster location definition> 구문을 수행하려면 사용자에게 ADMINISTRATION ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

member_name

Cluster member의 이름이다. 
등록된 cluster location 정보에 동일한 cluster member 이름이 존재하지 않아야 한다. 
이름의 길이는 128 바이트보다 작아야 한다.

<cluster connection attribute>

Cluster member간 통신을 위한 연결 정보를 정의한다. 
HOST와 PORT 조합은 cluster system 내에서 유일해야 한다.

설명

기본적으로 cluster location 정보는 cluster group을 생성하거나 cluster member를 추가할 때 제공되는 접속 정보를 이용하여 자동으로 생성된다. 생성된 정보는 cluster member와 group을 삭제할 때 함께 삭제된다.

만약 cluster location의 접속 정보가 변경되면 cluster member를 삭제하거나 다시 생성할 필요없이 ALTER CLUSTER LOCATION을 이용하여 접속 정보를 변경할 수 있다.

사용 예

gSQL> 
CREATE CLUSTER LOCATION g1n2
    HOST '192.168.0.12' PORT 10120,
;

Created

호환성

SQL 표준에서는 cluster에 대한 개념을 정의하지 않고 있다.

참조

관련 내용은 DROP CLUSTER LOCATION을 참조한다.

CREATE DISK DATA TABLESPACE

기능

디스크 데이터 테이블스페이스를 정의한다.

구문

<disk data tablespace statement> ::=
    CREATE DISK [ DATA ] TABLESPACE tablespace_name
        DATAFILE <disk datafile clause> [, ...]
        [ <data tablespace management clause> [, ...] ]

<disk datafile clause> ::=
     'filename' 
        [ SIZE <size clause> | REUSE | SIZE <size clause> REUSE ]
        [ <autoextend clause> ]
        [ AT <domain_name> ]

<autoextend clause>
    AUTOEXTEND { ON [ <next size clause> ] [ <max size clause> ] | OFF }

<next size clause>
    NEXT <size clause>

<max size clause>
    MAXSIZE { <size clause> | UNLIMITED }

<size clause> ::=
    integer [ K | M | G | T ]

<data tablespace management clause> ::=
      { ONLINE | OFFLINE }
    | EXTSIZE <size clause>

사용 범위 및 접근 권한

<disk data tablespace definition> 구문을 수행하려면 사용자에게 CREATE TABLESPACE ON DATABASE 권한이 있어야 한다.

구문을 수행한 사용자는 생성한 테이블스페이스에 대해 CREATE OBJECT ON TABLESPACE 권한을 갖는다.

생성한 테이블스페이스에 객체를 생성하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

tablespace_name

생성할 테이블스페이스의 이름이다.
테이블스페이스 이름의 길이는 128 바이트보다 작아야 한다.

<disk datafile clause>

<autoextend clause>

자동 확장 속성을 ON 또는 OFF로 설정한다. ON으로 설정할 경우 자동 확장 크기와 데이터파일의 최대 크기를 지정할 수 있다.

<next size clause>

현재 사용 중인 데이터 파일에 더 이상 사용할 공간이 없을 때 확장할 크기를 지정한다.

<max size clause>

데이터 파일이 확장될 수 있는 최대 크기를 지정한다.

<size clause>

파일의 바이트 크기를 명시한다. (명시하지 않을 경우 bytes 단위이다.)

<domain_name>

구문을 수행할 멤버나 그룹의 이름이다.
지정하지 않은 경우에는 모든 그룹에 수행된다.

ONLINE | OFFLINE

테이블스페이스 ONLINE/ OFFLINE 여부를 설정한다.

EXTSIZE <size clause>

테이블스페이스의 extent 크기를 지정한다.

설명

Data tablespace는 table, index (LOGGING) 등의 SQL schema 객체를 저장할 물리적 공간을 제공하는 객체이다.

사용 예

다음은 disk data tablespace를 생성하는 예이다.

gSQL> CREATE DISK TABLESPACE space1 DATAFILE 'test_file_1.dbf' SIZE 10M REUSE;

Tablespace created.

다음은 다수의 data file로 구성된 tablespace를 생성하는 예이다.

gSQL> CREATE DISK TABLESPACE space1 
             DATAFILE 'test_file_3_1.dbf' SIZE 10M REUSE,
                      'test_file_3_2.dbf' SIZE 10M REUSE;

Tablespace created.

호환성

SQL 표준에서는 테이블스페이스에 대한 개념을 다루지 않고 있다.

참조

관련 내용은 다음을 참조한다.

CREATE GLOBAL TEMPORARY TABLE

기능

새로운 global temporary table을 생성한다.

구문

<global temporary table definition> ::=
    CREATE GLOBAL TEMPORARY TABLE table_name
        ( <table element> [, ...] )
        [ <table commit action clause> ]
        [ TABLESPACE tablespace_name ]
    ;

<global temporary table definition: AS query expression> ::=
    CREATE GLOBAL TEMPORARY TABLE table_name 
        [ TABLESPACE tablespace_name ]
        AS <query expression> [ WITH [ NO ] DATA ]
    ;

<table commit action clause> ::=
    ON COMMIT { PRESERVE | DELETE } ROWS

<table element>의 정의는 <table_definition>의 정의와 동일하다. 자세한 내용은 CREATE TABLE 을 참조한다.

사용 범위 및 접근 권한

<global temporary table definition> 구문을 수행하려면 사용자가 다음 조건들을 만족해야 한다.

구문 규칙 및 파라미터

table_name

생성할 테이블의 이름이다.
자세한 내용은 table_name 구문을 참조한다.

other syntax

이 외의 구문 규칙은 CREATE TABLECREATE TABLE AS SELECT 구문의 syntax를 참조한다.

설명

GLOBAL TEMPORARY TABLE은 한 트랜잭션이나 세션이 실행되는 동안 유지될 데이터를 보관하는 용도로 사용하는 임시 테이블이다.
개발자가 응용 프로그램을 개발할 때 연산 중간 데이터를 잠시 저장하는 변수와 같은 용도로 사용된다.
Global temporary table의 특징은 다음과 같다.

Tablespace 명시 여부

Table이 생성되는 tablespace

Tablespace를 명시한다.

명시된 tablespace에 생성된다.

Tablespace를 명시하지 않는다.

현재 세션 사용자의 default temporary tablespace에 생성된다.

Table commit action

설명

ON COMMIT PRESERVE ROWS

COMMIT 되거나 ROLLBACK 되어도 테이블에 남아있는 데이터를 그대로 유지한다.

ON COMMIT DELETE ROWS(default)

COMMIT 되거나 ROLLBACK 하는 시점에 테이블에 남아있는 데이터를 모두 삭제한다 (TRUNCATE).

TEMP_UNDO_ENABLED 값

설명

TRUE

Database system의 default temporary tablespace에 undo log가 기록된다.

FALSE

Database system의 undo tablespace에 undo log가 기록된다.

사용 예

다음은 CREATE GLOBAL TEMPORARY TABLE 구문을 실행하는 예이다.

gSQL> CREATE  GLOBAL TEMPORARY TABLE SESSION_TABLE1(
        COL1    CHAR(10)
       ,COL2    VARCHAR2(20)
       ,COL3    NUMBER(10)
)   ON  COMMIT  DELETE ROWS;

Table created.

다음은 CREATE GLOBAL TEMPORARY TABLE ... AS SELECT 구문을 실행하는 예이다.

gSQL> CREATE  GLOBAL TEMPORARY TABLE SESSION_TABLE2
    ON  COMMIT  PRESERVE ROWS
    AS  SELECT  *
          FROM  EMPLOYEES;

Table created.

호환성

CREATE GLOBAL TEMPORARY TABLE 및 CREATE GLOBAL TEMPORARY TABLE AS SELECT 구문은 SQL 표준의 <table definition> 정의를 따른다. 단, 다음은 표준에서 확장된 것이다.

SQL 표준 호환성

Feature ID

설명

지원 여부

T171

LIKE clause in table definition

X

T172

AS subquery clause in table definition

O

F531

Temporary tables

X

S051

Create table of type

X

S043

Enhanced reference types

X

S081

Subtables

X

T173

Extended LIKE clause in table definition

X

T180

System-versioned tables

X

F692

Extended collation support

X

T174

Identity columns

O

T175

Generated columns

X

S071

SQL paths in function and type name resolution

X

F321

User authorization

O

T322

Extended roles

X

F762

CURRENT_CATALOG

O

F763

CURRENT_SCHEMA

O

참조

관련 내용은 다음을 참조한다.

CREATE IMMUTABLE TABLE

기능

새로운 immutable table을 생성한다.

구문

<immutable table definition> ::=
    CREATE IMMUTABLE TABLE table_name
        ( <table element> [, ...] )
        [ <table sharding strategy> ]
        [ <table attribute clause> [...] ]
        [ TABLESPACE tablespace_name ]
        [ <table global secondary index clause> ]
    ;

<immutable table definition: AS query expression> ::=
    CREATE IMMUTABLE TABLE table_name
        [ ( column_name [, ...] ) ]
        [ <table sharding strategy> ]
        [ <table attribute clause> [, ...] ]
        [ TABLESPACE tablespace_name ]
        [ <table global secondary index clause> ]
        AS <query expression> [ WITH [ NO ] DATA ]
    ;

<table element>, <table sharding strategy>, <table attribute clause>, <table global secondary index clause>의 정의는 <table_definition>의 정의와 동일하다. 자세한 내용은 CREATE TABLE을 참조한다.

사용 범위 및 접근 권한

<immutable table definition> 구문을 수행하려면 사용자가 다음 조건들을 만족해야 한다.

구문 규칙 및 파라미터

table_name

생성할 테이블의 이름이며, 스키마 내에서 고유한 이름이어야 한다.
schema_name.table_name과 같이 테이블이 소속할 스키마를 정의할 수 있는데 schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.
테이블 이름의 길이는 128 바이트보다 작아야 한다.

기타 구문 규칙

이 외의 구문 규칙은 CREATE TABLECREATE TABLE AS SELECT 구문의 syntax를 참조한다.

설명

Immutable table은 저장된 레코드의 변경 및 삭제를 불가능하게 할 뿐만 아니라 테이블 자체도 삭제하지 못하도록 하기 위한 용도로 사용된다.

사용자, 스키마, 테이블스페이스, 클러스터 그룹을 삭제할 경우 immutable table도 삭제할 수 있다.

Immutable table로 생성했을 때 허용되지 않는 SQL 구문


Immutable table로 생성했을 때 허용되는 SQL 구문

사용 예

다음은 CREATE IMMUTABLE TABLE 구문을 실행하는 예이다.

gSQL> CREATE IMMUTABLE TABLE t1
(
    id INTEGER PRIMARY KEY,
    name VARCHAR(128),
    addr VARCHAR(128)
);

Table created.

다음은 CREATE IMMUTABLE TABLE ... AS SELECT 구문을 실행하는 예이다.

gSQL> CREATE IMMUTABLE TABLE T2
       AS SELECT *
             FROM T1;

Table created.

호환성

SQL 표준에서는 CREATE IMMUTABLE TABLE 구문과 CREATE IMMUTABLE TABLE AS SELECT 구문을 다루지 않고 있다.

참조

관련 내용은 다음을 참조한다.

CREATE INDEX

기능

인덱스를 생성한다.

구문

<index definition> ::=
    CREATE [ UNIQUE ] INDEX index_name
        ON table_name ( <index column element> [, ...] )
        [ <index attributes> [...] ]
        [ TABLESPACE tablespace_name ]
    ;

<index column element> ::=
    column_name [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ]

<index attributes> ::=
      <physical attribute clause>
    | STORAGE ( <segment attr clause> [...] )
    | <parallel clause> 

<physical attribute clause> ::=
      PCTFREE integer
    | INITRANS integer
    | MAXTRANS integer

<segment attr clause> ::=
      INITIAL <size_clause>
    | NEXT <size_clause>
    | MINSIZE <size_clause>
    | MAXSIZE <size_clause>

<size clause> ::=
      integer [ K | M | G | T ]

<parallel clause> ::=
      NOPARALLEL
    | PARALLEL [ integer ]

사용 범위 및 접근 권한

<index definition> 구문을 수행하려면 사용자가 다음 조건들을 만족해야 한다.

Cluster에서 unique index는 모든 sharding key를 포함해야 한다.

구문 규칙 및 파라미터

UNIQUE

인덱스를 구성하는 column들에 중복 값을 허용하지 않는다.

index_name

생성할 인덱스의 이름이며, 스키마 내에서 유일해야 한다.
스키마 이름을 생략할 경우, 참조하는 테이블이 속한 스키마에 인덱스가 생성된다.
인덱스 이름의 길이는 128 바이트보다 작아야 한다.

table_name

인덱스를 생성할 테이블의 이름이다.
schema_name.table_name과 같이 테이블이 소속한 스키마를 정의할 수 있는데 schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.

column_name

인덱스 key로 사용할 column의 이름이다.
하나 이상의 column을 정의해야 하는데 최대 32 개의 column을 인덱스 key로 사용할 수 있다.

구현 내용에 따라 다음과 같은 제약이 발생할 수 있다.

ASC | DESC

Column의 정렬 순서를 명시한다.

NULLS FIRST | NULLS LAST

NULL 값의 정렬 순서를 명시한다.

<physical attribute clause>

인덱스의 물리적 속성 정보를 정의한다.

<segment attr clause>

인덱스가 저장될 공간에 대한 정보를 기술한다.

<size clause>

파일의 바이트 크기를 명시한다. (단위를 기술하지 않을 경우 bytes이다.)

NOPARALLEL | PARALLEL [ integer ]

인덱스 구축과정에서 사용될 thread 개수를 지정한다.

TABLESPACE tablespace_name

인덱스가 저장될 tablespace의 이름을 지정한다.

설명

LOGGING 인덱스와 NOLOGGING 인덱스에는 다음과 같은 trade-off가 있다.

사용 예

다음은 unique index를 생성하는 예이다.

gSQL> CREATE UNIQUE INDEX idx_t1_id ON t1( id );

Index created.

다음은 다수의 column에 대해 인덱스를 생성하는 예이다.

gSQL> CREATE INDEX idx_t1_id_name ON t1( id, name );

Index created.

다음은 인덱스 column의 정렬 순서를 지정하는 예이다.

gSQL> CREATE INDEX idx_t1_dept_id ON t1( dept_id DESC );

Index created.

다음은 인덱스 column의 NULL 값 정렬 순서를 지정하는 예이다.

gSQL> CREATE INDEX idx_t1_name ON t1( name NULLS FIRST );

Index created.

다음은 인덱스가 저장될 공간에 대한 정보를 설정하는 예이다.

gSQL> CREATE INDEX idx_t1_id ON t1( id )
             STORAGE ( INITIAL 10M NEXT 1M MINSIZE 10M MAXSIZE 100M );

Index created.

다음은 인덱스에 대해 리두 로깅을 생성하도록 하는 예이다.

gSQL> CREATE INDEX idx_t1_id ON t1( id );

Index created.

다음은 인덱스를 병렬로 생성하도록 하는 예이다.

gSQL> CREATE INDEX idx_t1_name ON t1( name ) PARALLEL;

Index created.

다음은 인덱스를 생성할 때 테이블스페이스를 지정하는 예이다.

gSQL> CREATE INDEX idx_t1_name ON t1( name ) TABLESPACE mem_temp_tbs;

Index created.

호환성

SQL 표준에서는 인덱스에 대한 개념을 다루지 않고 있다.

참조

관련 내용은 DROP INDEX를 참조한다.

CREATE MEMORY DATA TABLESPACE

기능

메모리 데이터의 테이블스페이스를 정의한다.

구문

<memory data tablespace statement> ::=
    CREATE [ MEMORY ] [ DATA ] TABLESPACE tablespace_name
        DATAFILE <memory datafile clause> [, ...]
        [ <data tablespace management clause> [, ...] ]

<memory datafile clause> ::=
     'filename' 
        [ SIZE <size clause> | REUSE | SIZE <size clause> REUSE ]
        [ AT <domain_name> ]
<size clause> ::=
    integer [ K | M | G | T ]

<data tablespace management clause> ::=
      { ONLINE | OFFLINE }
    | EXTSIZE <size clause>

사용 범위 및 접근 권한

<memory data tablespace definition> 구문을 수행하려면 사용자에게 CREATE TABLESPACE ON DATABASE 권한이 있어야 한다.

구문을 수행한 사용자는 생성한 테이블스페이스에 대해 CREATE OBJECT ON TABLESPACE 권한을 갖는다.

생성한 테이블스페이스에 객체를 생성하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

[ MEMORY ] [ DATA ]

테이블, 인덱스 등 영구적인 객체를 저장할 메모리 테이블스페이스이다.
MEMORY와 DATA 예약어는 생략할 수 있다.

tablespace_name

생성할 테이블스페이스의 이름이다.
테이블스페이스 이름의 길이는 128 바이트보다 작아야 한다.

<memory datafile clause>

<size clause>

파일의 바이트 크기를 명시한다. (단위를 기술하지 않을 경우 bytes이다.)

<domain_name>

구문을 수행할 멤버나 그룹의 이름이다.
지정하지 않은 경우에는 모든 그룹에 수행된다.

ONLINE | OFFLINE

테이블스페이스 ONLINE/ OFFLINE 여부를 설정한다.

EXTSIZE <size clause>

테이블스페이스의 extent 크기를 지정한다.

설명

Data tablespace는 table, index (LOGGING) 등의 SQL schema 객체를 저장할 물리적 공간을 제공하는 객체이다.

사용 예

다음은 memory data tablespace를 생성하는 예이다.

gSQL> CREATE TABLESPACE space1 DATAFILE 'test_file_1.dbf' SIZE 10M REUSE;

Tablespace created.

다음은 다수의 data file로 구성된 tablespace를 생성하는 예이다.

gSQL> CREATE TABLESPACE space1 
             DATAFILE 'test_file_3_1.dbf' SIZE 10M REUSE,
                      'test_file_3_2.dbf' SIZE 10M REUSE;

Tablespace created.

호환성

SQL 표준은 테이블스페이스에 대한 개념을 다루지 않고 있다.

참조

관련 내용은 다음을 참조한다.

CREATE MEMORY TEMPORARY TABLESPACE

기능

메모리 임시 테이블스페이스를 정의한다.

구문

<memory temporary tablespace statement> ::=
    CREATE [ MEMORY ] TEMPORARY TABLESPACE tablespace_name
        MEMORY <memory clause> [, ...]
        <temporary tablespace management clause>

<memory clause> 
     'memory_name' { SIZE <size clause> } [ AT <domain_name> ]

<temporary tablespace management clause> ::=
    EXTSIZE <size clause>

사용 범위 및 접근 권한

<memory temporary tablespace definition> 구문을 수행하려면 사용자에게 CREATE TABLESPACE ON DATABASE 권한이 있어야 한다.

구문을 수행한 사용자는 생성한 테이블스페이스에 대해 CREATE OBJECT ON TABLESPACE 권한을 갖는다.

생성한 테이블스페이스에 객체를 생성하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

[ MEMORY ] TEMPORARY

질의 처리 과정에서 생성되는 중간 결과 등의 임시 객체나 no logging 인덱스를 저장할 메모리 임시 테이블스페이스이다.
MEMORY 예약어는 생략할 수 있다.

tablespace_name

생성할 테이블스페이스의 이름이다.
테이블스페이스 이름의 길이는 128 바이트보다 작아야 한다.

<memory clause>

<size clause>

공유 메모리 공간의 바이트 크기를 명시한다. (단위를 기술하지 않을 경우 bytes이다.)
임시 메모리 데이터의 경우 이미지를 파일로 관리하지 않는다.

<domain_name>

구문을 수행할 멤버나 그룹의 이름이다.
지정하지 않은 경우에는 모든 그룹에 수행된다.

EXTSIZE <size clause>

테이블스페이스의 extent 크기를 지정한다.

설명

Temporary tablespace는 index (NOLOGGING) 등의 SQL schema 객체와, 질의를 처리할 때 sorting/ hashing 하기 위한 중간 결과를 저장하는 물리적 공간을 제공하는 객체이다.

사용 예

다음은 temporary tablespace를 생성하는 예이다.

gSQL> CREATE TEMPORARY TABLESPACE temp_space1 MEMORY 'test_memory_1' SIZE 10M;

Tablespace created.

다음은 다수의 메모리 공간을 갖는 temporary tablespace를 생성하는 예이다.

gSQL> CREATE TEMPORARY TABLESPACE temp_space1 
             MEMORY 'test_memory_3_1' SIZE 10M,
                    'test_memory_3_2' SIZE 10M;

Tablespace created.

호환성

SQL 표준은 테이블스페이스에 대한 개념을 다루지 않고 있다.

참조

관련 내용은 다음을 참조한다.

CREATE PROFILE

기능

Profile을 생성하는 구문으로써 password 관리 방법을 설정할 수 있다. 
User에게 profile을 할당하면 profile에 정의된 방법으로 user의 password를 관리한다.

구문

<profile definition> ::=

    CREATE PROFILE profile_name LIMIT 
    { <password_parameters>, ...}
    ; 

<password parameters> ::= 
      FAILED_LOGIN_ATTEMPTS { integer | UNLIMITED | DEFAULT }
    | PASSWORD_LOCK_TIME  { password_parameter_number_interval | UNLIMITED | DEFAULT }
    | PASSWORD_LIFE_TIME  { password_parameter_number_interval | UNLIMITED | DEFAULT }
    | PASSWORD_GRACE_TIME { password_parameter_number_interval | UNLIMITED | DEFAULT }
    | PASSWORD_REUSE_MAX  { integer | UNLIMITED | DEFAULT }
    | PASSWORD_REUSE_TIME { password_parameter_number_interval | UNLIMITED | DEFAULT }
    | PASSWORD_VERIFY_FUNCTION { <verify_policy> | NULL | DEFAULT }

<verify_policy> ::= 
      KISA_VERIFY_FUNCTION
    | ORA12C_VERIFY_FUNCTION
    | ORA12C_STRONG_VERIFY_FUNCTION
    | VERIFY_FUNCTION_11G 
    | VERIFY_FUNCTION

<password_parameter_number_interval> ::=
   integer 
 | integer / integer

사용 범위 및 접근 권한

<profile definition> 구문을 수행하려면 사용자에게 CREATE PROFILE ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

profile_name

생성할 profile의 이름을 명시한다.

password_parameters

비밀번호 관리를 위한 parameter들을 설정한다.

생략한 parameter는 "DEFAULT" profile의 정책을 따른다.

FAILED_LOGIN_ATTEMPTS

연속적인 로그인 실패 가능 횟수를 설정한다. 
명시된 횟수를 넘어서면 계정이 잠긴다.

PASSWORD_LOCK_TIME

연속적인 login 실패 후 계정이 잠기는 기간 (day)을 설정한다.

PASSWORD_LIFE_TIME

비밀번호의 유효 기간 (day)을 설정한다.

PASSWORD_GRACE_TIME

PASSWORD_LIFE_TIME 이후에 login 했을 때 비밀번호 만료를 유예하는 기간을 설정한다.

비밀번호 유효기간이 지난 후 처음으로 login 하려고 시도할 때부터 PASSWORD_GRACE_TIME이 시작되고, 이 기간동안 비밀번호를 변경하지 않으면 비밀번호가 만료된다.

PASSWORD_REUSE_MAX

이전 비밀번호를 재사용하려 할 때 재사용할 수 없는 최근 비밀번호 개수를 설정한다.

PASSWORD_REUSE_MAX는 PASSWORD_REUSE_TIME과 함께 사용해야 한다.

PASSWORD_REUSE_TIME

이전 비밀번호를 재사용하려 할 때, 해당 비밀번호를 재사용할 수 없는 기간을 설정한다.

PASSWORD_REUSE_TIME은 PASSWORD_REUSE_MAX와 함께 사용해야 한다.

PASSWORD_VERIFY_FUNCTION

비밀번호 복잡도 검증 방법을 설정한다.

KISA_VERIFY_FUNCTION

Korea Internet & Security Agency (KISA)의 비밀번호 검증 방법이다.

ORA12C_VERIFY_FUNCTION

Oracle의 ORA12C_VERIFY_FUNCTION 비밀번호 검증 방법이다.

ORA12C_STRONG_VERIFY_FUNCTION

Oracle의 ORA12C_STRONG_VERIFY_FUNCTION 비밀번호 검증 방법이다.

VERIFY_FUNCTION_11G

Oracle의 VERIFY_FUNCTION_11G 비밀번호 검증 방법이다.

VERIFY_FUNCTION

Oracle의 VERIFY_FUNCTION 비밀번호 검증 방법이다.

설명

계정 잠금

계정 잠금에 영향을 주는 parameter는 다음과 같다.

예를 들어 다음과 같은 profile과 user를 생성할 경우

CREATE PROFILE prof LIMIT
    FAILED_LOGIN_ATTEMPTS 4
    PASSWORD_LOCK_TIME 30;

ALTER USER u1 PROFILE prof;
u1 사용자의 login 실패횟수가 네 번을 초과할 경우 30일 동안 계정이 잠긴다. 
그리고 30일이 지나면 계정 잠금이 해제된다.

PASSWORD_LOCK_TIME이 UNLIMITED면, ALTER USER 구문을 사용하여 계정을 명시적으로 잠금 해제해주어야 한다.

ALTER USER user1 ACCOUNT UNLOCK;

비밀번호 만료

비밀번호 만료에 영향을 주는 parameter는 다음과 같다.

비밀번호는 다음과 같은 순서로 만료된다.

  1. 비밀번호 설정

    • 비밀번호가 변경된 순간부터 PASSWORD_LIFE_TIME만큼 경과된 기간이 비밀번호 만료 시점으로 설정된다.

    • 비밀번호가 만료된 상태는 OPEN이며, 정상적으로 login 할 수 있다.

  1. 만료 시점 이후에 login할 경우

    • Login에는 성공하지만 비밀번호의 만료 상태가 EXPIRED (GRACE)가 되며 다음과 같은 warning이 발생한다.

      • ERR-28000(16310): The password will expire in n days

      • ERR-28000(16311): The password will expire soon

      • SQL 표준에서는 password expire 개념을 다루지 않고 있다.

      • 28000은 authentication warning 또는 error의 SQL 표준 상태코드이며, (16310, 16311)은 GOLDILOCKS error code이다.

    • Login한 순간부터 PASSWORD_GRACE_TIME만큼 경과된 기간이 비밀번호의 만료 시점으로 재설정된다.

  1. 유예기간 이후에 login할 경우

    • 비밀번호 만료 상태가 EXPIRED 되어 login 할 수 없으며 다음과 같은 error가 발생한다.

      • ERR-28000(16312): The password has expired

      • SQL 표준에서는 password expire 개념을 다루지 않고 있다.

      • 28000은 authentication warning 또는 error의 SQL 표준 상태코드이며, (16312)는 GOLDILOCKS error code이다.

      • Program을 사용하여 password 재입력을 제어하려면 16312 값의 GOLDILOCKS internal error code를 사용해야 한다.

비밀번호 만료 상태 전이

단계

시점

Login 성공 여부

계정 상태

1

비밀번호 변경

Success

OPEN

2

PASSWORD_LIFE_TIME 경과

Success with warning

EXPIRED(GRACE)

3

PASSWORD_GRACE_TIME 경과

Error

EXPIRED

다음 예제를 참조한다.

CREATE PROFILE prof LIMIT
   PASSWORD_LIFE_TIME 90
   PASSWORD_GRACE_TIME 3;

ALTER USER u1 PROFILE prof;

위 예에서 사용자 u1은 90일이 지난 후 login에 성공하지만 3일 안에 비밀번호가 만료된다는 경고 메시지를 받는다.

3일 안에 비밀번호를 변경하지 않으면 비밀번호는 만료된다.
비밀번호가 만료되면, login 할 때 새로운 비밀번호를 입력하라는 메시지를 받고 계정 접근이 거부된다.

비밀번호 재사용 가능 여부

비밀번호 재사용 가능 여부에 영향을 주는 parameter는 다음과 같다.

두 parameter의 비밀번호 재사용 가능 여부는 다음 표와 같다.

비밀번호 재사용 가능 조건

PASSWORD_REUSE_MAX

PASSWORD_REUSE_TIME

재사용 가능 조건

value

value

PASSWORD_REUSE_TIME과 PASSWORD_REUSE_MAX 조건을 만족해야 한다.

value

UNLIMITED

항상 불가

UNLIMITED

value

항상 불가

UNLIMITED

UNLIMITED

항상 가능

다음과 같은 profile을 생성한 경우

CREATE PROFILE prof LIMIT
   PASSWORD_REUSE_MAX 5
   PASSWORD_REUSE_TIME 3;

최근 다섯 개 비밀번호와 최근 3일 이내에 변경한 비밀번호는 재사용할 수 없다.

사용자 u1의 비밀번호 변경 이력이 다음과 같을 경우 현재 비밀번호가 P#_000007이고, 현재 날짜가 2015-08-08 이면 기존 비밀번호의 재사용 가능 여부는 다음과 같다.

재사용 가능 여부 예

password

password_date

재사용 가능 여부

P#_000001

2015-08-01

가능

P#_000002

2015-08-02

가능

P#_000003

2015-08-03

REUSE_MAX 위배

P#_000004

2015-08-04

REUSE_MAX 위배

P#_000005

2015-08-05

REUSE_MAX, REUSE_TIME 위배

P#_000006

2015-08-06

REUSE_MAX, REUSE_TIME 위배

P#_000007

2015-08-07

REUSE_MAX, REUSE_TIME 위배

비밀번호 재사용 가능 여부를 검사하기 위해 누적된 비밀번호 변경 이력은 다음 구문을 사용하여 삭제할 수 있다.

ALTER DATABASE CLEAR PASSWORD HISTORY;

DEFAULT profile

Database를 생성할 때 다음과 같은 "DEFAULT" profile을 자동으로 생성한다. 생성하는 "DEFAULT" profile 의 password parameter 정보는 다음과 같다.

DEFAULT profile의 구성

Parameter

Value

FAILED_LOGIN_ATTEMPTS

10

PASSWORD_LOCK_TIME

1

PASSWORD_LIFE_TIME

180

PASSWORD_GRACE_TIME

7

PASSWORD_REUSE_MAX

UNLIMITED

PASSWORD_REUSE_TIME

UNLIMITED

PASSWORD_VERIFY_FUNCTION

NULL

"DEFAULT" profile의 기본값들은 다음과 같은 특성을 갖는다.

DEFAULT profile은 삭제할 수 없고 다음 구문으로 변경은 가능하다.

ALTER PROFILE DEFAULT LIMIT ...

사용 예

다음은 계정 잠금을 제어하는 profile을 생성하는 예이다. 세 번 연속 login에 실패할 경우 3 일동안 계정을 잠근다.

gSQL> CREATE PROFILE prof1 LIMIT
        FAILED_LOGIN_ATTEMPTS 3
        PASSWORD_LOCK_TIME 3;

Profile created.

gSQL> COMMIT;

Commit complete.

다음은 비밀번호 만료를 제어하는 profile을 생성하는 예이다. 비밀번호의 유효기간은 90 일이며 7 일간의 유예기간을 갖는다.

gSQL> CREATE PROFILE prof1 LIMIT
        PASSWORD_LIFE_TIME 90 
        PASSWORD_GRACE_TIME 7;

Profile created.

gSQL> COMMIT;

Commit complete.

다음은 비밀번호 재사용 여부를 제어하는 profile을 생성하는 예이다. 다음 예에서는 비밀번호를 변경할 때 이전 비밀번호를 검사하지 않는다.

gSQL> CREATE PROFILE prof1 LIMIT
        PASSWORD_REUSE_MAX  DEFAULT
        PASSWORD_REUSE_TIME DEFAULT;

Profile created.

gSQL> COMMIT;

Commit complete.

다음은 비밀번호 복잡도 검사를 제어하는 profile을 생성하는 예이다.

gSQL> CREATE PROFILE prof1 LIMIT
        PASSWORD_VERIFY_FUNCTION KISA_VERIFY_FUNCTION;

Profile created.

gSQL> COMMIT;

Commit complete.

다음은 모든 parameter를 설정하여 profile을 생성하는 예이다.

gSQL> CREATE PROFILE prof1 LIMIT
        FAILED_LOGIN_ATTEMPTS 3
        PASSWORD_LOCK_TIME 3
        PASSWORD_LIFE_TIME 90 
        PASSWORD_GRACE_TIME 7
        PASSWORD_REUSE_MAX  DEFAULT
        PASSWORD_REUSE_TIME DEFAULT
        PASSWORD_VERIFY_FUNCTION KISA_VERIFY_FUNCTION;

Profile created.

gSQL> COMMIT;

Commit complete.

호환성

SQL 표준은 profile에 대한 개념을 다루지 않고 있다.

참조

관련 내용은 다음을 참조한다.

CREATE SCHEMA

기능

스키마를 정의한다.

구문

<schema definition> ::=
    CREATE SCHEMA <schema name clause>
        [ <schema element> [...] ]
    ;

<schema name clause> ::=
      schema_name
    | AUTHORIZATION user_identifier
    | schema_name AUTHORIZATION user_identifier

<schema element> ::=
      <table definition>
    | <view definition>
    | <index definition>
    | <sequence generator definition>
    | <grant privilege statement>
    | <comment statement>

사용 범위 및 접근 권한

<schema definition> 구문을 수행하려면 사용자가 다음 조건들을 만족해야 한다.

구문 규칙 및 파라미터

schema_name

생성할 스키마의 이름이다.
Database 내에 동일한 스키마 이름이 존재하지 않아야 한다.
스키마 이름의 길이는 128 바이트보다 작아야 한다.

AUTHORIZATION user_identifier

스키마 이름을 생략할 경우, user_identifier와 동일한 이름의 스키마를 생성한다. 
AUTHORIZATION을 지정하지 않을 경우, 구문을 수행한 사용자의 user_identifier가 사용된다.

schema_name AUTHORIZATION user_identifier

생성할 스키마 이름과 스키마의 소유자를 지정한다. 
소유자는 role이나 PUBLIC이 될 수 없다.

<schema element>

스키마를 생성할 때 스키마 내에 함께 생성할 객체를 정의한다. 
schema_element는 나열된 순서대로 실행되며, comma (,) 없이 공백으로만 구분한다. 
생성하는 스키마와 이름이 다른 스키마에는 객체를 정의할 수 없다.

설명

스키마는 table, view, index, sequence, constraint와 같은 SQL schema 객체들을 논리적으로 분류하는 객체이다.

GOLDILOCKS에서 user와 schema의 관계는 1 : N 이다. 즉, user가 소유한 schema가 존재하지 않거나 user가 다수의 schema를 소유할 수 있다.

SQL 표준에서는 user, schema, database와 같은 non-schema 객체들의 관계를 명확히 정의하고 있지 않으며, 각 DBMS들은 다음과 같이 non-schema 객체간의 관계를 상이하게 정의하고 있다.

DBMS에서 user와 schema의 관계





사용 예

다음은 schema를 생성하는 예이다.

gSQL> CREATE SCHEMA s1;

Schema created.

다음은 schema를 생성하고 schema의 소유자를 지정하는 예이다.

gSQL> CREATE SCHEMA s1 AUTHORIZATION test;

Schema created.

다음은 schema와 schema에 속한 객체들을 함께 생성하는 예이다.

gSQL> CREATE SCHEMA s1 
             CREATE TABLE t1 ( id INTEGER, name VARCHAR(128) )
             CREATE INDEX idx_t1_id ON t1 ( id )
             COMMENT ON TABLE t1 IS 'comment on s1.t1'
;

Schema created.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

S071

SQL paths in function and type name resolution

X

F461

Named character sets

X

F171

Multiple schemas per user

O

T332

Extended roles

X

참조

관련 내용은 다음을 참조한다.

CREATE SEQUENCE

기능

시퀀스를 생성한다.

구문

<sequence generator definition> ::=
    CREATE SEQUENCE [schema_name.] sequence_name 
        [ <sequence generator option> [, ...] ]
    ;

<sequence generator option> ::=
      <sequence generator start with option> 
    | <basic sequence generator option>

<sequence generator start with option> ::=
    START WITH integer

<basic sequence generator option> ::=
      <sequence generator increment by option>
    | <sequence generator maxvalue option>
    | <sequence generator minvalue option>
    | <sequence generator cycle option>
    | <sequence generator cache option>

<sequence generator increment by option> ::=
    INCREMENT BY integer

<sequence generator maxvalue option> ::=
      MAXVALUE integer
    | (NO MAXVALUE | NOMAXVALUE)

<sequence generator minvalue option> ::=
      MINVALUE integer
    | (NO MINVALUE | NOMINVALUE)

<sequence generator cycle option> ::=
      CYCLE 
    | (NO CYCLE | NOCYCLE)

<sequence generator cache option> ::=
      CACHE integer
    | (NO CACHE | NOCACHE)

사용 범위 및 접근 권한

<sequence generator definition> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.
• 시퀀스가 속한 스키마에 대해 (CREATE SEQUENCE 또는 CONTROL SCHEMA) ON SCHEMA 
• CREATE ANY SEQUENCE ON DATABASE
시퀀스의 소유자는 다음과 같이 결정된다. 
• 시퀀스가 속한 스키마의 소유자 
• 시퀀스가 속한 스키마가 PUBLIC 인 경우, 구문을 수행한 사용자

시퀀스 소유자는 USAGE ON SEQUENCE WITH GRANT OPTION 권한을 갖는다.

생성한 시퀀스를 사용하려면 사용자에게 다음 권한 중 하나가 있어야 한다.
• 해당 시퀀스에 대해 USAGE ON SEQUENCE 
• 시퀀스가 속한 스키마에 대해 (USAGE SEQUENCE 또는 CONTROL SCHEMA) ON SCHEMA 
• USAGE ANY SEQUENCE ON DATABASE

구문 규칙 및 파라미터

sequence_name

생성할 시퀀스의 이름이며 스키마 내에서 유일한 이름이어야 한다.
schema_name.sequence_name과 같이 시퀀스가 속할 스키마를 정의할 수 있는데 schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.
시퀀스 이름의 길이는 128 바이트보다 작아야 한다.

<sequence generator option>

<sequence generator option>을 사용하지 않을 경우 다음 두 문장은 같은 의미를 갖는다.

<sequence generator start with option>

첫 번째로 생성할 시퀀스 번호를 정의한다. 
오름차순인지 내림차순인지에 따라 다음과 같은 특징을 갖는다.

<sequence generator increment by option>

시퀀스 번호의 간격을 정의한다. 
다음과 같은 제약 및 특징을 갖는다.

<sequence generator maxvalue option>

시퀀스로 생성할 수 있는 최대값을 정의한다.

<sequence generator minvalue option>

시퀀스로 생성할 수 있는 최소값을 정의한다.

<sequence generator cycle option>

시퀀스의 값이 최대값 또는 최소값이 되었을 때, 계속 값을 생성할지 여부를 명시한다.

<sequence generator cache option>

시퀀스에 빠르게 접근하기 위해 메모리상에 미리 적재할 시퀀스 값의 개수를 정의한다. 
Database를 재구동할 때 메모리상에 적재한 시퀀스 값은 유실되며 적재한 이후의 값부터 시작된다.

설명

생성한 시퀀스 객체의 시퀀스 값은 NEXTVAL 함수와 CURRVAL 함수를 이용하여 사용할 수 있다.

시퀀스 값은 트랜잭션 속성을 가지지 않으며, 시퀀스 함수를 사용한 SQL 구문에서 에러가 발생하거나 명시적인 ROLLBACK을 수행하더라도 시퀀스 값은 가장 최신 값을 유지한다.

CURRVAL 함수의 경우, session에서 가장 최근에 호출한 NEXTVAL 값을 반환한다. 
이러한 특성을 이용하면 NEXTVAL을 이용하여 한 번 얻은 시퀀스 값을 다른 SQL 문장에 계속 사용할 수 있다.  단, session에서 NEXTVAL을 호출하지 않은 경우에 CURRVAL를 사용하면 에러가 발생한다.

사용 예

다음과 같이 시퀀스 옵션을 정의하지 않은 seq1 객체는 seq2 객체와 동일한 의미의 오름차순 시퀀스이다.

gSQL> CREATE SEQUENCE seq1;

Sequence created.


gSQL> CREATE SEQUENCE seq2 START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE NO CYCLE CACHE 20;

Sequence created.

다음은 홀수값을 생성하는 시퀀스이다.

gSQL> CREATE SEQUENCE seq1 START WITH 1 INCREMENT BY 2;

Sequence created.

다음은 0 부터 시작하여 1000 까지 반복적으로 짝수를 생성하는 시퀀스를 생성하는 예이다.

gSQL> CREATE SEQUENCE seq1 START WITH 0 MINVALUE 0 MAXVALUE 1000 INCREMENT BY 2 CYCLE;

Sequence created.

다음은 -1 부터 시작하는 내림차순 시퀀스를 생성하는 예이다.

gSQL> CREATE SEQUENCE seq1 INCREMENT BY -1;

Sequence created.

호환성

SQL 표준에서는 <sequence generator cache option> 절을 정의하지 않고 있다.

SQL 표준 호환성

Feature ID

설명

지원 여부

T176

Sequence generator support

O

참조

관련 내용은 다음을 참조한다.

CREATE SYNONYM

기능

Synonym을 생성한다. Synonym은 테이블, view, 시퀀스, 또다른 synonym의 대체 이름으로써 이들 대신 다음 구문에서 사용될 수 있다.

구문

<table definition> ::=    
    CREATE [OR REPLACE] [PUBLIC] SYNONYM [schema_name.]synonym_name 
    FOR [schema_name.]object_name
    ;

사용 범위 및 접근 권한

<synonym definition> 구문을 수행하려면 사용자가 다음 조건들을 만족해야 한다.

구문 규칙 및 파라미터

[ OR REPLACE ]

이미 synonym이 존재할 경우, 기존의 synonym을 대체한다.

[ PUBLIC ]

Public synonym을 만들기 위해 명시한다. 
이 절을 생략하면 private synonym이 생성된다.

synonym_name

생성할 synonym의 이름이며, 스키마 내에서 유일한 이름이어야 한다. 
schema_name.synonym_name과 같이 synonym이 소속할 스키마를 정의할 수 있는데 schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다. 
Synonym 이름의 길이는 128 바이트보다 작아야 한다. 
Public synonym은 non-schema 객체이다. 따라서 PUBLIC을 명시하여 public synonym을 생성할 때는 스키마 이름을 명시할 수 없다.

object_name

schema_name.object_name과 같이 객체가 소속된 스키마를 명시할 수 있으며, schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.

object_name을 명시할 수 있는 객체 타입은 다음과 같다.

대상 객체의 존재 여부, cycle check, 권한 검사 등은 synonym을 사용한 구문을 수행할 때 실행된다.

설명

Synonym은 테이블, view, 시퀀스, 다른 synonym의 대체 이름이다.

Synonym을 생성해서 사용하면 기본 객체가 변경되더라도 응용 프로그램 수정 없이 synonym만 재정의 해서 사용하면 되기 때문에 매우 편리하다. 또한 객체의 실제 이름과 스키마를 숨김처리해서 데이터베이스 보안을 개선할 수도 있고, 객체의 긴 이름을 사용하기 쉬운 짧은 이름으로 변경하여 사용성을 높일 수도 있다.

Synonym은 말 그대로 대체 이름이기 때문에, 이를 생성했다고 해서 synonym을 이용하여 해당 객체에 접근할 수는 없다. 해당 객체에 대한 적절한 권한이 있어야만 접근할 수 있다.

Synonym을 사용하여 구문을 수행할 때 객체는 다음과 같은 순서로 접근한다.
  1. 해당 이름의 테이블을 찾는다.

  2. 테이블이 없을 경우, 해당 이름의 private synonym을 찾는다.

  3. Private synonym이 없을 경우, 해당 이름의 public synonym을 찾는다.

gSQL> CREATE PUBLIC SYNONYM syn1 FOR u1.t1;

Synonym created.

gSQL> CREATE PUBLIC SYNONYM syn2 FOR syn1;

Synonym created.

gSQL> SELECT * FROM syn2;

위 SELECT 구문 예제에서 객체 접근 순서는 다음과 같다.

  1. syn2 테이블을 검색하였으나 해당 테이블이 없다.

  2. syn2 private synonym을 검색하였으나 해당 synonym이 없다.

  3. syn2 public synonym을 검색하여 해당 synonym을 찾았다.

    1. syn1 테이블을 검색하였으나 해당 테이블이 없다.

    2. syn1 private synonym을 검색하였으나 해당 synonym이 없다.

    3. syn1 public synonym을 검색하여 해당 synonym을 찾았다.

      1. u1.t1 테이블을 검색하여 찾았다.

사용 예

다음은 private synonym을 생성하는 예이다.

gSQL> CREATE SYNONYM MyEmp FOR branch.Employee;

Synonym created.


gSQL> SELECT * FROM MyEmp;

다음은 public synonym을 생성하는 예이다.

gSQL> CREATE PUBLIC SYNONYM MainEmp FOR main.Employee;

Synonym created.


gSQL> SELECT * FROM MainEmp;

호환성

SQL 표준에서는 CREATE SYNONYM 구문을 정의하지 않고 있다.

참조

관련 내용은 DROP SYNONYM을 참조한다.

CREATE TABLE

기능

테이블을 정의한다.

구문

<table definition> ::=
    CREATE TABLE table_name
        ( <table element> [, ...] )
        [ <table sharding strategy> ]
        [ <table attribute clause> [...] ]
        [ TABLESPACE tablespace_name ]
        [ <table global secondary index clause> ]
    ;

<table element> ::=
      <column definition>
    | <table constraint definition>

<column definition> ::=
    column_name <data type> 
        [ <default clause> | <identity column specification> ]
        [ <column constraint definition> ]

<data type> ::=
      <character string type>
    | <binary string type>
    | <numeric type>
    | <boolean type>
    | <datetime type>
    | <interval type>

<character string type> ::=
      CHARACTER [ ( integer [ <character length units> ] ) ]
    | CHAR [ ( integer [ <character length units> ] ) ]
    | CHARACTER VARYING ( integer [ <character length units> ] )
    | CHAR VARYING ( integer [ <character length units> ] )
    | VARCHAR ( integer [ <character length units> ] )
    | CHARACTER LONG VARYING
    | LONG VARCHAR
  
<character length units> ::=
      CHARACTERS
    | CHAR
    | OCTETS
    | BYTE

<binary string type> ::=
      BINARY [ ( length ) ]
    | BINARY VARYING ( length )
    | VARBINARY ( length )
    | LONG BINARY VARYING
    | LONG VARBINARY

<numeric type> ::=
      <exact numeric type>
    | <approximate numeric type>
    | <native numeric type>

<exact numeric type> ::=
      NUMERIC [ ( precision [, scale ] ) ]
    | SMALLINT
    | INTEGER
    | INT
    | BIGINT

<approximate numeric type> ::=
    | FLOAT [ ( precision ) ]
    | REAL
    | DOUBLE PRECISION

<native numeric type> ::=
      NATIVE_SMALLINT
    | NATIVE_INTEGER
    | NATIVE_BIGINT
    | NATIVE_REAL
    | NATIVE_DOUBLE

<boolean type> ::=
    BOOLEAN

<datetime type> ::=
      DATE
    | TIME [ ( time_precision ) ] [ WITH TIME ZONE | WITHOUT TIME ZONE ]
    | TIMESTAMP [ ( timestamp_precision ) ] [ WITH TIME ZONE | WITHOUT TIME ZONE ]

<interval type> ::=
    INTERVAL <interval qualifier>

<interval qualifier> ::=
      <non-second primary datetime field> [ ( interval_leading_field_precision ) ]
          TO { <non-second primary datetime field> | SECOND [ ( interval_fractional_seconds_precision ) ] }
    | <non-second primary datetime field> [ ( interval_leading_field_precision ) ]
    | SECOND [ ( interval_leading_field_precision [, interval_fractional_seconds_precision ] ) ]

<non-second primary datetime field> ::=
      YEAR
    | MONTH
    | DAY
    | HOUR
    | MINUTE

<default clause> ::=
    DEFAULT <default option>

<default option> ::=
      constant
    | NULL
    | expression

<identity column specification> ::=
    GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY 
    [ ( <common sequence generator option> [, ...] ) ]

<common sequence generator option> ::=
      START WITH integer_constant
    | <basic sequence generator option>

<basic sequence generator option> ::=
      INCREMENT BY integer_constant 
    | { MAXVALUE integer_constant | NO MAXVALUE }
    | { MINVALUE integer_constant | NO MINVALUE }
    | { CYCLE | NO CYCLE }
    | { CACHE integer_constant | NO CACHE }

<column constraint definition> ::=
    [ CONSTRAINT constraint_name ] <column constraint> [ <constraint characteristics> ]

<column constraint> ::=
      NOT NULL
    | { UNIQUE | PRIMARY KEY } [ <index name clause> [ <index attributes> ] [ TABLESPACE index_tablespace_name ] ]

<index name clause> ::=
    INDEX index_name

<index attributes> ::=
      <index physical attribute clause>
    | STORAGE ( <segment attr clause> [...] )


<table constraint definition> ::=
    [ CONSTRAINT constraint_name ] <table constraint> [ <constraint characteristics> ]

<table constraint> ::=
      <unique constraint definition> [ <index name clause> [ <index attributes> ] [ TABLESPACE index_tablespace_name ] ]

<unique constraint definition> ::=
    { UNIQUE | PRIMARY KEY } ( <key column element> [, ...] )

<key column element> ::=
    column_name [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ]


<table sharding strategy> ::=
      <cloned strategy>
    | <hash sharding strategy>
    | <range sharding strategy>
    | <list sharding strategy>

<cloned strategy> ::=
    CLONED [ <clone placement> ]

<clone placement> ::=
      AT CLUSTER WIDE
    | AT CLUSTER GROUP group_list

<hash sharding strategy> ::=
    SHARDING BY [HASH] ( column_list )
    [ <hash shard count> ]
    [ <hash shard placement> ]

<hash shard count> ::=
    SHARD COUNT integer

<hash shard placement> ::=
      AT CLUSTER WIDE
    | AT CLUSTER GROUP group_list

<range sharding strategy> ::=
    SHARDING BY RANGE ( column_list )
    { <cluster-wide range shard placement> | <group-specific range shard placement> }

<cluster-wide range shard placement> ::=
    AT CLUSTER WIDE
    <range shard definition> [, ...]

<group-specific range shard placement> ::=
    <group-specific range shard definition> [, ...]

<group-specific range shard definition> ::=
    <range shard definition> AT CLUSTER GROUP group_name

<range shard definition> ::=
    SHARD range_name VALUES LESS THAN ( <range value clause> )

<range value clause> ::=
    <range value> [, ...]

<range value> ::=
      constant
    | MAXVALUE

<list sharding strategy> ::=
    SHARDING BY LIST ( column_name )
    { <cluster-wide list shard placement> | <group-specific list shard placement> }

<cluster-wide list shard placement> ::=
    AT CLUSTER WIDE
    <list shard definition> [, ...]

<group-specific list shard placement> ::=
    <group-specific list shard definition> [, ...]

<group-specific list shard definition> ::=
    <list shard definition> AT CLUSTER GROUP group_name

<list shard definition> ::=
      SHARD shard_name VALUES IN ( <list value clause> )

<list value clause> ::=
    <list value> [, ...]

<list value> ::=
      constant
    | NULL
    | DEFAULT


<table attribute clause> ::=
      [ <table physical attribute clause> ]
    | [ STORAGE ( <segment attr clause> [...] ) ]

<table physical attribute clause> ::=
      PCTFREE integer
    | PCTUSED integer
    | INITRANS integer
    | MAXTRANS integer

<index physical attribute clause> ::=
      PCTFREE integer
    | INITRANS integer
    | MAXTRANS integer

<segment attr clause> ::=
      INITIAL <size_clause>
    | NEXT <size_clause>
    | MINSIZE <size_clause>
    | MAXSIZE <size_clause>

<size clause> ::=
      integer [ K | M | G | T ]


<constraint characteristics> ::=
      [ NOT ] DEFERRABLE [ <constraint check time> ]
    | <constraint check time> [ [ NOT ] DEFERRABLE ]

<constraint check time> ::=
      INITIALLY DEFERRED 
    | INITIALLY IMMEDIATE

<table global secondary index clause> ::=
      WITH GLOBAL SECONDARY INDEX [ <index attributes> [...] ] [ TABLESPACE tablespace_name ]
    |  WITHOUT GLOBAL SECONDARY INDEX

사용 범위 및 접근 권한

Database가 stand-alone 인지 아니면 cluster 인지에 따라 다음과 같은 차이가 있다.

<table definition> 구문을 수행하려면 사용자가 다음 조건들을 만족해야 한다.

<table sharding strategy> 구문은 cluster system에서 사용할 수 있다.

구문 규칙 및 파라미터

table_name

생성할 테이블의 이름이며, 스키마 내에서 유일한 이름이어야 한다. 
schema_name.table_name과 같이 테이블이 속할 스키마를 정의할 수 있는데 schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다. 
테이블 이름의 길이는 128 바이트보다 작아야 한다.

<column definition>

테이블을 구성할 column을 정의한다. 
테이블은 하나 이상의 column에 대한 정의를 포함해야 한다. 
Column의 데이터 타입, 기본값, 자동 생성 값, 제약 조건 등을 기술할 수 있다.

column_name

테이블을 구성할 column의 이름으로 각 column은 테이블 내에서 유일한 이름을 가져야 한다. 
Column 이름의 길이는 128 바이트보다 작아야 한다.

<data type>

Column의 데이터 타입을 정의한다.
자동 생성 값을 갖는 (<identity column specification>) column을 정의할 경우, SMALLINT, INTEGER, BIGINT 타입 중 하나의 데이터 타입을 사용해야 한다.
데이터 타입과 관련한 자세한 내용은 Data Type 정의를 참조한다.

<character length units>

Character 타입의 문자 하나당 길이 단위를 지정한다.

SQL 표준의 기본값은 CHARACTERS이다.

다른 DBMS의 char length unit 기본값은 다음과 같다.

[ <default clause> | <identity column specification> ]

Column의 기본값을 명시한다. 
<default clause>와 <identity column specification>은 함께 사용할 수 없다. 
모두 생략할 경우, 기본값은 NULL이다.

<default clause>

DEFAULT 절은 INSERT, UPDATE와 같은 구문에 DEFAULT가 명시되거나 해당 column 이름이 생략될 경우에 사용할 기본값을 정의한다.

DEFAULT expression의 데이터 타입은 column의 데이터 타입과 호환 가능해야 한다.
타입이 호환되지 않거나 expression이 valid 하지 않으면 에러가 발생한다.
--# result: error
CREATE TABLE t1 ( c1 INTEGER DEFAULT 1 / 0 );

ERR-22012(12122): divisor is equal to zero


--# result: success
CREATE TABLE t1 ( c1 INTEGER DEFAULT 1 / 1 );

Table created.

DEFAULT expression은 모든 built-in 함수를 사용할 수 있지만 다음은 사용할 수 없다.

<identity column specification>

자동 생성값을 갖는 column을 정의한다.

테이블은 하나의 identity column 만 가질 수 있다.
NOT NULL 제약 조건을 명시하지 않아도 identity column은 not nullable column이 된다.
<identity column specification> 절은 DEFAULT 절과 함께 기술할 수 없다.
<identity column specification> 절은 DEFAULT 절과 마찬가지로 INSERT, UPDATE 구문에서 DEFAULT를 명시하거나 해당 column 이름이 생략될 경우에 사용할 기본값을 정의한다.

생성 방식은 다음과 같이 정의된다.

identity column 생성 옵션인 <common sequence generator option>과 <basic sequence generator option>에 대한 자세한 내용은 CREATE SEQUENCE 구문을 참조한다.

<column constraint definition>

Column에 대해 다음과 같은 제약 조건을 정의한다.

constraint_name

제약 조건의 이름이며 생략 가능하다.

constraint_name을 생략할 경우 다음과 같은 형태로 제약 조건 이름을 자동으로 설정한다. 자동 생성하는 이름이 중복될 경우, constraint_name을 명시적으로 부여해야 한다.

제약 조건의 이름은 128 바이트보다 작아야 한다.

NOT NULL 제약 조건

Column 값으로 NULL 값을 허용하지 않는다.

UNIQUE 제약 조건

Column 값으로 동일한 값을 허용하지 않는다. 
단, NULL 값은 허용한다.

PRIMARY KEY 제약 조건

Column 값으로 NULL 값이나 동일한 값을 허용하지 않는다. 
하나의 테이블에 하나의 PRIMARY KEY 제약 조건을 정의할 수 있다.

<index name clause>

UNIQUE 제약 조건, PRIMARY KEY 제약 조건을 정의할 때 생성되는 인덱스의 이름을 정의한다.

UNIQUE 제약 조건, PRIMARY KEY 제약 조건을 정의할 때 INDEX 절을 생략할 경우에는 제약 조건에 부합하는 인덱스를 자동으로 생성한다.
자동 생성되는 인덱스 이름으로는 "constraint_name" + "_INDEX"가 부여된다.

<table constraint definition>

<unique constraint definition>

테이블 제약 정의는 column 제약 정의와 비교하여 다음과 같은 구문상의 차이가 있다.

key column element

Key 대상이 되는 column을 지정한다.

<table sharding strategy>

테이블의 sharding 정책을 정의한다. 
다음과 같은 네 가지 정책 중 하나로 정의할 수 있다.

생략할 경우 DEFAULT_SHARDING 프로퍼티 값에 의해 결정된다.

<cloned strategy>

테이블의 모든 data를 복제한다.

<clone placement>

Clone의 배치 정책을 정의한다.

<hash sharding strategy>

테이블의 data를 sharding key의 hash 값을 기준으로 shard를 분할한다.

SHARDING BY [HASH] ( column_list )

Hash sharding을 위한 sharding key를 정의한다.

<hash shard count>

분할할 hash shard의 개수를 정의한다. 
Shard의 개수는 1부터 512까지 정의할 수 있다. 
생략할 경우 기본값은 24이다.

<hash shard placement>

Hash shard의 배치 정책을 정의한다.

<range sharding strategy>

테이블의 data를 sharding key의 범위값을 기준으로 shard 분할한다.

SHARDING BY RANGE ( column_list )

Range sharding을 위한 sharding key를 정의한다.

<cluster-wide range shard placement>

Range shard들을 cluster system의 모든 cluster group으로 자동으로 배치한다.
<range shard definition>을 기술하기 전에 AT CLUSTER WIDE 구문을 기술한다.
Cluster group과 cluster member를 추가할 때 ALTER TABLE name REBALANCE 구문을 사용하여 자동으로 shard들을 재배치할 수 있다.
CREATE TABLE t1 
(
   id   INTEGER,
   name VARCHAR(32)
)
SHARDING BY RANGE (id)
    AT CLUSTER WIDE
    SHARD s1 VALUES LESS THAN ( 200000 ),
    SHARD s2 VALUES LESS THAN ( 400000 ),
    SHARD s3 VALUES LESS THAN ( 500000 ),
    SHARD s4 VALUES LESS THAN ( 600000 ),
    SHARD s5 VALUES LESS THAN ( 800000 ),
    SHARD s6 VALUES LESS THAN ( MAXVALUE )
;
CREATE CLUSTER GROUP g4 
       CLUSTER MEMBER g4n1 HOST '192.168.0.41' PORT 10401
;
ALTER TABLE t1 REBALANCE;

<group-specific range shard placement>

Range shard들을 지정한 cluster group에 배치한다.
<range shard definition>과 함께 해당 shard를 배치할 AT CLUSTER GROUP group_name 구문을 기술한다.
지정한 cluster group에 cluster member를 추가할 때 ALTER TABLE name REBALANCE 구문을 사용하여 자동으로 shard들을 재배치할 수 있다.
Cluster group 추가는 range shard의 재배치에 영향을 주지 않는다.
CREATE TABLE t1 
(
   id   INTEGER,
   name VARCHAR(32)
)
SHARDING BY RANGE (id)
    SHARD s1 VALUES LESS THAN ( 200000 )   AT CLUSTER GROUP g1,
    SHARD s2 VALUES LESS THAN ( 400000 )   AT CLUSTER GROUP g2,
    SHARD s3 VALUES LESS THAN ( 500000 )   AT CLUSTER GROUP g3,
    SHARD s4 VALUES LESS THAN ( 600000 )   AT CLUSTER GROUP g2,
    SHARD s5 VALUES LESS THAN ( 800000 )   AT CLUSTER GROUP g3,
    SHARD s6 VALUES LESS THAN ( MAXVALUE ) AT CLUSTER GROUP g1
;
CREATE CLUSTER GROUP g4 
       CLUSTER MEMBER g4n1 HOST '192.168.0.41' PORT 10401
;
ALTER TABLE t1 REBALANCE;

<range shard definition>

SHARD range_name은 테이블 내에서 유일해야 한다.

최대 512 개의 <range shard definition>을 정의할 수 있다.

나열된 <range shard definition>은 <range value clause>의 순서로 정렬되며 서로 다른 <range value clause>를 사용해야 한다.

모든 값을 MAXVALUE로 정의한 <range shard definition>을 MAX shard라 한다. 
MAX shard는 반드시 존재해야 하며, 하나만 존재해야 한다.
gSQL>
CREATE TABLE t1 
(
   id INTEGER,
   name VARCHAR(32)
)
SHARDING BY RANGE (id)
   AT CLUSTER WIDE
   SHARD s1 VALUES LESS THAN ( 100000 ),
   SHARD s2 VALUES LESS THAN ( 200000 ),
   SHARD s3 VALUES LESS THAN ( MAXVALUE )
;

Table created.
gSQL>
CREATE TABLE t1 
(
   id INTEGER,
   name VARCHAR(32)
)
SHARDING BY RANGE (id)
   AT CLUSTER WIDE
   SHARD s1 VALUES LESS THAN ( 100000 ),
   SHARD s2 VALUES LESS THAN ( 200000 ),
   SHARD s3 VALUES LESS THAN ( 300000 )
;

ERR-42000(16377): MAX shard not defined : 
   SHARD s3 VALUES LESS THAN ( 300000 )
   *
ERROR at line 10:

<range value clause>

<range value>는 상수값이거나 최대값을 의미하는 MAXVALUE 여야 한다.

NULL 값은 <range value>로 사용할 수 없다.

MAXVALUE는 다른 값보다 항상 큰 값을 의미하며 null 값을 포함한다.

Sharding key가 여러 개인 경우 MAXVALUE 이후에는 MAXVALUE만 지정할 수 있다.

다수의 column을 사용하여 sharding key를 정의한 경우 다음 SHARD s3와 같이 모든 값을 MAXVALUE 로 나열한 MAX shard가 반드시 하나만 존재해야 한다.

CREATE TABLE t1 
(
   id INTEGER,
   name VARCHAR(32)
)
SHARDING BY RANGE (id, name)
   AT CLUSTER WIDE
   SHARD s1 VALUES LESS THAN ( 100000, MAXVALUE ),
   SHARD s2 VALUES LESS THAN ( 200000, 20000 ),
   SHARD s3 VALUES LESS THAN ( MAXVALUE, MAXVALUE )
;

<list sharding strategy>

테이블의 data를 sharding key 의 나열값을 기준으로 shard를 분할한다.

SHARDING BY LIST ( column_name )

List sharding을 위한 sharding key를 정의한다.

<cluster-wide list shard placement>

Cluster system의 모든 cluster group에 list shard들을 자동으로 배치한다.
<list shard definition>을 기술하기 전에 AT CLUSTER WIDE 구문을 기술한다.
Cluster group과 cluster member를 추가할 때 ALTER TABLE name REBALANCE 구문을 사용하여 자동으로 shard들을 재배치할 수 있다.
CREATE TABLE city 
(
   id   INTEGER,
   name VARCHAR(32)
)
SHARDING BY LIST (name)
    AT CLUSTER WIDE
    SHARD s1 VALUES IN ( 'SEOUL' ),
    SHARD s2 VALUES IN ( 'PUSAN', 'ULSAN', 'DAEGU' ),
    SHARD s3 VALUES IN ( 'DAEJEON', 'GWANGJU' ),
    SHARD s4 VALUES IN ( 'ANSAN', 'GOYANG' ),
    SHARD s5 VALUES IN ( DEFAULT )
;
CREATE CLUSTER GROUP g4 
       CLUSTER MEMBER g4n1 HOST '192.168.0.41' PORT 10401
;
ALTER TABLE t1 REBALANCE;

<group-specific list shard placement>

List shard들을 지정한 cluster group에 배치한다.
<list shard definition>과 함께 해당 shard를 배치할 AT CLUSTER GROUP group_name 구문을 기술한다.
지정한 cluster group에 cluster member를 추가할 때 ALTER TABLE name REBALANCE 구문을 사용하여 자동으로 shard들을 재배치할 수 있다.
Cluster group 추가는 list shard의 재배치에 영향을 주지 않는다.
CREATE TABLE city 
(
   id   INTEGER,
   name VARCHAR(32)
)
SHARDING BY LIST (name)
    SHARD s1 VALUES IN ( 'SEOUL' )                   AT CLUSTER GROUP g1,
    SHARD s2 VALUES IN ( 'PUSAN', 'ULSAN', 'DAEGU' ) AT CLUSTER GROUP g2,
    SHARD s3 VALUES IN ( 'DAEJEON', 'GWANGJU' )      AT CLUSTER GROUP g3,
    SHARD s4 VALUES IN ( 'ANSAN', 'GOYANG' )         AT CLUSTER GROUP g2,
    SHARD s5 VALUES IN ( DEFAULT )                   AT CLUSTER GROUP g1
;
CREATE CLUSTER GROUP g4 
       CLUSTER MEMBER g4n1 HOST '192.168.0.41' PORT 10401
;
ALTER TABLE t1 REBALANCE;

<list shard definition>

LIST list_name은 테이블 내에서 유일해야 한다.

최대 512개의 <list shard definition>을 정의할 수 있다. 
나열된 <list shard definition>의 모든 <list value> 값이 서로 달라야 한다.
DFFAULT는 나열된 모든 <list value>를 제외한 나머지 값이다. 
DEFAULT는 다른 값과 함께 지정할 수 없다. 
DEFAULT를 포함하는 shard를 DEFAULT shard라고 한다.

DEFAULT shard는 반드시 존재해야 하며, 하나만 존재해야 한다.

gSQL>
CREATE TABLE t1 
(
   category INTEGER,
   name     VARCHAR(32)
)
SHARDING BY LIST (category)
   AT CLUSTER WIDE
   SHARD s1 VALUES IN ( 1, 3, 5, 7 ),
   SHARD s2 VALUES IN ( 2, 4, 6, 8 ),
   SHARD s3 VALUES IN ( DEFAULT )
;

Table created.
gSQL>

CREATE TABLE t1 
(
   category INTEGER,
   name     VARCHAR(32)
)
SHARDING BY LIST (category)
   AT CLUSTER WIDE
   SHARD s1 VALUES IN ( 1, 3, 5, 7 ),
   SHARD s2 VALUES IN ( 2, 4, 6, 8 ),
   SHARD s3 VALUES IN ( 9, 10 )
;

ERR-42000(16385): DEFAULT shard not defined : 
   SHARD s3 VALUES IN ( 9, 10 )
   *
ERROR at line 10:

<list value clause>

<list value>는 상수값이어야 한다. 
NULL 값이나 DEFAULT를 <list value>로 사용할 수 있다.

DEFAULT는 다른 값과 함께 지정할 수 없다.

<table physical attribute clause>

테이블의 물리적 속성 정보를 정의한다.

<index physical attribute clause>

인덱스의 물리적 속성 정보를 정의한다.

<segment attr clause>

테이블이 저장될 공간에 대한 정보를 기술한다.

<size clause>

파일의 바이트 크기를 명시한다. (단위를 기술하지 않을 경우 bytes이다.)

TABLESPACE tablespace_name

테이블이 저장될 tablespace의 이름을 지정한다. 
TABLESPACE 절을 생략할 경우, 구문을 수행하는 사용자의 기본 tablespace_name을 사용한다.

TABLESPACE index_tablespace_name

인덱스가 저장될 tablespace의 이름을 지정한다. 
TABLESPACE 절을 생략할 경우, 사용자의 인덱스 테이블스페이스를 사용한다.
사용자의 인덱스 테이블스페이스가 NULL인 경우, DISK 테이블은 사용자의 데이터 테이블스페이스를 사용하고 MEMORY 테이블은 사용자의 기본 임시 테이블스페이스를 사용한다.

<constraint characteristics>

제약 조건의 특성을 정의한다. 
제약 조건을 정의할 때 다음과 같은 특성들을 설정할 수 있다.

<constraint characteristics>를 생략할 경우, NOT DEFERRABLE INITIALLY IMMEDIATE로 설정한다.

DEFERRABLE | NOT DEFERRABLE

제약 조건을 DML을 수행할 때 검사하지 않고, COMMIT을 수행할 때 검사할 수 있게 지연시킬 수 있는지 여부를 설정한다.

지연 가능한 제약 조건의 검사시점은 SET CONSTRAINTS 구문으로 제어한다.

<constraint check time>

지연가능한 (DEFERRABLE) 제약 조건일 경우, 검사 시점의 초기값을 설정한다.

지연 가능한 제약 조건에 대한 자세한 내용은 SET CONSTRAINTS 구문을 참조한다.

<table global secondary index clause>

테이블의 global secondary index를 정의한다.

설명

제약 조건의 특성

GOLDILOCKS는 key 제약 조건을 생성할 때 uniqueness 검사를 하기 위해 자동으로 index를 생성한다.

다음과 같은 column은 NULL 값을 허용하지 않는다.

Cluster Table

Cluster 환경에서 테이블은 다음 중 하나의 sharding 정책으로 데이터를 관리한다.

테이블을 생성할 때 다음을 고려하여 sharding 정책을 결정한다. Cluster system 상에서 운영되는 테이블들은 그 특성에 따라 code table과 fact table로 구분할 수 있다.

Code table에는 <cloned strategy>가 바람직하며, fact table의 경우 테이블의 접근 패턴에 따라 <table sharding strategy>를 결정해야 한다.

사용 예

다음은 일반 테이블을 생성하는 예이다.

gSQL> CREATE TABLE region
(
    r_regionkey   INTEGER
  , r_name        CHAR(25)
  , r_comment     VARCHAR(152)
);

Table created.

다음은 테이블을 생성할 때 column에 제약 조건을 기술하는 예이다.

gSQL> CREATE TABLE supplier
(
    s_suppkey     INTEGER PRIMARY KEY
  , s_name        CHAR(25) NOT NULL
  , s_address     VARCHAR(40)
  , s_nationkey   INTEGER
  , s_phone       CHAR(15)
  , s_acctbal     NUMERIC(12,2)
  , s_comment     VARCHAR(101)
);

Table created.

다음은 테이블을 생성할 때 여러 column을 포함하는 제약 조건을 기술하는 예이다.

gSQL> CREATE TABLE partsupp
(
    ps_partkey    INTEGER
  , ps_suppkey    INTEGER
  , ps_availqty   INTEGER
  , ps_supplycost NUMERIC(12,2)    
  , ps_comment    VARCHAR(199)
  , CONSTRAINT ps_unique_key UNIQUE(ps_partkey, ps_suppkey)
);

Table created.

다음은 테이블을 생성할 때 지연 가능 여부를 포함한 제약 조건을 기술하는 예이다.

gSQL> CREATE TABLE t1 
( 
    id     NUMBER        PRIMARY KEY 
                         NOT DEFERRABLE INITIALLY IMMEDIATE
  , name   VARCHAR(128)  CONSTRAINT t1_nn NOT NULL 
                         DEFERRABLE INITIALLY IMMEDIATE
  , addr   VARCHAR(1024) 
  , CONSTRAINT t1_uk UNIQUE ( id, name ) 
                     DEFERRABLE INITIALLY DEFERRED
);

Table created.

gSQL> COMMIT;

Commit complete.

다음은 테이블을 생성할 때 자동 생성값과 기본값을 갖는 column들을 기술하는 예이다.

CREATE TABLE customer
(
    c_custkey     INTEGER   GENERATED BY DEFAULT AS IDENTITY
  , c_name        VARCHAR(25)
  , c_address     VARCHAR(40) DEFAULT 'N/A'
  , c_nationkey   INTEGER
  , c_phone       CHAR(15)
  , c_acctbal     NUMERIC(12,2)
  , c_mktsegment  CHAR(10)
  , c_comment     VARCHAR(117)
);

Table created.

다음은 테이블을 생성할 때 저장될 tablespace를 지정하는 예이다.

gSQL> CREATE TABLE lineitem
(
    l_orderkey      INTEGER
  , l_partkey       INTEGER
  , l_suppkey       INTEGER
  , l_linenumber    INTEGER
  , l_quantity      NUMERIC(12,2)
  , l_extendedprice NUMERIC(12,2)
  , l_discount      NUMERIC(12,2)
  , l_tax           NUMERIC(12,2)
  , l_returnflag    CHAR(1)
  , l_linestatus    CHAR(1)
  , l_shipdate      DATE
  , l_commitdate    DATE
  , l_receiptdate   DATE
  , l_shipinstruct  CHAR(25)
  , l_shipmode      CHAR(10)
  , l_comment       VARCHAR(44)
  , PRIMARY KEY (l_orderkey, l_linenumber) INDEX lineitem_pk_idx TABLESPACE mem_temp_tbs
) TABLESPACE mem_data_tbs;

Table created.

다음은 cluster-wide cloned table을 정의하는 예이다. 테이블의 data를 cluster system 전체에 복제하여 배치한다.

gSQL>
CREATE TABLE region
(
    r_regionkey   INTEGER
  , r_name        CHAR(25)
  , r_comment     VARCHAR(152)
)
CLONED
AT CLUSTER WIDE
;

Table created.

다음은 group-specific cloned table을 정의하는 예이다. 테이블의 데이터는 사용자가 지정한 g1, g2 cluster group에 복제하여 배치한다.

gSQL> 
CREATE TABLE region
(
    r_regionkey   INTEGER
  , r_name        CHAR(25)
  , r_comment     VARCHAR(152)
)
CLONED
AT CLUSTER GROUP g1, g2
;

Table created.

다음은 cluster-wide hash sharded table을 정의하는 예이다. 테이블의 데이터가 ps_partkey column의 hash 값에 의해 24 개의 shard로 분할되며 각 shard는 cluster system 전체에 자동으로 배치된다.

gSQL>
CREATE TABLE partsupp
(
    ps_partkey    INTEGER
  , ps_suppkey    INTEGER
  , ps_availqty   INTEGER
  , ps_supplycost NUMERIC(12,2)    
  , ps_comment    VARCHAR(199)
)
SHARDING BY HASH ( ps_partkey )
SHARD COUNT 24
AT CLUSTER WIDE
;

Table created.

다음은 group-specific hash sharded table을 정의하는 예이다. 테이블의 데이터가 ps_partkey column의 hash 값에 의해 24 개의 shard로 분할되며 각 shard는 지정한 cluster group g2, g3에 자동으로 배치된다.

gSQL>
CREATE TABLE partsupp
(
    ps_partkey    INTEGER
  , ps_suppkey    INTEGER
  , ps_availqty   INTEGER
  , ps_supplycost NUMERIC(12,2)    
  , ps_comment    VARCHAR(199)
)
SHARDING BY HASH ( ps_partkey )
SHARD COUNT 24
AT CLUSTER GROUP g2, g3
;

Table created.

다음은 cluster-wide range sharded table을 정의하는 예이다. 테이블 데이터가 D_ID column의 range 값을 기준으로 여덟 개의 shard로 분할되고, 각 shard가 cluster system 전체에 자동으로 배치된다.

gSQL>
CREATE TABLE DISTRICT (
    D_ID        INTEGER, 
    D_W_ID      INTEGER, 
    D_NAME      VARCHAR(10), 
    D_STREET_1  VARCHAR(20), 
    D_STREET_2  VARCHAR(20), 
    D_CITY      VARCHAR(20), 
    D_STATE     CHAR(2), 
    D_ZIP       CHAR(9), 
    D_TAX       NUMERIC(4,4), 
    D_YTD       NUMERIC(15,2), 
    D_NEXT_O_ID INTEGER,

    PRIMARY KEY (D_W_ID, D_ID) INDEX DISTRICT_PK_IDX
) 
    SHARDING BY RANGE (D_ID)
    AT CLUSTER WIDE
    SHARD s1 VALUES LESS THAN ( 100 ),
    SHARD s2 VALUES LESS THAN ( 200 ),
    SHARD s3 VALUES LESS THAN ( 300 ),
    SHARD s4 VALUES LESS THAN ( 400 ),
    SHARD s5 VALUES LESS THAN ( 500 ),
    SHARD s6 VALUES LESS THAN ( 600 ),
    SHARD s7 VALUES LESS THAN ( 700 ),
    SHARD s8 VALUES LESS THAN ( MAXVALUE );
;

Table created.

다음은 group-specific range sharded table을 정의하는 예이다. 테이블 데이터는 NO_D_ID column의 range 값을 기준으로 세 개의 range 값으로 분할되고, s1 shard는 g1 cluster group에, s2 shard는 g2 cluster group에 그리고 s3 shard는 g3 cluster group에 각각 지정되어 배치된다.

gSQL>
CREATE TABLE NEW_ORDER
(
    NO_O_ID INTEGER,
    NO_D_ID INTEGER,
    NO_W_ID INTEGER,

    PRIMARY KEY(NO_W_ID, NO_D_ID, NO_O_ID) INDEX NEW_ORDER_PK_IDX
) 
    SHARDING BY RANGE (NO_D_ID)
    SHARD s1 VALUES LESS THAN ( 5 )        AT CLUSTER GROUP g1,
    SHARD s2 VALUES LESS THAN ( 8 )        AT CLUSTER GROUP g2,
    SHARD s3 VALUES LESS THAN ( MAXVALUE ) AT CLUSTER GROUP g3
;

Table created.

다음은 cluster-wide list sharded table을 정의하는 예이다. List shard가 city column을 기준으로 다섯 개로 분할되고, 각 shard는 cluster system 전체에 자동으로 배치된다.

gSQL>
CREATE TABLE t1 
(
    id   INTEGER
  , name VARCHAR(32)
  , city VARCHAR(128) 
) 
   SHARDING BY LIST (city)
      AT CLUSTER WIDE
      SHARD s1 VALUES IN ( 'seoul' ),
      SHARD s2 VALUES IN ( 'busan', 'ulsan' ),
      SHARD s3 VALUES IN ( 'suwon', 'ansan', 'osan' ),
      SHARD s4 VALUES IN ( 'goyang', 'paju', 'guri' ),
      SHARD s5 VALUES IN ( DEFAULT )            
;

Table created.

다음은 group-specific list sharded table을 정의하는 예이다. List shard가 city column을 기준으로 다섯 개로 분할되고, 각 shard는 지정된 cluster group에 배치된다.

gSQL>
CREATE TABLE t1 
(
    id   INTEGER
  , name VARCHAR(32)
  , city VARCHAR(128) 
) 
   SHARDING BY LIST (city)
      SHARD s1 VALUES IN ( 'seoul' )                  AT CLUSTER GROUP g1,
      SHARD s2 VALUES IN ( 'busan', 'ulsan' )         AT CLUSTER GROUP g2,
      SHARD s3 VALUES IN ( 'suwon', 'ansan', 'osan' ) AT CLUSTER GROUP g1,
      SHARD s4 VALUES IN ( 'goyang', 'paju', 'guri' ) AT CLUSTER GROUP g2,
      SHARD s5 VALUES IN ( DEFAULT )                  AT CLUSTER GROUP g3
;

Table created.

Global secondary index 없이 테이블 T1을 생성한다.

gSQL> CREATE TABLE T1 ( I1 INTEGER, I1 CHAR(32) )  WITHOUT GLOBAL SECONDARY INDEX;

Table created.

테이블 T1을 생성하고, 테이블 T1의 global secondary index를 생성한다.

gSQL> CREATE TABLE T1 ( I1 INTEGER, I1 CHAR(32) )  WITH GLOBAL SECONDARY INDEX;

Table created.

테이블 T1을 생성한 후에 테이블 T1의 global secondary index를 tablespace USER_DATA_TBS에 logging index로 생성한다.

gSQL> CREATE TABLE T1 ( I1 INTEGER, I1 CHAR(32) ) 
      WITH GLOBAL SECONDARY INDEX
      TABLESPACE USER_DATA_TBS;

Table created.

테이블 T1을 생성한 후에 테이블 T1의 global secondary index를 tablespace USER_TEMP_TBS에 nologging index로 생성한다.

gSQL> CREATE TABLE T1 ( I1 INTEGER, I1 CHAR(32) ) 
      WITH GLOBAL SECONDARY INDEX
      TABLESPACE USER_TEMP_TBS;

Table created.

호환성

SQL 표준에서는 다음과 같은 절을 정의하지 않고 있다.

SQL 표준 호환성

Feature ID

설명

지원 여부

T171

LIKE clause in table definition

X

F531

Temporary tables

X

S051

Create table of type

X

S043

Enhanced reference types

X

S081

Subtables

X

T173

Extended LIKE clause in table definition

X

T180

System-versioned tables

X

F692

Extended collation support

X

T174

Identity columns

O

T175

Generated columns

X

S071

SQL paths in function and type name resolution

X

F321

User authorization

O

T322

Extended roles

X

F762

CURRENT_CATALOG

O

F763

CURRENT_SCHEMA

O

참조

관련 내용은 다음을 참조한다.

CREATE TABLE AS SELECT

기능

질의 결과로부터 새로운 테이블을 생성한다.

구문

<table definition: AS query expression> ::=
    CREATE TABLE table_name 
        [ ( column_name [, ...] ) ]
        [ <table sharding strategy> ]
        [ <table attribute clause> [, ...] ]
        [ TABLESPACE tablespace_name ]
        [ <table global secondary index clause> ]
        AS <query expression> [ WITH [ NO ] DATA ]
    ;

<table sharding strategy> ::=
      <cloned strategy>
    | <hash sharding strategy>
    | <range sharding strategy>
    | <list sharding strategy>

<cloned strategy> ::=
    CLONED [ <clone placement> ]

<clone placement> ::=
      AT CLUSTER WIDE
    | AT CLUSTER GROUP group_list

<hash sharding strategy> ::=
    SHARDING BY [HASH] ( column_list )
    [ <hash shard count> ]
    [ <hash shard placement> ]

<hash shard count> ::=
    SHARD COUNT integer

<hash shard placement> ::=
      AT CLUSTER WIDE
    | AT CLUSTER GROUP group_list

<range sharding strategy> ::=
    SHARDING BY RANGE ( column_list )
    { <cluster-wide range shard placement> | <group-specific range shard placement> }

<cluster-wide range shard placement> ::=
    AT CLUSTER WIDE
    <range shard definition> [, ...]

<group-specific range shard placement> ::=
    <group-specific range shard definition> [, ...]

<group-specific range shard definition> ::=
    <range shard definition> AT CLUSTER GROUP group_name

<range shard definition> ::=
    SHARD range_name VALUES LESS THAN ( <range value clause> )

<range value clause> ::=
    <range value> [, ...]

<range value> ::=
      constant
    | MAXVALUE

<list sharding strategy> ::=
    SHARDING BY LIST ( column_name )
    { <cluster-wide list shard placement> | <group-specific list shard placement> }

<cluster-wide list shard placement> ::=
    AT CLUSTER WIDE
    <list shard definition> [, ...]

<group-specific list shard placement> ::=
    <group-specific list shard definition> [, ...]

<group-specific list shard definition> ::=
    <list shard definition> AT CLUSTER GROUP group_name

<list shard definition> ::=
      SHARD shard_name VALUES IN ( <list value clause> )

<list value clause> ::=
    <list value> [, ...]

<list value> ::=
      constant
    | NULL
    | DEFAULT


<table attribute clause> ::=
      [ <table physical attribute clause> ]
    | [ STORAGE ( <segment attr clause> [...] ) ]

<table physical attribute clause> ::=
      PCTFREE integer
    | PCTUSED integer
    | INITRANS integer
    | MAXTRANS integer

<index physical attribute clause> ::=
      PCTFREE integer
    | INITRANS integer
    | MAXTRANS integer

<segment attr clause> ::=
      INITIAL <size_clause>
    | NEXT <size_clause>
    | MINSIZE <size_clause>
    | MAXSIZE <size_clause>

<size clause> ::=
      integer [ K | M | G | T ]

<table global secondary index clause> ::=
      WITH GLOBAL SECONDARY INDEX [ <index attributes> [...] ] [ TABLESPACE tablespace_name ]
    |  WITHOUT GLOBAL SECONDARY INDEX

사용 범위 및 접근 권한

<table definition:AS query expression> 구문을 수행하려면 사용자가 다음 조건들을 만족해야 한다.

구문 규칙 및 파라미터

table_name

생성할 테이블의 이름이다.
자세한 내용은 table_name 구문을 참조한다.

column_name_list

테이블을 구성할 column의 이름으로써 테이블 내에서 유일한 이름이어야 하며, column의 개수는 SELECT 절의 결과 column 개수와 동일해야 한다. 
명시하지 않을 경우, <query expression>의 SELECT 절의 column 이름을 사용한다.
단, SELECT절에 column이 아닌 expression (function, operation, subquery 등)이 오면 alias 또는 column name을 명시해야 한다.
Column 이름의 길이는 128 바이트보다 작아야 한다.

WITH [NO] DATA

WITH DATA가 명시된 경우, SELECT 절의 결과가 생성될 테이블에 INSERT 된다.  
WITH NO DATA가 명시된 경우, SELECT 절의 결과가 생성될 테이블에 INSERT 되지 않는다.  
명시하지 않을 경우, WITH DATA를 명시한 것과 동일하게 작동한다.

other syntax

이 외의 구문 규칙은 CREATE TABLE 구문의 syntax를 참조한다.

설명

CREATE TABLE AS SELECT 구문을 수행할 때 SELECT list에 NOT NULL 제약 조건이 있는 column이 명시된 경우, 새로운 테이블에도 NOT NULL 제약 조건이 생성된다.  단, 지연 가능한 NOT NULL 제약 조건인 경우, 새로운 테이블에는 NOT NULL 제약 조건을 생성하지 않는다.
그러나 명시적으로 NOT NULL 제약 조건을 생성한 것이 아니라, primary key, identity column과 같이 NOT NULL 속성을 가지고 있는 경우에는 새로운 테이블에 NOT NULL 제약 조건을 생성하지 않는다.

사용 예

다음은 CREATE TABLE AS SELECT 구문을 실행하는 예이다.

gSQL> CREATE TABLE recent_orders 
                AS SELECT order_id, order_item, order_date
                   FROM orders 
                   WHERE order_date >= '2015-03-03'
Table created.

다음은 column 이름을 명시하는 예이다.

gSQL> CREATE TABLE recent_orders ( order_id, order_item, order_date )
                AS SELECT order_id, order_item, order_date
                   FROM orders 
                   WHERE order_date >= '2015-03-03'
Table created.

다음은 SELECT list에 함수가 있는 경우의 예이다.

gSQL> CREATE TABLE recent_orders ( order_date, order_count )
                AS SELECT order_date, COUNT(*) 
                   FROM orders 
                   WHERE order_date >= '2015-03-03'
                   GROUP BY order_date;
Table created.

다음은 WITH DATA가 있는 경우의 예이다.

gSQL>CREATE TABLE orders 
( 
    order_id   NUMBER        
  , order_item VARCHAR(128)  
  , order_date DATE
);
gSQL> COMMIT;
gSQL> INSERT INTO orders VALUES ( 1, 'Pen', '2010-01-01' );
gSQL> INSERT INTO orders VALUES ( 2, 'Book', '2015-03-03' );
gSQL> COMMIT;
gSQL> CREATE TABLE recent_orders
                AS SELECT order_id, order_item, order_date 
                   FROM orders 
                   WHERE order_date >= '2015-03-03'
      WITH DATA;
Table created.
gSQL> SELECT COUNT(*) FROM recent_orders;

COUNT(*)
--------
       1

1 row selected.

다음은 WITH NO DATA가 있는 경우의 예이다.

gSQL>CREATE TABLE orders 
( 
    order_id   NUMBER        
  , order_item VARCHAR(128)  
  , order_date DATE
);
gSQL> COMMIT;
gSQL> INSERT INTO orders VALUES ( 1, 'Pen', '2010-01-01' );
gSQL> INSERT INTO orders VALUES ( 2, 'Book', '2015-03-03' );
gSQL> COMMIT;
gSQL> CREATE TABLE recent_orders
                AS SELECT order_id, order_item, order_date 
                   FROM orders 
                   WHERE order_date >= '2015-03-03'
      WITH NO DATA;
Table created.
gSQL> SELECT COUNT(*) FROM recent_orders;

COUNT(*)
--------
       0

1 row selected.

호환성

CREATE TABLE AS SELECT 구문은 SQL 표준을 따른다. 단, 다음은 표준에서 확장된 것이다.

SQL 표준 호환성

Feature ID

설명

지원 여부

T172

AS subquery clause in table definition

O

참조

관련 내용은 다음을 참조한다.

CREATE TABLESPACE

기능

테이블스페이스를 생성한다.

구문

<create tablespace statement> ::=
      <memory data tablespace statement>
    | <memory temporary tablespace statement>
    ;

사용 범위 및 접근 권한

<create tablespace statement> 구문을 수행하려면 사용자에게 CREATE TABLESPACE ON DATABASE 권한이 있어야 한다.

구문을 수행한 사용자는 생성한 테이블스페이스에 대해 CREATE OBJECT ON TABLESPACE 권한을 갖는다.

생성한 테이블스페이스에 객체를 생성하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

<memory data tablespace statement>

질의 처리 과정에서 생성되는 중간 결과 등의 임시 객체나 no logging 인덱스를 저장할 메모리 임시 테이블스페이스이다.
MEMORY 예약어는 생략할 수 있다.

<memory data tablespace clause>

메모리 데이터의 테이블스페이스를 정의한다.
자세한 내용은 CREATE MEMORY DATA TABLESPACE 구문을 참조한다.

<memory temporary tablespace definition>

메모리의 임시 테이블스페이스를 정의한다.
자세한 내용은 CREATE MEMORY TEMPORARY TABLESPACE 구문을 참조한다.

설명

각 세부 구문의 설명을 참조한다.

사용 예

각 세부 구문의 사용 예를 참조한다.

호환성

SQL 표준은 tablespace에 대한 개념을 다루지 않고 있다.

참조

관련 내용은 다음을 참조한다.

CREATE USER

기능

데이터베이스 사용자를 정의한다.

구문

<user definition> ::=
    CREATE USER user_identifier IDENTIFIED BY password
    [ PROFILE { profile_name | DEFAULT | NULL } ]
    [ PASSWORD EXPIRE ]
    [ ACCOUNT { LOCK | UNLOCK } ]
    [ DEFAULT TABLESPACE tablespace_name ]
    [ TEMPORARY TABLESPACE tablespace_name ]
    [ INDEX TABLESPACE { tablespace_name | NULL } ]
    [ <schema clause> ]
    ;

<schema clause> ::=
      WITH SCHEMA [schema_name]
    | WITHOUT SCHEMA

사용 범위 및 접근 권한

<user definition> 구문을 수행하려면 사용자에게 CREATE USER ON DATABASE 권한이 있어야 한다.

생성한 user_identifier 사용자는 <schema clause>로 생성한 스키마의 소유자라는 권한을 갖는다.

생성된 user_identifier에는 별도의 권한이 부여되지 않는다.

user_identifier 사용자가 접속해서 SQL 구문을 수행하려면 적절한 권한을 부여받아야 한다.

구문 규칙 및 파라미터

user_identifier

생성할 user의 이름이다.
동일한 사용자 이름 (user_identifier)이나 역할 이름 (role_name)이 존재하지 않아야 한다.
user_identifier의 길이는 128 byte 보다 작아야 한다.

password

생성할 user의 password로써 암호화되어 저장된다.
password의 길이는 128 byte보다 작아야 한다.
password는 대소문자를 구별한다.
password는 영문자로 시작해야 하고 영문자, 숫자, underscore(_), $를 포함할 수 있다.
그 외의 특수문자를 사용하려면 double-quotation (")으로 묶어야 한다.

PROFILE { profile_name | DEFAULT | NULL }

비밀번호 관리 정책을 위한 profile을 할당한다.

PROFILE 절을 생략할 경우, PROFILE NULL과 동일하며 profile이 적용되지 않는다.
비밀번호 관리 정책에 대한 자세한 내용은 CREATE PROFILE 을 참조한다.

PASSWORD EXPIRE

사용자의 비밀번호 유효기간을 만료시킨다.
사용자가 login 하기 전에 강제로 비밀번호를 변경하도록 하기 위해 사용한다.

ACCOUNT { LOCK | UNLOCK }

DEFAULT TABLESPACE tablespace_name

User가 생성하는 테이블, 인덱스 (LOGGING) 등의 객체가 저장될 기본 TABLESPACE를 지정한다.
DEFAULT TABLESPACE 절을 생략할 경우, DATABASE를 생성할 때 정의한 default data tablespace (MEM_DATA_TBS)가 지정된다.

TEMPORARY TABLESPACE tablespace_name

User가 생성하는 임시 테이블, 인덱스 (NO LOGGING), 질의 처리 과정에서 생성되는 중간 결과들을 저장할 TABLESPACE를 지정한다.
TEMPORARY TABLESPACE 절을 생략할 경우, DATABASE를 생성할 때 정의한 default temporary tablespace (MEM_TEMP_TBS)가 지정된다.

INDEX TABLESPACE { tablespace_name | NULL }

User가 생성하는 인덱스 객체가 저장되는 기본 TABLESPACE를 지정한다.

INDEX TABLESPACE 절을 생략할 경우, INDEX TABLESPACE NULL 이다.

<schema clause>

User가 기본적으로 사용할 스키마를 생성한다.
Database 내에 동일한 스키마 이름이 존재하지 않아야 한다.
<schema clause>를 명시하지 않을 경우, 기본값은 WITH SCHEMA이고 user_identifier와 동일한 이름의 스키마가 생성된다.
사용자가 소유할 스키마는 CREATE SCHEMA 구문을 사용하여 추가로 생성할 수 있다.

설명

User는 권한의 집합으로 구성된 authorization 객체이다.

최초로 <user definition> 구문을 수행할 때 어떠한 권한도 부여받지 않은 user가 생성되고 다음과 같이 적절한 권한을 부여해야 한다.

GOLDILOCKS에서 user와 schema의 관계는 1 : N 이다.
즉, user가 소유한 schema가 존재하지 않을 수도 있고 다수의 schema를 소유할 수도 있다.

SQL 표준은 user, schema, database 등의 non-schema 객체들의 관계에 대해 명확히 정의하지 않고 있다. 반면, 각 DBMS 들은 다음과 같이 non-schema 객체 간의 관계를 상이하게 정의하고 있다.

DBMS별 user와 schema 관계


• Oracle

∘ User : schema = 1 : 1의 관계이다.


• DB2

∘ OS user와 동일하다.

∘ User를 생성하고 삭제하는 별도의 SQL 구문이 없다.


• Postgres

∘ User : schema = 1 : N의 관계이다.


• MySQL

∘ Database : schema = 1 : 1의 관계이다.

∘ User는 database (schema)의 하위 객체이다.

사용 예

사용자를 생성하고 생성한 사용자가 객체를 생성하고 데이터를 조작하도록 하려면 다음과 같이 권한을 부여해야 한다.

다음은 사용자를 생성하고 그 사용자에게 권한을 부여하는 예이다.

• Create a user.

gSQL> CREATE USER u1 IDENTIFIED BY u1_password
             DEFAULT   TABLESPACE mem_data_tbs
             TEMPORARY TABLESPACE mem_temp_tbs
             INDEX TABLESPACE NULL;

User created.

gSQL> COMMIT;

Commit complete.

• Grant database privileges.

gSQL> GRANT CREATE SESSION ON DATABASE TO u1;

Grant succeeded.

COMMIT;

Commit complete.

• Grant schema privileges.

GRANT CREATE TABLE, CREATE VIEW, CREATE INDEX, CREATE SEQUENCE, ADD CONSTRAINT 
      ON SCHEMA u1 TO u1;

Grant succeeded.

COMMIT;

Commit complete.

• Grant tablespace privileges.

GRANT CREATE OBJECT ON TABLESPACE mem_data_tbs TO u1;

Grant succeeded.

GRANT CREATE OBJECT ON TABLESPACE mem_temp_tbs TO u1;

Grant succeeded.

COMMIT;

Commit complete.

다음은 사용자가 객체를 생성하는 예이다.

• It needs CREATE SESSION ON DATABASE.
gSQL> \connect u1 u1_password
• It needs CREATE TABLE ON SCHEMA u1. 
• It needs CREATE OBJECT ON TABLESPACE mem_data_tbs.
gSQL> CREATE TABLE u1.t1 ( c1 INTEGER, c2 INTEGER ) TABLESPACE mem_data_tbs;

Table created.

gSQL> COMMIT;
• It needs CREATE INDEX ON SCHEMA u1. 
• It needs CREATE OBJECT ON TABLESPACE mem_temp_tbs.
gSQL> CREATE INDEX u1.idx ON t1 (c2) TABLESPACE mem_temp_tbs;

Index created.

gSQL> COMMIT;
• It needs ADD CONSTRAINT ON SCHEMA u1.
gSQL> ALTER TABLE t1 ADD CONSTRAINT u1.t1_pk PRIMARY KEY (c1) ;

Table altered.

gSQL> COMMIT;
• It needs CREATE SEQUENCE ON SCHEMA u1.
gSQL> CREATE SEQUENCE u1.seq;

Sequence created.

gSQL> COMMIT;

gSQL> INSERT INTO u1.t1 VALUES ( u1.seq.NEXTVAL, u1.seq.NEXTVAL );

1 row created

gSQL> COMMIT;

호환성

SQL 표준에서는 user 개념은 다루고 있지만 user 생성 및 삭제와 관련된 SQL 구문은 정의하지 않고 있다.

참조

관련 내용은 다음을 참조한다.

CREATE VIEW

기능

View를 정의한다.

구문

<view definition> ::=
    CREATE [ OR REPLACE ] [ FORCE | NO FORCE ] 
        VIEW view_name [ ( column_name [, ...] ) ]
        AS <query expression>
    ;

사용 범위 및 접근 권한

<view definition> 구문을 수행하려면 사용자가 다음 조건들을 만족해야 한다.

구문 규칙 및 파라미터

[ OR REPLACE ]

이미 존재하는 view가 있을 경우, 기존의 view를 대체한다.

[ FORCE | NO FORCE ]

view_name

생성할 view의 이름이며, 스키마 내에서 유일한 이름이어야 한다. 
schema_name.view_name과 같이 view가 속할 스키마를 정의할 수 있는데 schema_name을 생략할 경우,구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.
View 이름의 길이는 128 바이트보다 작아야 한다.

[ ( column_name [, ...] ) ]

View를 구성할 column의 이름을 정의한다. 
각 column의 이름은 view 내에서 고유한 이름이어야 한다.

Column의 개수는 SELECT 절의 결과 column 개수와 동일해야 한다.

Column 이름의 리스트를 생략할 경우, <query expression>의 SELECT 절의 column 이름을 사용한다.

AS <query expression>

View를 생성하는 SELECT 질의이다.

<query expression>에는 다음과 같은 변수를 포함할 수 없다.

설명

View는 질의에 이름을 부여한 객체로써 table과 유사한 방식으로 사용할 수 있다.

View를 포함하는 질의를 수행할 때 해당 view는 view 정의에 포함된 질의로 해석된다. 예를 들어, 다음과 같이 view가 참조하는 table이 변경되면 view 정의에 포함된 asterisk (*) 등은 변경된 table 정보에 따라 자동으로 재해석된다.

gSQL> CREATE VIEW v1 AS SELECT * FROM t1;
gSQL> COMMIT;
gSQL> SELECT * FROM v1;

ID NAME     
-- ---------
 1 leekmo   
 2 mkkim    
 3 egonspace

3 rows selected.

gSQL> ALTER TABLE t1 ADD COLUMN ( dept_id  INTEGER,  addr  VARCHAR(1024) );
gSQL> COMMIT;

gSQL> select * from v1;

ID NAME      DEPT_ID ADDR
-- --------- ------- ----
 1 leekmo       null null
 2 mkkim        null null
 3 egonspace    null null

3 rows selected.

FORCE 옵션을 사용하여 질의에 에러가 존재하는 상태로 view를 생성하거나, view가 참조하는 테이블이나 view가 변경 또는 제거되었을 경우 해당 view에 영향을 미친다.

이런 정보는 INFORMATION_SCHEMA.VIEWS 정보로부터 조회할 수 있다.

View의 최대 생성 개수와 view 내부에 생성 가능한 최대 column 개수에는 제한이 없으므로 저장 공간에 문제가 없는 한 계속 생성할 수 있다.

사용 예

다음은 view를 생성하는 예이다.

gSQL> CREATE VIEW v1 AS SELECT * FROM t1 WHERE dept_id = 101;

View created.

다음은 view를 정의하면서 column 이름을 정의하는 예이다.

gSQL> CREATE VIEW v1 ( v_id, v_name )
          AS SELECT id, name FROM t1 WHERE dept_id = 101;

View created.

다음은 기존 view가 있을 경우 REPLACE 옵션을 사용하여 이를 제거하고 새로 view를 생성하는 예이다.

gSQL> CREATE OR REPLACE VIEW v1(id, name) 
             AS SELECT id, name FROM t1;

View created.

다음은 view가 참조하는 객체가 존재하지 않더라도 FORCE 옵션을 사용하여 해당 view를 강제로 생성하는 예이다.

gSQL> CREATE FORCE VIEW v1 
          AS SELECT * FROM t1 WHERE dept_id = 101;

ERR-01000(16243): Warning: View created with compilation errors
ERR-42000(16040): table or view does not exist : 
    AS SELECT * FROM t1 WHERE dept_id = 101
                     *
ERROR at line 2:

View created.

호환성

SQL 표준에서는 다음과 같은 절을 정의하지 않고 있다.

SQL 표준 호환성

Feature ID

설명

지원 여부

T131

Recursive query

O

F751

View CHECK enhancements

X

S043

Enhanced reference types

X

T111

Updatable joins, unions, and columns

X

F852

Top-level <order by clause> in views

O

F864

Top-level <result offset clause> in views

O

F859

Top-level <fetch first clause> in views

O

S081

Subtables

X

참조

관련 내용은 다음을 참조한다.

DECLARE cursor_name

기능

커서를 선언한다.

구문

<declare cursor> ::=
    DECLARE cursor_name <cursor properties> { FOR | IS } <cursor specification>
    ;

<cursor properties> ::=
      [ <cursor sensitivity> ] [ <cursor scrollability>] ] CURSOR [ <cursor holdability> ] 
    | [ <odbc cursor type] CURSOR [ <cursor holdability> ] 

<cursor sensitivity> ::=
      INSENSITIVE
    | SENSITIVE
    | ASENSITIVE

<cursor scrollability> ::=
      NO SCROLL
    | SCROLL

<cursor holdability> ::=
      WITH HOLD
    | WITHOUT HOLD

<odbc cursor type> ::=
      STATIC
    | KEYSET

<cursor specification> ::=
      statement_name
    | <cursor query>  [ <updatability clause> ]

<cursor query> ::=
      <select statement>
    | <insert returning query statement>
    | <update returning query statement>
    | <delete returning query statement>

<updatability clause> ::=
      FOR READ ONLY 
    | FOR UPDATE [ OF <column name list> ] [ <lock wait mode> ]

<lock wait mode> ::=
    | WAIT
    | WAIT second
    | NOWAIT

사용 범위 및 접근 권한

statement_name을 사용한 동적 커서 (dynamic cursor)는 embedded SQL에서 사용할 수 있다.

<cursor query>의 유형에 따라 적절한 접근 권한을 가져야 한다. 
접근 권한에 대한 자세한 내용은 다음을 참조한다.

구문 규칙 및 파라미터

cursor_name

선언할 커서의 이름이다. 
하나의 session 내에서 고유한 이름이어야 한다. 
커서 이름의 길이는 128 바이트보다 작아야 한다.

{ FOR | IS }

SQL 표준에서는 구문 키워드로 FOR나 IS 중에 하나를 사용한다.

<cursor properties>

커서의 속성을 정의한다.

updatable query

Cursor 속성 중에 SENSITIVE나 FOR UPDATE를 사용하려면 cursor의 query가 base table의 row 변화를 식별하거나 row에 lock을 획득할 수 있는 updatable query 여야 한다.

updatable query는 다음 조건을 모두 만족해야 한다.

<cursor sensitivity>

커서를 운용할 때 query 결과에 영향을 미치는 다음과 같은 데이터 변화를 볼 수 있는지 여부를 설정한다.

<cursor scrollability>

Cursor의 result set을 순차적 또는 비순차적으로 fetch 할 수 있는지 여부를 명시한다.

<cursor holdability>

Cursor를 OPEN하고 트랜잭션을 commit 한 후에도 cursor가 유지되는지 여부를 설정한다.

<odbc cursor type>

ODBC 표준의 cursor 유형으로 SCROLL 속성을 갖는다.

FOR [UPDATE / READ ONLY] 구문과 query 유형에 따른 sensitivity 결정

Updatability

Query 유형

Sensitivity

FOR UPDATE

Updatable query

SENSITIVE

FOR UPDATE

Non-updatable query

Query error

FOR READ ONLY

Any query

INSENSITIVE

N/A

Updatable query

SENSITIVE

N/A

Non-updatable query

INSENSITIVE

<cursor specification>

Cursor의 대상이 되는 query를 정의한다. 
statement_name을 사용할 경우, query가 정해지지 않은 동적 커서 (dynamic cursor)가 선언되고, <cursor query>를 사용할 경우, query가 정해진 고정 커서 (standing cursor)가 선언된다.

statement_name

Cursor가 참조할 statement_name이며 embedded SQL에서 사용할 수 있다.

statement_name은 <declare cursor> 구문을 수행하기 전에 존재해야 하며, statement_name이 참조하는 SQL 문장은 PREPARE statement_name 구문이 준비한 query여야 한다.

Query가 아닐 경우 OPEN cursor_name 구문을 수행할 때 error가 발생한다.

<cursor query>

Cursor에서 사용할 수 있는 query 유형은 다음 각 구문을 참조한다.

<updatability clause>

Cursor를 이용해 row를 변경할지 여부를 명시한다.

FOR UPDATE OF …

커서를 OPEN 할 때 lock 획득과 관련된 column을 나열한다.

<lock wait mode>

FOR UPDATE 구문과 함께 사용하며, lock 획득 방법을 지정한다.

설명

Query에 대한 속성을 제어할 때 DECLARE CURSOR 구문과 OPEN, FETCH, CLOSE 구문을 사용할 경우, 서버의 커서를 제어하기 때문에 ODBC statement나 JDBC statement를 이용하여 cursor를 사용하는 경우보다 성능상 부하가 걸린다.

Query를 수행하기 전에 ODBC statement와 JDBC statement를 이용해 cursor 속성을 제어할 수 있으며, DECLARE CURSOR 구문을 통한 SQL cursor의 속성 제어 방법과 이에 대응하는 ODBC 표준과 JDBC 표준의 cursor 속성 제어 방법은 다음과 같다.

ODBC/ JDBC의 커서 속성 제어

Property

분류

GOLDILOCKS

cursor property

ODBC 표준의 cursor 속성 설정

JDBC 표준의 cursor 속성 설정

Sensitivity

INSENSITIVE

SQLSetStmtAttr(stmt, SQL_ATTR_CURSOR_SENSITIVITY, SQL_INSENSITIVE, len)

설정할 수 없음

SENSITIVE

SQLSetStmtAttr(stmt, SQL_ATTR_CURSOR_SENSITIVITY, SQL_SENSITIVE, len)

설정할 수 없음

ASENSITIVE

SQLSetStmtAttr(stmt, SQL_ATTR_CURSOR_SENSITIVITY, SQL_UNSPECIFIED, len)

설정할 수 없음

Scrollability

NO SCROLL

SQLSetStmtAttr(stmt, SQL_ATTR_CURSOR_SCROLLABLE, SQL_NONSCROLLABLE, len)

설정할 수 없음

SCROLL

SQLSetStmtAttr(stmt, SQL_ATTR_CURSOR_SCROLLABLE, SQL_SCROLLABLE, len)

설정할 수 없음

Holdability

WITHOUT HOLD

설정할 수 없음

java.sql.Connection::prepareStatement( query, type, conc, ResultSet.CLOSE_CURSORS_AT_COMMIT )

WITH HOLD

설정할 수 없음

java.sql.Connection::prepareStatement( query, type, conc, ResultSet.HOLD_CURSORS_OVER_COMMIT )

ODBC cursor type에 대응되는 SQL cursor 선언은 다음과 같다.

ODBC 커서 type에 대응되는 SQL 커서 선언

ODBC cursor type

SQL cursor 선언

SQLSetStmtAttr(stmt, SQL_ATTR_CURSOR_TYPE, SQL_CURSOR_FORWARD_ONLY, len)

NO SCROLL CURSOR

SQLSetStmtAttr(stmt, SQL_ATTR_CURSOR_TYPE, SQL_CURSOR_STATIC, len)

STATIC CURSOR

SQLSetStmtAttr(stmt, SQL_ATTR_CURSOR_TYPE, SQL_CURSOR_KEYSET_DRIVEN, len)

KEYSET CURSOR

JDBC cursor type에 대응되는 SQL cursor 선언은 다음과 같다.

JDBC 커서 type에 대응되는 SQL 커서 선언

JDBC cursor type

SQL cursor 선언

java.sql.Connection::prepareStatement( query, ResultSet.TYPE_FORWARD_ONLY, conc, hold )

INSENSITIVE NO SCROLL CURSOR

java.sql.Connection::prepareStatement( query, ResultSet.TYPE_SCROLL_INSENSITIVE, conc, hold )

INSENSITIVE SCROLL CURSOR

java.sql.Connection::prepareStatement( query, ResultSet.TYPE_SCROLL_SENSITIVE, conc, hold )

SENSITIVE SCROLL CURSOR

사용 예

다음은 interactive sql (gsql)을 사용하여 cursor를 선언하고 사용하는 예이다.

gSQL> DECLARE cur1 CURSOR FOR SELECT id, data FROM t1;

Cursor declared.

gSQL> OPEN cur1;

Cursor is open.

gSQL> \var v_id   INTEGER
gSQL> \var v_data VARCHAR(128)

gSQL> FETCH cur1 INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   1 data_1

1 row fetched.

gSQL> FETCH cur1 INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   2 data_2

1 row fetched.

gSQL> FETCH cur1 INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   3 data_3

1 row fetched.

gSQL> FETCH cur1 INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   4 data_4

1 row fetched.

gSQL> FETCH cur1 INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   5 data_5

1 row fetched.

gSQL> FETCH cur1 INTO :v_id, :v_data;

no rows fetched.

gSQL> CLOSE cur1;

Cursor closed.

다음은 KEYSET 커서를 선언하고 순차적으로 검색한 후, UPDATE, DELETE 구문에 대한 transaction이 완료된 후에 이를 역방향으로 검색하는 예이다.

gSQL> DECLARE cur_keyset KEYSET CURSOR FOR SELECT id, data FROM t1;

Cursor declared.

gSQL> OPEN cur_keyset;

Cursor is open.

gSQL> \var v_id   INTEGER
gSQL> \var v_data VARCHAR(128)

gSQL> FETCH NEXT cur_keyset INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   1 data_1

1 row fetched.


gSQL> FETCH NEXT cur_keyset INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   2 data_2

1 row fetched.

gSQL> FETCH NEXT cur_keyset INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   3 data_3

1 row fetched.

gSQL> FETCH NEXT cur_keyset INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   4 data_4

1 row fetched.

gSQL> FETCH NEXT cur_keyset INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   5 data_5

1 row fetched.

gSQL> FETCH NEXT cur_keyset INTO :v_id, :v_data;

no rows fetched.

gSQL> UPDATE t1 SET data = 'new data_2' WHERE id = 2;

1 row updated.

gSQL> COMMIT;

Commit complete.

gSQL> DELETE FROM t1 WHERE id = 4;

1 row deleted.

gSQL> COMMIT;

Commit complete.

gSQL> FETCH PRIOR cur_keyset INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   5 data_5

1 row fetched.


gSQL> FETCH PRIOR cur_keyset INTO :v_id, :v_data;

no rows fetched.


gSQL> FETCH PRIOR cur_keyset INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   3 data_3

1 row fetched.

gSQL> FETCH PRIOR cur_keyset INTO :v_id, :v_data;

V_ID V_DATA    
---- ----------
   2 new data_2

1 row fetched.

gSQL> FETCH PRIOR cur_keyset INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   1 data_1

1 row fetched.

gSQL> CLOSE cur_keyset;

Cursor closed.

다음은 SCROLL 커서를 선언하고 fetch orientation을 통해 커서를 사용하는 예이다.

gSQL> DECLARE cur_scroll SCROLL CURSOR FOR SELECT id, data FROM t1;

Cursor declared.

gSQL> OPEN cur_scroll;

Cursor is open.

gSQL> \var v_id   INTEGER
gSQL> \var v_data VARCHAR(128)

gSQL> FETCH LAST cur_scroll INTO :v_id, :v_data;
V_ID V_DATA
---- ------
   5 data_5

1 row fetched.


gSQL> FETCH PRIOR cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   4 data_4

1 row fetched.


gSQL> FETCH FIRST cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   1 data_1

1 row fetched.


gSQL> FETCH ABSOLUTE 3 cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   3 data_3

1 row fetched.


gSQL> FETCH RELATIVE -1 cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   2 data_2

1 row fetched.


gSQL> FETCH ABSOLUTE 3 cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   3 data_3

1 row fetched.

gSQL> CLOSE cur_scroll;

Cursor closed.

호환성

<declare cursor> 구문은 SQL 표준과 비교하여 다음과 같은 차이가 있다.

SQL 표준 호환성

Feature ID

설명

지원 여부

F831

Full cursor update

O

T231

Sensitive cursors

O

F791

Insensitive cursors

O

F431

Read-only scrollable cursors

O

T471

Result sets return value

X

T551

Optional key words for default syntax

O

T111

Updatable joins, unions, and columns

X

B031

Basic dynamic SQL

O

참조

관련 내용은 다음을 참조한다.

DELETE FROM

기능

테이블의 row들을 삭제한다.

구문

<delete statement: searched> ::=
    DELETE [ FROM ] table_name [ [ AS ] alias_name ]
        [ WHERE <search condition> ]
        [ <result offset clause> ]
        [ <fetch limit clause> ]
    ;

<result offset clause> ::=
    OFFSET skip_count [ ROW | ROWS ]

<fetch limit clause> ::=
      <fetch first clause>
    | <limit clause>

<fetch first clause> ::=
    FETCH [ FIRST | NEXT ] [ row_count ] [ ROW ONLY | ROWS ONLY ]

<limit clause>
    LIMIT { fetch_row_count | offset_row_count, fetch_row_count | ALL }

사용 범위 및 접근 권한

<delete statement: searched> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

table_name

Row를 삭제할 대상 테이블의 이름이다. 
schema_name.table_name과 같이 테이블이 소속한 스키마를 정의할 수 있는데 schema_name을 생략할 경우 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.

[ AS alias_name ]

table_name의 alias 이다.

WHERE <search condition>

WHERE 조건을 만족하는 row를 삭제한다.
WHERE 조건을 명시하지 않은 경우, 모든 row를 삭제한다.
WHERE 조건의 자세한 내용은 SELECT 구문의 where clause를 참조한다.

<result offset clause>

질의 결과 중 건너뛸 row의 개수를 명시한다.
자세한 내용은 SELECT 구문의 offset limit clause를 참조한다.

<fetch limit clause>

Fetch 할 row의 개수를 명시하는 구문으로써 다음 두 가지 방법이 사용된다.

설명

DELETE 관련 구문들의 차이점

사용 예

다음은 DELETE 구문의 예이다.

gSQL> DELETE FROM t1 WHERE id > 3;

2 rows deleted.

다음은 <result offset clause>와 <fetch first clause>를 이용하여 조건을 만족하는 row들 중 일부 row들을 (두 건) 건너뛰고 일부 row들만 (두 건) 삭제하는 예이다.

gSQL> DELETE FROM t1 OFFSET 2 FETCH 2;

2 rows deleted.


gSQL> SELECT * FROM t1 ORDER BY 1;

ID DATA  
-- ------
 1 data_1
 2 data_2
 5 data_5

3 rows selected.

호환성

SQL 표준은 DELETE 구문에서 다음 절을 정의하지 않고 있다.

SQL 표준 호환성

Feature ID

설명

지원 여부

F781

Self-referencing operations

X

T111

Updatable joins, unions, and columns

X

참조

관련 내용은 다음을 참조한다.

DELETE FROM name RETURNING

기능

테이블의 row들을 삭제하고, 삭제한 row들을 검색한다.

구문

<delete returning query statement> ::=
    DELETE [ FROM ] table_name [ [ AS ] alias_name ]
        [ WHERE <search condition> ]
        [ <result offset clause> ]
        [ <fetch limit clause> ]
        <returning clause>
    ;

<result offset clause> ::=
    OFFSET skip_count [ ROW | ROWS ]

<fetch limit clause> ::=
      <fetch first clause>
    | <limit clause>

<fetch first clause> ::=
    FETCH [ FIRST | NEXT ] [ row_count ] [ ROW ONLY | ROWS ONLY ]

<limit clause>
    LIMIT { fetch_row_count | offset_row_count, fetch_row_count | ALL }

<returning clause> ::=
    { RETURN | RETURNING } { * | { <value expression> [ [AS] alias_name] } [, ...] }

사용 범위 및 접근 권한

<delete returning query statement> 구문을 수행하려면 사용자가 다음 조건들을 만족해야 한다.

구문 규칙 및 파라미터

table_name

Row를 삭제할 대상 테이블의 이름이다.

[ AS alias_name ]

table_name의 alias 이다.

WHERE <search condition>

WHERE 조건을 만족하는 row를 삭제한다.
자세한 내용은 DELETE FROM 구문을 참조한다.

<result offset clause>

질의 결과 중에 건너뛸 row의 개수를 명시한다.
자세한 내용은 DELETE FROM 구문을 참조한다.

<fetch first clause>

Fetch 할 row의 개수를 명시한다.
자세한 내용은 DELETE FROM 구문을 참조한다.

<limit clause>

Fetch 할 row의 개수를 명시하거나 질의 결과 중 건너뛸 row의 개수와 fetch 할 row의 개수를 동시에 명시한다.
자세한 내용은 DELETE FROM 구문을 참조한다.

<returning clause>

삭제된 row들을 결과 집합으로 하고, 이들 중에서 검색할 column을 기술한다.

RETURN과 RETURNING은 동일한 의미의 키워드이다.

설명

자세한 내용은 DELETE 관련 구문들의 차이점을 참조한다.

사용 예

다음은 조건을 만족하는 row들을 삭제하고 삭제한 row들을 검색하는 예이다.

gSQL> DELETE FROM t1 WHERE id > 3 RETURNING *;

ID DATA  
-- ------
 4 data_4
 5 data_5

2 rows deleted.

다음은 RETURNING 절에 연산을 사용하여 삭제한 row들의 정보를 조회하는 예이다.

gSQL> DELETE FROM t1 
             WHERE id > 3 
             RETURNING 'ID: ' || id || ', DATA: ' || data AS id_data;

ID_DATA            
-------------------
ID: 4, DATA: data_4
ID: 5, DATA: data_5

2 rows deleted.

호환성

SQL 표준에는 <delete returning query statement> 구문이 존재하지 않는다.

참조

관련 내용은 다음을 참조한다.

DELETE FROM name RETURNING .. INTO

기능

테이블에서 row 하나를 삭제하고, 삭제한 row의 값을 호스트 변수에 얻어온다.

구문

<delete returning query statement> ::=
    DELETE [ FROM ] table_name [ [ AS ] alias_name ]
        [ WHERE <search condition> ]
        [ <result offset clause> ]
        [ <fetch limit clause> ]
        <returning into clause>
    ;

<result offset clause> ::=
    OFFSET skip_count [ ROW | ROWS ]


<fetch limit clause> ::=
      <fetch first clause>
    | <limit clause>


<fetch first clause> ::=
    FETCH [ FIRST | NEXT ] [ row_count ] [ ROW ONLY | ROWS ONLY ]


<limit clause>
    LIMIT { fetch_row_count | offset_row_count, fetch_row_count | ALL }


<returning into clause> ::=
    { RETURN | RETURNING } { * | { <value expression> [ [AS] alias_name] } [, ...] } INTO variable_name [, ...]

사용 범위 및 접근 권한

<delete returning into statement> 구문을 수행하려면 사용자가 다음 조건들을 만족해야 한다.

구문 규칙 및 파라미터

table_name

Row를 삭제할 대상 테이블의 이름이다.

[ AS alias_name ]

table_name의 alias 이다.

WHERE <search condition>

WHERE 조건을 만족하는 row를 삭제한다.
자세한 내용은 DELETE FROM 구문을 참조한다.

<result offset clause>

질의 결과 중 건너뛸 row의 개수를 명시한다.
자세한 내용은 DELETE FROM 구문을 참조한다.

<fetch first clause>

Fetch 할 row의 개수를 명시한다.
자세한 내용은 DELETE FROM 구문을 참조한다.

<limit clause>

Fetch 할 row의 개수를 명시하거나 질의 결과 중 건너뛸 row의 개수와 fetch 할 row의 개수를 동시에 명시한다.
자세한 내용은 DELETE FROM 구문을 참조한다.

<returning into clause>

설명

삭제할 row가 하나 이하여야 한다. 
둘 이상의 row가 삭제되면 에러가 발생한다.
자세한 내용은 DELETE 관련 구문들의 차이점을 참조한다.

사용 예

다음은 interactive SQL (gsql)에서 row를 삭제하고 삭제된 row의 값을 호스트 변수에 얻어오는 예이다.

gSQL> \var v_id    INTEGER
gSQL> \var v_data  VARCHAR(128)

gSQL> DELETE FROM t1 WHERE id = 3 RETURNING id, data INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   3 data_3

1 row deleted.

호환성

SQL 표준에는 <delete returning into statement> 구문이 존재하지 않는다.

참조

관련 내용은 다음을 참조한다.

DELETE FROM name WHERE CURRENT OF cursor_name

기능

커서가 가리키는 row 하나를 삭제한다.

구문

<delete statement: positioned> ::=
    DELETE [ FROM ] table_name [ [ AS ] alias_name ]
        WHERE CURRENT OF cursor_name
    ;

사용 범위 및 접근 권한

<delete statement: positioned> 구문을 수행하려면 사용자에게 DELETE FROM 구문을 수행할 수 있는 권한이 있어야 한다.

구문 규칙 및 파라미터

table_name

Row를 삭제할 대상 테이블의 이름이다.

[ AS alias_name ]

table_name의 alias 이다.

cursor_name

cursor_name에 해당하는 커서는 다음 조건을 만족해야 한다.

설명

자세한 내용은 DELETE 관련 구문들의 차이점을 참조한다.

사용 예

다음은 interactive SQL (gsql)에서 FOR UPDATE 커서를 선언하고 그 커서를 이용해 row를 삭제하는 예이다.

gSQL> DECLARE cur1 CURSOR FOR SELECT id, data FROM t1 FOR UPDATE;

Cursor declared.


gSQL> OPEN cur1;

Cursor is open.


gSQL> \var v_id   INTEGER
gSQL> \var v_data VARCHAR(128)

gSQL> FETCH cur1 INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   1 data_1

1 row fetched.

gSQL> FETCH cur1 INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   2 data_2

1 row fetched.

gSQL> DELETE FROM t1 WHERE CURRENT OF cur1;

1 row deleted.

gSQL> FETCH cur1 INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   3 data_3

1 row fetched.

gSQL> FETCH cur1 INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   4 data_4

1 row fetched.

gSQL> DELETE FROM t1 WHERE CURRENT OF cur1;

1 row deleted.

gSQL> FETCH cur1 INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   5 data_5

1 row fetched.

gSQL> FETCH cur1 INTO :v_id, :v_data;

no rows fetched.

gSQL> CLOSE cur1;

Cursor closed.

gSQL> SELECT id, data FROM t1 ORDER BY 1;

ID DATA  
-- ------
 1 data_1
 3 data_3
 5 data_5

3 rows selected.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

S111

ONLY in query expressions

X

B031

Basic dynamic SQL

O

참조

관련 내용은 다음을 참조한다.

DROP AUDIT POLICY

기능

Audit policy를 제거한다.

구문

<drop audit policy statement> ::= 
    DROP AUDIT POLICY [ IF EXISTS ] policy_name
;

사용 범위 및 접근 권한

<drop audit policy statement> 구문을 수행하려면 사용자에게 AUDIT SYSTEM ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

IF EXISTS

policy_name이 존재하지 않더라도 에러가 발생하지 않는다.

policy_name

제거할 audit policy 객체의 이름이다.

설명

이미 활성화된 audit policy 객체는 제거할 수 없다. 이 경우, NOAUDIT POLICY 구문을 이용해 audit policy를 비활성화해야 한다.

사용 예

다음은 audit policy를 제거하는 예이다.

DROP AUDIT POLICY policy_table;

호환성

SQL 표준에는 audit policy가 존재하지 않는다.

참조

관련 내용은 다음을 참조한다.

DROP CLUSTER GROUP

기능

Cluster group을 cluster system에서 제거한다.

구문

<drop cluster group statement> ::=
    DROP CLUSTER GROUP [IF EXISTS] group_name
    ;

사용 범위 및 접근 권한

Cluster system에서 수행할 수 있다. 
<drop cluster group statement> 구문을 수행하려면 사용자에게 ADMINISTRATION ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

[IF EXISTS]

Cluster group이 존재하지 않더라도 에러가 발생하지 않는다.

group_name

Cluster group의 이름이다. 
Shard가 존재하지 않는 cluster group을 제거할 수 있다.

설명

Cluster group을 제거하더라도 data loss가 발생하지 않는 경우에 해당 cluster group을 제거할 수 있다.
단, global coordinator를 포함하는 group을 제거하려 할 경우, 에러가 발생할 수 있다.

사용 예

다음은 cluster group을 제거하는 예이다.

gSQL> DROP CLUSTER GROUP g3;

Cluster Group dropped.

호환성

SQL 표준에서는 cluster에 대한 개념을 정의하지 않고 있다.

참조

관련 내용은 CREATE CLUSTER GROUP을 참조한다.

DROP CLUSTER LOCATION

기능

Cluster member의 접속 정보를 삭제한다.

구문

<drop cluster location statement> ::=
    DROP CLUSTER LOCATION member_name 
    ;

사용 범위 및 접근 권한

Cluster system에서 수행할 수 있다. 
<drop cluster location statement> 구문을 수행하려면 사용자에게 ADMINISTRATION ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

member_name

Cluster member의 이름이다. 
등록된 cluster location 정보에 동일한 cluster member 이름이 존재해야 한다. 
이름의 길이는 128 바이트보다 작아야 한다.

설명

기본적으로 cluster location 정보는 cluster group을 생성할 때나 cluster member를 추가할 때 제공되는 접속 정보를 이용하여 자동으로 생성된다. 생성된 정보는 cluster member나 group을 삭제할 때 함께 삭제된다.

만약 cluster location의 접속 정보가 변경되면 cluster member을 삭제하거나 재생성할 필요없이 ALTER CLUSTER LOCATION 을 이용하여 접속 정보를 변경할 수 있다.

사용 예

gSQL> 
DROP CLUSTER LOCATION g1n2
;

Created

호환성

SQL 표준에서는 cluster에 대한 개념을 정의하지 않고 있다.

참조

관련 내용은 다음을 참조한다.

DROP INDEX

기능

인덱스를 제거한다.

구문

<drop index statement> ::=
    DROP INDEX [ IF EXISTS ] index_name
    ;

사용 범위 및 접근 권한

<drop index statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

IF EXISTS

인덱스가 존재하지 않더라도 에러가 발생하지 않는다.

index_name

삭제할 인덱스의 이름이다. 
schema_name.index_name과 같이 인덱스가 속한 스키마를 정의할 수 있는데 schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.
UNIQUE 제약 조건, PRIMARY KEY 제약 조건을 위해 생성한 인덱스는 제거할 수 없다.
위 제약 조건을 위해 생성된 인덱스를 제거하려면 ALTER TABLE name DROP CONSTRAINT 구문을 사용하여 관련된 제약 조건을 삭제해야 한다.

설명

DROP INDEX와 같은 Data Definition Language (DDL) 구문도 트랜잭션이 COMMIT 되기 전이라면 ROLLBACK 할 수 있다.

사용 예

다음은 인덱스를 삭제하는 예이다.

gSQL> DROP INDEX idx_t1_id;

Index dropped.

다음은 IF EXISTS 구문을 사용하여 인덱스가 존재하지 않더라도 에러가 발생하지 않도록 하는 예이다.

gSQL> DROP INDEX IF EXISTS not_exist_index;

Index dropped.

호환성

SQL 표준에서는 인덱스에 대한 개념을 다루지 않고 있다.

참조

관련 내용은 다음을 참조한다.

DROP PROFILE

기능

Profile을 삭제한다.

구문

<drop profile statement> ::= 
    DROP PROFILE [ IF EXISTS ] profile_name [ CASCADE ] ;

사용 범위 및 접근 권한

<drop profile statement> 구문을 수행하려면 사용자에게 DROP PROFILE ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

IF EXISTS

Profile이 존재하지 않더라도 에러가 발생하지 않는다.

profile_name

삭제할 profile의 이름을 명시한다. 
DEFAULT profile은 삭제할 수 없다.

CASCADE

이미 할당받은 사용자들이 존재하는 경우, profile을 삭제하기 위해 반드시 이 절을 명시해야 한다. 
삭제할 profile을 할당받은 사용자들의 profile은 DEFAULT profile로 변경한다.

사용 예

다음은 CASCADE 구문을 사용하여 profile을 삭제하는 예이다.

gSQL> DROP PROFILE prof CASCADE;

Profile dropped.

gSQL> COMMIT;

Commit complete.

호환성

SQL 표준에서는 profile에 대한 개념을 다루지 않고 있다.

참조

관련 내용은 다음을 참조한다.

DROP SCHEMA

기능

스키마를 제거한다.

구문

<drop schema statement> ::=
    DROP SCHEMA [ IF EXISTS ] schema_name
        [ <drop behavior> ]
    ;

<drop behavior> ::=
      RESTRICT
    | CASCADE

사용 범위 및 접근 권한

<drop schema statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

IF EXISTS

스키마가 존재하지 않더라도 에러가 발생하지 않는다.

schema_name

제거할 스키마의 이름이다. 
단, database를 생성할 때 자동으로 생성되는 DICTIONARY_SCHEMA, INFORMATION_SCHEMA, PUBLIC과 같은 built-in 스키마는 제거할 수 없다.

<drop behavior>

설명

DROP SCHEMA와 같은 Data Definition Language (DDL) 구문도 트랜잭션이 COMMIT 되기 전이라면 ROLLBACK 할 수 있다. 이 때, 제거하는 스키마에 포함된 휴지통 객체들도 제거된다.

사용 예

다음은 schema와 schema 내에 존재하는 모든 객체를 함께 제거하는 예이다.

gSQL> DROP SCHEMA s1 CASCADE;

Schema dropped.

다음은 IF EXISTS 구문을 사용하여 schema가 존재하지 않더라도 에러가 발생하지 않도록 하는 예이다.

gSQL> DROP SCHEMA IF EXISTS not_exist_schema;

Schema dropped.

호환성

SQL 표준에서는 IF EXISTS 절을 정의하지 않고 있다.

SQL 표준 호환성

Feature ID

설명

지원 여부

F032

CASCADE drop behavior

O

F381

Extended schema manipulation

O

참조

관련 내용은 CREATE SCHEMA를 참조한다.

DROP SEQUENCE

기능

시퀀스를 제거한다.

구문

<drop sequence generator statement> ::=
    DROP SEQUENCE [ IF EXISTS ] [schema_name.] sequence_name 
    ;

사용 범위 및 접근 권한

<drop sequence generator statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

IF EXISTS

시퀀스가 존재하지 않더라도 에러가 발생하지 않는다.

sequence_name

제거할 시퀀스의 이름이다. 
schema_name.sequence_name과 같이 시퀀스가 속할 스키마를 정의할 수 있는데 schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.

설명

DROP SEQUENCE와 같은 Data Definition Language (DDL) 구문도 트랜잭션이 COMMIT 되기 전이라면 ROLLBACK 할 수 있다.

사용 예

다음은 sequence를 제거하는 예이다.

gSQL> DROP SEQUENCE seq1;

Sequence dropped.

다음은 IF EXISTS 구문을 사용하여 시퀀스가 존재하지 않더라도 에러가 발생하지 않도록 하는 예이다.

gSQL> DROP SEQUENCE invalid_sequence;

ERR-42000(16044): sequence does not exist : 
DROP SEQUENCE invalid_sequence
              *
ERROR at line 1:


gSQL> DROP SEQUENCE IF EXISTS invalid_sequence;

Sequence dropped.

호환성

SQL 표준에서는 IF EXISTS 절을 정의하지 않고 있다.

SQL 표준 호환성

Feature ID

설명

지원 여부

T176

Sequence generator support

O

참조

관련 내용은 다음을 참조한다.

DROP SYNONYM

기능

Synonym을 제거한다.

구문

<drop synonym statement> ::=
    DROP [ PUBLIC ] SYNONYM [ IF EXISTS ] [schema_name.]synonym_name
    ;

사용 범위 및 접근 권한

PUBLIC을 명시하여 public synonym을 제거하려면 DROP PUBLIC SYNONYM ON DATABASE 권한이 있어야 한다.

Private synonym을 제거하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

[ PUBLIC ]

Public synonym을 제거하고자 할 때 명시한다. 
이 절을 생략하면 private synonym이 제거된다.

IF EXISTS

Synonym이 존재하지 않더라도 에러가 발생하지 않는다.

synonym_name

제거할 synonym의 이름이다.
schema_name.synonym_name과 같이 synonym이 속한 스키마를 정의할 수 있는데 schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다. 
PUBLIC을 명시한 경우, 스키마 이름을 명시할 수 없다.

설명

DROP SYNONYM과 같은 Data Definition Language (DDL) 구문도 트랜잭션이 COMMIT 되기 전이라면 ROLLBACK 할 수 있다.

사용 예

다음은 private synonym을 제거하는 예이다.

gSQL> DROP SYNONYM MyEmp;

Synonym dropped.

다음은 public synonym을 제거하는 예이다.

gSQL> DROP PUBLIC SYNONYM MainEmp;

Synonym dropped.

호환성

SQL 표준에서는 DROP SYNONYM 구문을 정의하지 않고 있다.

참조

관련 내용은 CREATE SYNONYM을 참조한다.

DROP TABLE

기능

테이블을 제거한다.

휴지통 기능이 활성화되어 있을 경우, 테이블이 즉시 제거되지 않고 휴지통에 보관된다.

구문

<drop table statement> ::=
    DROP TABLE [ IF EXISTS ] table_name
    [ <drop behavior> ]
    [ PURGE ]
    ;

<drop behavior> ::=
      RESTRICT
    | CASCADE
    | CASCADE CONSTRAINTS

사용 범위 및 접근 권한

<drop table statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

IF EXISTS

테이블이 존재하지 않더라도 에러가 발생하지 않는다.

table_name

제거할 테이블의 이름이다. 
schema_name.table_name과 같이 테이블이 소속한 스키마를 정의할 수 있는데 schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.

Database를 생성할 때 자동으로 생성되는 다음과 같은 테이블들은 삭제할 수 없다.

테이블에 생성된 제약 조건과 인덱스도 함께 제거한다.

drop behavior

현재는 RESTRICT/ CASCADE가 동일하게 동작한다. 
생략할 경우, 기본값은 RESTRICT 이다.

purge

휴지통 기능이 활성화된 경우에도 테이블을 휴지통에 보관하지 않고 즉시 제거한다.

설명

DROP TABLE과 같은 Data Definition Language (DDL) 구문도 트랜잭션이 COMMIT 되기 전이라면 ROLLBACK 할 수 있다.

사용 예

다음은 일반 테이블을 제거하는 예이다.

gSQL> DROP TABLE region;

Table dropped.

다음과 같이 IF EXISTS 구문을 사용하면 테이블이 존재하지 않더라도 에러가 발생하지 않는다.

gSQL> DROP TABLE IF EXISTS invalid_table;

Table dropped.

다음은 DROP 된 테이블을 ROLLBACK 하는 예이다.

gSQL> SELECT r_regionkey, r_name FROM region;

R_REGIONKEY R_NAME                   
----------- -------------------------
          0 AFRICA                   
          1 AMERICA                  
          2 ASIA                     
          3 EUROPE                   
          4 MIDDLE EAST              

5 rows selected.


gSQL> DROP TABLE region;

Table dropped.


gSQL> SELECT r_regionkey, r_name FROM region;

ERR-42000(16040): table or view does not exist : 
SELECT r_regionkey, r_name FROM region
                                *
ERROR at line 1:


gSQL> ROLLBACK;

Rollback complete.


gSQL> SELECT r_regionkey, r_name FROM region;

R_REGIONKEY R_NAME                   
----------- -------------------------
          0 AFRICA                   
          1 AMERICA                  
          2 ASIA                     
          3 EUROPE                   
          4 MIDDLE EAST              

5 rows selected.

호환성

SQL 표준에서는 다음과 같은 절을 정의하지 않고 있다.

SQL 표준 호환성

Feature ID

설명

지원 여부

F032

CASCADE drop behavior

O

참조

관련 내용은 CREATE TABLE을 참조한다.

DROP TABLESPACE

기능

테이블스페이스를 제거한다.

구문

<drop tablespace statement> ::=
    DROP TABLESPACE [ IF EXISTS ] tablespace_name
        [ INCLUDING CONTENTS ]
        [ { AND | KEEP } DATAFILES ]
        [ <drop behavior> ]
    ;

<drop behavior> ::=
      RESTRICT
    | CASCADE
    | CASCADE CONSTRAINTS

사용 범위 및 접근 권한

<drop tablespace definition> 구문을 수행하려면 사용자에게 DROP TABLESPACE ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

IF EXISTS

테이블스페이스가 존재하지 않더라도 에러가 발생하지 않는다.

tablespace_name

제거할 테이블스페이스의 이름이다.

Database를 생성할 때 구축되는 다음과 같은 시스템 테이블스페이스는 제거할 수 없다.

tablespace_name이 사용자들의 default tablespace로 사용되고 있었다면 tablespace가 제거된 후에는 객체를 위한 공간을 할당받을 수 없다. 따라서 tablespace를 제거한 후에 ALTER USER 구문을 사용하여 사용자들의 default tablespace를 변경해 주어야 한다.

INCLUDING CONTENTS

테이블스페이스에 속하는 객체 (table, index, key constraints)를 삭제한다. 테이블스페이스에 속하는 table을 참조하는 index와 key constraints가 테이블스페이스 외부에 존재할 경우에는 이들도 함께 삭제한다.

INCLUDING CONTENTS 구문을 사용하지 않을 경우에는 테이블스페이스에 속하는 객체가 없어야 한다.

[ { AND | KEEP } DATAFILES ]

테이블스페이스를 구성하는 데이터 파일들을 함께 삭제할지 여부를 지정한다. 
Memory temporary tablespace에는 데이터 파일이 존재하지 않으므로, 해당 절은 무시된다.

drop behavior

현재는 RESTRICT/ CASCADE가 동일하게 동작한다. 
생략할 경우, 기본값은 RESTRICT 이다.

설명

다른 Data Definition Language (DDL)과 달리 DROP TABLESPACE 구문은 ROLLBACK 할 수 없으며, 구문을 수행한 transaction이 자동으로 COMMIT 된다. 이 때 제거하는 테이블스페이스에 포함된 휴지통 객체들도 함께 제거된다.

사용 예

다음은 tablespace와 함께 tablespace에 존재하는 모든 객체와 tablespace를 구성하는 모든 data file을 삭제하는 예이다.

gSQL> DROP TABLESPACE space1 INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;

Tablespace dropped.

다음은 IF EXISTS 구문을 사용하여 tablespace가 존재하지 않더라도 에러가 발생하지 않도록 하는 예이다.

gSQL> DROP TABLESPACE IF EXISTS not_exist_tablespace;

Tablespace dropped.

호환성

SQL 표준은 tablespace에 대한 개념을 다루지 않고 있다.

참조

관련 내용은 다음을 참조한다.

DROP USER

기능

데이터베이스 사용자를 제거한다.

구문

<drop user statement> ::=
    DROP USER [ IF EXISTS ] user_identifier [ <drop behavior> ]
    ;

<drop behavior> ::=
      RESTRICT
    | CASCADE

사용 범위 및 접근 권한

<drop user statement> 구문을 수행하려면 사용자에게 DROP USER ON DATABASE 권한이 있어야 한다.

user_identifier가 소유한 스키마가 존재하지 않아야 한다.

스키마 제거에 대한 자세한 내용은 DROP SCHEMA 구문을 참조한다.

구문 규칙 및 파라미터

IF EXISTS

사용자가 존재하지 않더라도 에러가 발생하지 않는다.

user_identifier

제거할 데이터베이스 사용자의 이름이다. 
단, database를 생성할 때 자동으로 생성되는 "SYS" 등과 같은 사용자는 제거할 수 없다.

다음과 같이 user_identifier가 생성했으나, 소유자가 아닌 객체는 제거하지 않는다.

<drop behavior>

DBMS에서 user와 schema의 관계





설명

GOLDILOCKS에서 user와 schema의 관계는 1 : N 이다.
즉, user가 schema를 소유하지 않을 수도 있고, 다수의 schema를 소유할 수도 있다.
User 객체를 제거하려면 user가 소유한 모든 schema를 제거해야 한다. 이 때, 제거하는 user 객체의 휴지통 객체들도 함께 제거된다.

사용 예

다음은 user가 소유한 모든 schema를 제거한 후 해당 user를 제거하는 예이다.

gSQL> DROP SCHEMA u1 CASCADE;

Schema dropped.

gSQL> DROP USER u1 CASCADE;

User dropped.

다음은 IF EXISTS 구문을 사용하여 user가 존재하지 않더라도 에러가 발생하지 않도록 하는 예이다.

gSQL> DROP USER IF EXISTS not_exist_user;

User dropped.

호환성

SQL 표준에서는 user의 개념은 다루고 있지만 user의 생성 및 제거와 관련된 SQL 구문은 정의하지 않고 있다.

참조

관련 내용은 다음을 참조한다.

DROP VIEW

기능

View를 제거한다.

구문

<drop view statement> ::=
    DROP VIEW [ IF EXISTS ] view_name
    ;

사용 범위 및 접근 권한

<drop view statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

IF EXISTS

View가 존재하지 않더라도 에러가 발생하지 않는다.

view_name

제거할 view의 이름이다. 
schema_name.view_name과 같이 테이블이 속한 스키마를 정의할 수 있는데 schema_name을 생략할 경우 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.

설명

DROP VIEW와 같은 Data Definition Language (DDL) 구문도 트랜잭션이 COMMIT 되기 전이라면 ROLLBACK 할 수 있다.

사용 예

다음은 view를 제거하는 예이다.

gSQL> DROP VIEW v1;

View dropped.

다음은 IF EXISTS 구문을 사용하여 view가 존재하지 않더라도 에러가 발생하지 않도록 하는 예이다.

gSQL> DROP VIEW IF EXISTS not_exist_view;

View dropped.

호환성

SQL 표준에서는 IF EXISTS 절을 정의하지 않고 있다.

SQL 표준 호환성

Feature ID

설명

지원 여부

F032

CASCADE drop behavior

X

참조

관련 내용은 다음을 참조한다.

EXECUTE IMMEDIATE 'sql_string'

기능

프로그램 작성 시점에 정의되지 않았던 dynamic SQL 문장을 수행한다.

구문

<execute immediate statement> ::=
    EXECUTE IMMEDIATE <SQL statement variable>
    ;

<SQL statement variable> ::=
      variable_name
    | 'sql statement'
    | "sql statement"
    | sql statement

사용 범위 및 접근 권한

Embedded SQL에서 사용할 수 있다. 
Dynamic SQL 구문의 종류에 부합하는 수행 권한이 있어야 한다.

구문 규칙 및 파라미터

<SQL statement variable>

<SQL statement variable>이 참조하는 dynamic SQL 문장은 host variable (:var)이나 parameter marker (?)를 사용할 수 없다.

다음과 같은 네 가지 유형의 <SQL statement variable>을 사용할 수 있다.

Single-quoted string 내에 문자열 data를 표현하려면 다음과 같이 single quote (')를 두 번 기술해야 한다.

{
    ...
    EXEC SQL EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES ( ''literal data'' )'; 
    ...
}

SQL 문장이 질의 결과를 갖는 query인 경우, 수행에는 성공하지만 그 결과는 얻을 수 없다.

variable_name

variable_name에 대응되는 type은 character string이어야 한다. 
variable_name에 정의된 dynamic SQL 문장은 유효한 문장이어야 한다.

sql statement

sql statement에 정의된 dynamic SQL 문장은 유효한 문장이어야 한다.

설명

EXECUTE IMMEDIATE 'sql_string' 구문은 dynamic embedded SQL 응용 프로그램에서 host variable이 없는 non-query SQL에 사용될 수 있다. 별도의 준비과정이 필요하지 않기 때문에, DDL이나 DML 등을 일회성으로 수행하기에 적합하다.

자세한 내용은 Embedded Dynamic SQL을 참조한다.

사용 예

다음은 EXECUTE IMMEDIATE 'sql_string'이 embedded SQL 소스 코드 내에서 사용되는 예이다.

{
    ...
    sprintf(sSqlStmt, "INSERT INTO EMP_RND\n"
            "SELECT *\n"
            "FROM   EMP\n"
            "WHERE  JOB = 'RND'\n" );
    EXEC SQL EXECUTE IMMEDIATE :sSqlStmt;
    if(sqlca.sqlcode != 0)
    {
        goto fail_exit;
    }
    ...
}

EXECUTE IMMEDIATE 'sql_string'이 사용된 전체 소스 코드는 Dynamic Embedded SQL Example Program에서 확인할 수 있다.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

B031

Basic Dynamic SQL

O

참조

관련 내용은 다음을 참조한다.

EXECUTE statement_name

기능

준비된 statement를 수행한다.

구문

<execute statement> ::=
    EXECUTE statement_name [ <parameter using clause> ] [ <result into clause> ]
    ;

<parameter using clause> ::=
      <using parameter arguments>

<using parameter arguments> ::=
    USING variable_name [, ...]

<result into clause> ::=
      <into result arguments>

<into result arguments> ::=
    INTO variable_name [, ...]

사용 범위 및 접근 권한

Embedded SQL에서 사용할 수 있다. 
Dynamic SQL 구문의 종류에 부합하는 수행 권한이 있어야 한다.

구문 규칙 및 파라미터

statement_name

준비된 statement의 이름이다.
PREPARE statement_name 구문을 사용하여 statement_name을 준비해야 한다.

statement_name이 참조하는 dynamic SQL 문장이 dynamic parameter를 포함하고 있는 경우, <parameter using clause>를 명시해야 한다.

{
    ...
    EXEC SQL PREPARE stmt1 FROM 'DELETE FROM t1 WHERE c1 > ?';
    EXEC SQL EXECUTE stmt1 USING :sValue;
    ...
}
{

    ...
    EXEC SQL PREPARE stmt1 FROM 'SELECT COUNT(*) INTO :v1 FROM t1';
    EXEC SQL EXECUTE stmt1 USING :sValue;
    ...
}

statement_name이 참조하는 dynamic SQL 문장이 query이거나 결과가 존재하는 stored function일 경우, <result into clause>를 명시해야 한다.

{
    ...
    EXEC SQL PREPARE stmt1 FROM 'SELECT COUNT(*) FROM t1';
    EXEC SQL EXECUTE stmt1 INTO :sValue;
    ...
}
질의가 여러 건인 경우 정상적으로 수행되지만 결과는 최초 한 건만 얻을 수 있다. 
여러 건의 결과를 얻기 위해서는 다음과 같은 커서 관련 구문을 사용해야 한다.

질의 결과가 없을 경우, NO DATA로 완료된다.

[ <parameter using clause> ] [ <result into clause> ]

<parameter using clause>와 <result into clause>는 순서에 관계없이 기술할 수 있지만 중복해서 기술하지 않아야 한다.

<parameter using clause>

statement_name이 참조하는 dynamic SQL 문장에 parameter가 존재할 경우, parameter에 대한 정보를 <using parameter arguments> 절로 명시한다.

<using parameter arguments>

<using parameter arguments> 구문이 사용될 경우, variable_name의 개수는 statement_name이 참조하는 dynamic SQL 문장에 포함된 parameter의 개수와 동일해야 한다.

나열된 variable_name은 기술된 순서대로 dynamic parameter 순서에 대응된다.

{

    ...
    EXEC SQL PREPARE stmt1 FROM 'DELETE FROM t1 WHERE c1 IN ( ?, ?, ? )';
    EXEC SQL EXECUTE stmt1 USING :sValue1, :sValue2, :sValue3;
    ... 
}

<result into clause>

statement_name이 참조하는 dynamic SQL 문장이 query일 경우, 결과 column에 대한 정보를 <into result arguments> 절로 명시한다.

결과값이 null인 경우, INDICATOR를 명시하지 않으면 [DATA EXCEPTION, NULL VALUE, NO INDICATOR PARAMETER] 에러가 발생한다.

<into result arguments>

<into result arguments> 구문이 사용될 경우, variable_name의 개수는 statement_name이 참조하는 dynamic SQL 문장의 결과 column 개수와 동일해야 한다.

나열된 variable_name은 기술된 순서대로 dynamic parameter 순서에 대응된다.

{

    ...
    EXEC SQL PREPARE stmt1 FROM 'SELECT MIN(salary), MAX(salary), AVG(salary) FROM employee';
    EXEC SQL EXECUTE stmt1 INTO :sMinValue, :sMaxValue, :sAvgValue;
    ... 
}

설명

statement_name은 embedded SQL 소스 코드에서 precompiler에게 statement를 알려주는 식별자로써 host variable이 아니기 때문에 별도의 type이나 선언이 필요하지 않다. EXECUTE statement_name 구문은 PREPARE statement_name 구문 뒤에 쓰여야 한다.

자세한 내용은 Embedded Dynamic SQL을 참조한다.

사용 예

다음은 EXECUTE statement_name이 embedded SQL 소스 코드에서 사용되는 예이다.

{
    ...
    sprintf( sUpdateSql, "UPDATE EMP SET sal = sal * :v1 WHERE JOB = 'SALES'");
    EXEC SQL PREPARE UPDATE_STMT FROM :sUpdateSql;
    if(sqlca.sqlcode != 0)
    {
        goto fail_exit;
    }

    sRatio = 1.1;
    EXEC SQL EXECUTE UPDATE_STMT USING :sRatio;
    if(sqlca.sqlcode != 0)
    {
        goto fail_exit;
    }
    ...
}

EXECUTE statement_name이 사용된 전체 소스 코드는 Dynamic Embedded SQL Example Program에서 확인할 수 있다.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

B031

Basic dynamic SQL

O

B032

Extended dynamic SQL

X

참조

관련 내용은 다음을 참조한다.

FETCH cursor_name

기능

커서를 결과 집합의 특정 row에 위치시키고, 해당 row의 값을 호스트 변수에 얻어온다.

구문

<fetch statement> ::=
    FETCH [ <fetch orientation> ] [ FROM ] cursor_name 
        <result into clause>
    ;

<fetch orientation> ::=
      NEXT
    | PRIOR
    | FIRST
    | LAST
    | CURRENT
    | ABSOLUTE position
    | RELATIVE position

<result into clause> ::=
      <into result arguments>

<into result arguments> ::=
    INTO variable_name [, ...]

구문 규칙 및 파라미터

[ FROM ] cursor_name

세션 내에서 open 된 커서이어야 한다. 
FROM은 생략할 수 있다.

<fetch orientation>

FETCH NEXT 이외의 <fetch orientation>을 사용하려면 scrollable cursor를 사용해야 한다. 
<fetch orientation>을 생략할 경우, 기본값은 NEXT이다.

Open 된 커서는 결과 집합에 대해 아래 그림과 같은 커서 위치 정보를 갖는다.

커서의 위치 정보

커서의 위치 정보

커서의 위치

커서의 위치

설명

BEFORE THE FIRST ROW

결과 집합의 첫 번째 row의 이전 위치에 있는 상태로써 OPEN 시점의 위치도 이에 해당한다.

ON A CERTAIN ROW

FETCH를 통해 결과 집합의 특정 row에 위치한 상태이다.

AFTER THE LAST ROW

결과 집합의 마지막 row 이후의 위치에 있는 상태이다.

현재 커서의 위치를 기준으로 각 <fetch orientation>은 다음과 같이 동작한다.

<result into clause>

<into result arguments>를 사용하여 결과 column을 획득할 변수 정보를 기술한다.

결과값이 null 인 경우, INDICATOR를 명시하지 않으면 [DATA EXCEPTION, NULL VALUE, NO INDICATOR PARAMETER] 에러가 발생한다.

<into result arguments>

INTO 절에 기술된 변수의 개수는 커서의 결과 집합의 column 개수와 동일해야 한다.

설명

FETCH를 수행한 후에 커서 위치가 BEFORE THE FIRST ROW 거나 AFTER THE LAST LOW 인 경우, <fetch orientation>에 입력된 위치값에 관계없이 동일한 위치에 자리한다.

사용 예

다음은 interactive SQL (gsql)에서 SCROLL 커서를 선언하고, 다양한 <fetch orientation>의 동작을 보여주는 예이다.

gSQL> DECLARE cur_scroll SCROLL CURSOR FOR SELECT id, data FROM t1;

Cursor declared.

gSQL> OPEN cur_scroll;

Cursor is open.

gSQL> \var v_id   INTEGER
gSQL> \var v_data VARCHAR(128)

gSQL> FETCH NEXT cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   1 data_1

1 row fetched.

gSQL> FETCH NEXT cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   2 data_2

1 row fetched.

gSQL> FETCH PRIOR cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   1 data_1

1 row fetched.

gSQL> FETCH PRIOR cur_scroll INTO :v_id, :v_data;

no rows fetched.

gSQL> FETCH FIRST cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   1 data_1

1 row fetched.

gSQL> FETCH FIRST cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   1 data_1

1 row fetched.

gSQL> FETCH LAST cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   5 data_5

1 row fetched.

gSQL> FETCH LAST cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   5 data_5

1 row fetched.

gSQL> FETCH FIRST cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   1 data_1

1 row fetched.

gSQL> FETCH CURRENT cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   1 data_1

1 row fetched.

gSQL> FETCH LAST cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   5 data_5

1 row fetched.

gSQL> FETCH CURRENT cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   5 data_5

1 row fetched.

gSQL> FETCH ABSOLUTE 3 cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   3 data_3

1 row fetched.

gSQL> FETCH CURRENT cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   3 data_3

1 row fetched.

gSQL> FETCH ABSOLUTE 1 cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   1 data_1

1 row fetched.

gSQL> FETCH ABSOLUTE -1 cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   5 data_5

1 row fetched.

gSQL> FETCH ABSOLUTE 6 cur_scroll INTO :v_id, :v_data;

no rows fetched.

gSQL> FETCH ABSOLUTE -6 cur_scroll INTO :v_id, :v_data;

no rows fetched.

gSQL> FETCH ABSOLUTE 3 cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   3 data_3

1 row fetched.

gSQL> FETCH ABSOLUTE -3 cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   3 data_3

1 row fetched.

gSQL> FETCH RELATIVE 1 cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   4 data_4

1 row fetched.

gSQL> FETCH RELATIVE -1 cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   3 data_3

1 row fetched.

gSQL> FETCH RELATIVE 5 cur_scroll INTO :v_id, :v_data;

no rows fetched.

gSQL> FETCH RELATIVE -5 cur_scroll INTO :v_id, :v_data;

V_ID V_DATA
---- ------
   1 data_1

1 row fetched.

gSQL> CLOSE cur_scroll;

Cursor closed.

호환성

SQL 표준에서는 <fetch orientation> 중에 CURRENT를 정의하지 않고 있다.

SQL 표준 호환성

Feature ID

설명

지원 여부

F431

Read-only scrollable cursors

O

B031

Basic dynamic SQL

O

참조

관련 내용은 다음을 참조한다.

FLASHBACK TABLE

기능

휴지통에 보관되어 있는 테이블 객체를 복구한다.

구문

<flashback table statement> ::=
    FLASHBACK TABLE table_name
    TO BEFORE DROP [ RENAME TO new_table_name ]
    ;

사용 범위 및 접근 권한

<flashback table statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

table_name

휴지통에 저장된 객체의 이름 또는 제거된 테이블의 이름이다.
제거된 테이블 이름에는 schema_name.table_name과 같이 테이블이 속한 스키마를 정의할 수 있으며 schema_name을 생략할 경우 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.

new_table_name

복구되는 테이블의 새로운 이름이다.
스키마 내에 동일한 테이블 이름이 존재하지 않아야 한다.

설명

휴지통에 저장된 객체 이름이나 제거된 테이블의 이름을 사용하여 휴지통에 보관되어 있는 테이블 객체를 복구한다. 만약 제거된 테이블과 중복된 이름이 있는 경우 가장 최신의 테이블 객체를 복구한다.
복구하려는 테이블 객체의 이름이 존재하면 에러가 발생하는데 RENAME TO 절을 사용하여 새로운 테이블 이름으로 복구할 수 있다. 복구된 테이블의 제약 조건과 인덱스는 제거되기 전의 이름으로 복구되는데 만약 제거되기 전의 제약 조건 및 인덱스와 동일한 이름이 이미 존재할 경우, 휴지통에 저장된 이름으로 복구된다.
다른 Data Definition Language (DDL)과 달리 FLASHBACK TABLE 구문은 ROLLBACK 할 수 없으며, 구문을 수행한 transaction이 자동으로 COMMIT 된다.

사용 예

다음은 휴지통에 저장된 객체 이름으로 테이블을 복구하는 예이다.

gSQL> SELECT SCHEMA_NAME, OBJECT_NAME, ORIGINAL_NAME, OBJECT_TYPE FROM USER_RECYCLEBIN;

SCHEMA_NAME OBJECT_NAME                          ORIGINAL_NAME OBJECT_TYPE
----------- ------------------------------------ ------------- -----------
PUBLIC      BIN$106A4F90165D11EA9C5C835D3E4BBBF7 T1            TABLE      

1 row selected.

gSQL> FLASHBACK TABLE "BIN$106A4F90165D11EA9C5C835D3E4BBBF7" TO BEFORE DROP;

Flashback complete.

다음은 제거되기 전 테이블의 이름으로 휴지통에서 복구하는 예이다.

gSQL> SELECT SCHEMA_NAME, OBJECT_NAME, ORIGINAL_NAME, OBJECT_TYPE FROM USER_RECYCLEBIN;

SCHEMA_NAME OBJECT_NAME                          ORIGINAL_NAME OBJECT_TYPE
----------- ------------------------------------ ------------- -----------
PUBLIC      BIN$106A4F90165D11EA9C5C835D3E4BBBF7 T1            TABLE      

gSQL> FLASHBACK TABLE T1 TO BEFORE DROP;

Flashback complete.

호환성

SQL 표준에서는 <flashback table statement>를 다루지 않고 있다.

참조

관련 내용은 다음을 참조한다.

GRANT privileges TO

기능

사용자에게 권한을 부여한다.

구문

<grant privilege statement> ::=
    GRANT <privilege> TO <grantee> [, ...]
        [ WITH GRANT OPTION ]
    ;

<grantee> ::=
      PUBLIC
    | user_identifier
    ;
    
<privilege> ::=
      <database privilege>
    | <tablespace privilege>
    | <schema privilege>
    | <table privilege>
    | <sequence privilege>
    | <procedure privilege>

<database privilege> ::=
      ALL [ PRIVILEGES ] [ON DATABASE]
    | <database action> [, ...] [ON DATABASE]

<database action> ::=
      ADMINISTRATION
    | ANALYZE ANY 
    | ALTER DATABASE
    | ALTER SYSTEM
    | AUDIT SYSTEM
    | ACCESS CONTROL
    | CREATE SESSION
    | CREATE PROFILE
    | ALTER PROFILE
    | DROP PROFILE 
    | CREATE USER
    | ALTER USER
    | DROP USER 
    | CREATE ROLE
    | ALTER ROLE
    | DROP ROLE
    | CREATE TABLESPACE
    | ALTER TABLESPACE
    | DROP TABLESPACE
    | USAGE TABLESPACE
    | CREATE SCHEMA
    | ALTER SCHEMA
    | DROP SCHEMA
    | CREATE PUBLIC SYNONYM
    | DROP PUBLIC SYNONYM
    | CREATE ANY TABLE
    | ALTER ANY TABLE
    | DROP ANY TABLE
    | SELECT ANY TABLE
    | INSERT ANY TABLE
    | DELETE ANY TABLE
    | UPDATE ANY TABLE
    | LOCK ANY TABLE
    | CREATE ANY VIEW
    | DROP ANY VIEW
    | CREATE ANY SEQUENCE
    | ALTER ANY SEQUENCE
    | DROP ANY SEQUENCE
    | USAGE ANY SEQUENCE
    | CREATE ANY INDEX
    | ALTER ANY INDEX
    | DROP ANY INDEX
    | CREATE ANY SYNONYM
    | DROP ANY SYNONYM
    | CREATE ANY PROCEDURE
    | ALTER ANY PROCEDURE
    | DROP ANY PROCEDURE
    | EXECUTE ANY PROCEDURE
    | CREATE ANY PACKAGE
    | ALTER ANY PACKAGE
    | DROP ANY PACKAGE
    | EXECUTE ANY PACKAGE
    | PURGE DBA_RECYCLEBIN

<tablespace privilege> ::=
      ALL [ PRIVILEGES ] ON TABLESPACE tablespace_name
    | <tablespace action> [, ...] ON TABLESPACE tablespace_name

<tablespace action> ::=
    CREATE OBJECT

<schema privilege> ::=
      ALL [ PRIVILEGES ] ON SCHEMA schema_name
    | <schema action> [, ...] [ON SCHEMA schema_name]

<schema action> ::=
      CONTROL SCHEMA
    | CREATE TABLE
    | ALTER TABLE 
    | DROP TABLE
    | SELECT TABLE
    | INSERT TABLE
    | DELETE TABLE
    | UPDATE TABLE
    | LOCK TABLE
    | CREATE VIEW
    | DROP VIEW
    | CREATE SEQUENCE
    | ALTER SEQUENCE
    | DROP SEQUENCE
    | USAGE SEQUENCE
    | CREATE INDEX
    | ALTER INDEX
    | DROP INDEX
    | ADD CONSTRAINT
    | CREATE SYNONYM
    | DROP SYNONYM
    | CREATE PROCEDURE
    | ALTER PROCEDURE
    | DROP PROCEDURE
    | EXECUTE PROCEDURE
    | CREATE PACKAGE
    | ALTER PACKAGE
    | DROP PACKAGE
    | EXECUTE PACKAGE

<table privilege> ::=
      ALL [ PRIVILEGES ] ON [TABLE] table_name
    | { <table action> | <column action> } [, ...] ON [TABLE] table_name

<table action> ::=
      CONTROL TABLE
    | SELECT
    | INSERT
    | UPDATE
    | DELETE
    | REFERENCES
    | LOCK
    | INDEX
    | ALTER

<column action> ::=
      SELECT ( column_name [, ...] )
    | INSERT ( column_name [, ...] )
    | UPDATE ( column_name [, ...] )
    | REFERENCES ( column_name [, ...] )

<sequence privilege> ::=
      ALL [ PRIVILEGES ] ON SEQUENCE sequence_name
    | <sequence action> ON SEQUENCE sequence_name

<sequence action> ::=
    USAGE

<procedure privilege> ::=
      ALL [ PRIVILEGES ] ON PROCEDURE procedure_name
    | <procedure action> ON PROCEDURE procedure_name

<procedure action> ::=
    EXECUTE

<package privilege> ::=
      ALL [ PRIVILEGES ] ON PACKAGE package_name
    | <package action> ON PACKAGE package_name

<package action> ::=
    EXECUTE

구문 규칙 및 파라미터

<grantee>

권한을 부여받을 사용자이다.

WITH GRANT OPTION

Grantee (권한을 부여받은 사용자)가 다른 사용자에게 해당 권한을 부여할 수 있도록 한다.

다음과 같이 동일한 <privilege>에 대한 권한을 부여할 때 WITH GRANT OPTION은 계속 유지된다.

<privilege>

Grantee (권한을 부여받는 사용자)에게 부여할 권한이다.

Grantor (구문을 수행하는 사용자)는 다음 조건 중 하나를 만족해야 한다.

<database privilege>

데이터베이스 객체에 대한 권한이다.
[ON DATABASE] 구문은 생략할 수 있다.

database privilege로 정의할 수 있는 database action은 다음과 같다.

Database privilege

<database action>

설명

ADMINISTRATION

서버 구동, 종료 권한

ALTER DATABASE

ALTER DATABASE 구문을 수행할 수 있는 권한

ALTER SYSTEM

ALTER SYSTEM 구문을 수행할 수 있는 권한

AUDIT SYSTEM

Audit policy를 제어할 수 있는 권한

ACCESS CONTROL

모든 권한을 제어할 수 있는 권한

CREATE SESSION

Database에 접속할 수 있는 권한

CREATE PROFILE

Database에 profile을 생성할 수 있는 권한

ALTER PROFILE

Database의 모든 profile을 변경할 수 있는 권한

DROP PROFILE

Database의 모든 profile을 제거할 수 있는 권한

CREATE USER

Database에 user를 생성할 수 있는 권한

ALTER USER

Database의 모든 user를 변경할 수 있는 권한

DROP USER

Database의 모든 user를 제거할 수 있는 권한

CREATE ROLE

Database에 role을 생성할 수 있는 권한

ALTER ROLE

Database의 모든 role을 변경할 수 있는 권한

DROP ROLE

Database의 모든 role을 제거할 수 있는 권한

CREATE TABLESPACE

Database에 tablespace를 생성할 수 있는 권한

ALTER TABLESPACE

Database의 모든 tablespace를 변경할 수 있는 권한

DROP TABLESPACE

Database의 모든 tablespace를 제거할 수 있는 권한

USAGE TABLESPACE

Database의 모든 tablespace를 사용할 수 있는 권한

CREATE SCHEMA

Database에 스키마를 생성할 수 있는 권한

ALTER SCHEMA

Database의 모든 스키마를 변경할 수 있는 권한

DROP SCHEMA

Database의 모든 스키마를 제거할 수 있는 권한

CREATE PUBLIC SYNONYM

Database에 PUBLIC SYNONYM을 생성할 수 있는 권한

DROP PUBLIC SYNONYM

Database의 모든 PUBLIC SYNONYM을 제거할 수 있는 권한

CREATE ANY TABLE

Database의 모든 스키마에 테이블을 생성할 수 있는 권한

ALTER ANY TABLE

Database의 모든 테이블을 변경할 수 있는 권한

DROP ANY TABLE

Database의 모든 테이블을 제거할 수 있는 권한

SELECT ANY TABLE

Database의 모든 테이블의 row를 검색할 수 있는 권한

INSERT ANY TABLE

Database의 모든 테이블에 row를 생성할 수 있는 권한

DELETE ANY TABLE

Database의 모든 테이블의 row를 삭제할 수 있는 권한

UPDATE ANY TABLE

Database의 모든 테이블의 row를 갱신할 수 있는 권한

LOCK ANY TABLE

Database의 모든 테이블에 LOCK 구문을 수행할 수 있는 권한

CREATE ANY VIEW

Database의 모든 스키마에 view를 생성할 수 있는 권한

DROP ANY VIEW

Database의 모든 view를 제거할 수 있는 권한

CREATE ANY SEQUENCE

Database의 모든 스키마에 시퀀스를 생성할 수 있는 권한

ALTER ANY SEQUENCE

Database의 모든 시퀀스를 변경할 수 있는 권한

DROP ANY SEQUENCE

Database의 모든 시퀀스를 제거할 수 있는 권한

USAGE ANY SEQUENCE

Database의 모든 시퀀스를 사용할 수 있는 권한

CREATE ANY INDEX

Database의 모든 스키마에 인덱스를 생성할 수 있는 권한

ALTER ANY INDEX

Database의 모든 인덱스를 변경할 수 있는 권한

DROP ANY INDEX

Database의 모든 인덱스를 제거할 수 있는 권한

CREATE ANY SYNONYM

Database의 모든 synonym을 생성할 수 있는 권한

DROP ANY SYNONYM

Database의 모든 synonym을 제거할 수 있는 권한

CREATE ANY PROCEDURE

Database의 모든 스키마에 procedure/ function을 생성할 수 있는 권한

ALTER ANY PROCEDURE

Database의 모든 procedure/ function을 변경할 수 있는 권한

DROP ANY PROCEDURE

Database의 모든 procedure/ function을 제거할 수 있는 권한

EXECUTE ANY PROCEDURE

Database의 모든 procedure/ function을 수행할 수 있는 권한

CREATE ANY PACKAGE

Database의 모든 스키마에 package를 생성할 수 있는 권한

ALTER ANY PACKAGE

Database의 모든 package을 변경할 수 있는 권한

DROP ANY PACKAGE

Database의 모든 package을 제거할 수 있는 권한

EXECUTE ANY PACKAGE

Database의 모든 package을 수행할 수 있는 권한

PURGE DBA_RECYCLEBIN

Database의 모든 휴지통을 제거할 수 있는 권한

<tablespace privilege>

테이블스페이스 객체에 대한 권한이다.

tablespace privilege로 정의할 수 있는 tablespace action은 다음과 같다.

Tablespace privilege

<tablespace action>

설명

CREATE OBJECT

Tablespace에 객체를 생성할 수 있는 권한

<schema privilege>

스키마 객체에 대한 권한이다.

schema privilege로 정의할 수 있는 schema action은 다음과 같다.

Schema privilege

<schema action>

설명

CONTROL SCHEMA

해당 스키마에 대한 모든 권한

CREATE TABLE

스키마에 테이블을 생성할 수 있는 권한

ALTER TABLE

스키마의 모든 테이블을 변경할 수 있는 권한

DROP TABLE

스키마의 모든 테이블을 제거할 수 있는 권한

SELECT TABLE

스키마의 모든 테이블의 row를 검색할 수 있는 권한

INSERT TABLE

스키마의 모든 테이블의 row를 생성할 수 있는 권한

DELETE TABLE

스키마의 모든 테이블의 row를 삭제할 수 있는 권한

UPDATE TABLE

스키마의 모든 테이블의 row를 갱신할 수 있는 권한

LOCK TABLE

스키마의 모든 테이블에 LOCK 구문을 수행할 수 있는 권한

CREATE VIEW

스키마에 view를 생성할 수 있는 권한

DROP VIEW

스키마의 모든 view를 제거할 수 있는 권한

CREATE SEQUENCE

스키마에 시퀀스를 생성할 수 있는 권한

ALTER SEQUENCE

스키마의 모든 시퀀스를 변경할 수 있는 권한

DROP SEQUENCE

스키마의 모든 시퀀스를 제거할 수 있는 권한

USAGE SEQUENCE

스키마의 모든 시퀀스를 사용할 수 있는 권한

CREATE INDEX

스키마에 인덱스를 생성할 수 있는 권한

ALTER INDEX

스키마의 모든 인덱스를 변경할 수 있는 권한

DROP INDEX

스키마의 모든 인덱스를 제거할 수 있는 권한

ADD CONSTRAINT

스키마에 제약 조건을 생성할 수 있는 권한

CREATE SYNONYM

스키마에 synonym을 생성할 수 있는 권한

DROP SYNONYM

스키마의 모든 synonym을 제거할 수 있는 권한

CREATE PROCEDURE

스키마에 procedure/ function을 생성할 수 있는 권한

ALTER PROCEDURE

스키마의 모든 procedure/ function을 변경할 수 있는 권한

DROP PROCEDURE

스키마의 모든 procedure/ function을 제거할 수 있는 권한

EXECUTE PROCEDURE

스키마의 모든 procedure/ function을 수행할 수 있는 권한

CREATE PACKAGE

스키마에 package를 생성할 수 있는 권한

ALTER PACKAGE

스키마의 모든 package를 변경할 수 있는 권한

DROP PACKAGE

스키마의 모든 package를 제거할 수 있는 권한

EXECUTE PACKAGE

스키마의 모든 package를 수행할 수 있는 권한

<table privilege>

테이블 또는 view 객체에 대한 권한이다.
[TABLE] 구문은 생략할 수 있다.

table privilege로 정의할 수 있는 table action은 다음과 같다.

Table privilege

<table action>

설명

CONTROL TABLE

해당 테이블에 대한 모든 권한

SELECT

테이블의 row를 검색할 수 있는 권한

INSERT

테이블의 row를 생성할 수 있는 권한

UPDATE

테이블의 row를 갱신할 수 있는 권한

DELETE

테이블의 row를 삭제할 수 있는 권한

REFERENCES

해당 테이블을 참조하는 참조 제약 조건을 생성할 수 있는 권한

LOCK

테이블에 LOCK 구문을 수행할 수 있는 권한

INDEX

테이블에 인덱스를 생성할 수 있는 권한

ALTER

테이블을 변경할 수 있는 권한

SELECT, INSERT, UPDATE, REFERENCES의 경우, 테이블의 모든 column에 추가적으로 권한을 부여한다.

table privilege로 정의할 수 있는 column action은 다음과 같다. 단, column action은 base table에만 적용된다.

Column privilege

<column action>

설명

SELECT (columns)

해당 column들을 검색할 수 있는 권한

INSERT (columns)

해당 column들을 포함한 row를 생성할 수 있는 권한

UPDATE (columns)

해당 column들을 갱신할 수 있는 권한

REFERENCES (columns)

해당 column들을 참조하는 참조 제약 조건을 생성할 수 있는 권한

<sequence privilege>

시퀀스 객체에 대한 권한이다.

sequence privilege로 정의할 수 있는 sequence action은 다음과 같다.

Sequence privilege

<sequence action>

설명

USAGE

시퀀스를 사용할 수 있는 권한

<procedure privilege>

Procedure/ function 객체에 대한 권한이다.

procedure privilege로 정의할 수 있는 action은 다음과 같다.

Procedure privilege

<procedure action>

설명

EXECUTE

Procedure/ function을 실행할 수 있는 권한

<package privilege>

Package 객체에 대한 권한이다.

package privilege로 정의할 수 있는 action은 다음과 같다.

Package privilege

<package action>

설명

EXECUTE

Package를 실행할 수 있는 권한

설명

GRANT privilege와 같은 Data Definition Language (DDL) 구문도 트랜잭션이 COMMIT 되기 전이라면 ROLLBACK 할 수 있다.

Table, sequence 등과 같은 SQL schema object를 생성한 owner는 해당 객체에 대한 권한을 별도로 부여받지 않더라도 일정한 권한을 가진다. 
이에 대한 자세한 설명은 다음과 같은 CREATE 구문을 참조한다.
Schema, tablespace 등과 같은 non-schema object를 생성한 owner에는 해당 객체에 대한 어떤 권한도 자동으로 부여되지 않으므로 별도의 권한을 부여받아야 한다. 
자세한 설명은 다음과 같은 CREATE 구문을 참조한다.

사용 예

다음은 user u1에 SELECT ON TABLE t1 권한을 부여하는 예이다.

gSQL> GRANT SELECT ON t1 TO u1;

Grant succeeded.

다음은 모든 사용자를 의미하는 PUBLIC 계정에 SELECT ON TABLE t1 권한을 부여하는 예이다.

gSQL> GRANT SELECT ON t1 TO PUBLIC;

Grant succeeded.

다음은 user u1이 WITH GRANT OPTION을 사용하여 다른 user에게 해당 권한을 부여하는 예이다.

gSQL> GRANT SELECT ON t1 TO u1 WITH GRANT OPTION;

Grant succeeded.

다음은 구문을 수행하는 사용자가 WITH GRANT OPTION을 사용하여 TABLE t1 객체에 대해 소유한 모든 권한을 user u1에게 부여하는 예이다.

gSQL> GRANT ALL PRIVILEGES ON TABLE t1 TO u1;

Grant succeeded.

다음은 database에 접속할 수 있는 CREATE SESSION ON DATABASE 권한을 부여하는 예이다.

gSQL> GRANT CREATE SESSION ON DATABASE TO u1;

Grant succeeded.

다음은 SCHEMA s1에 table, view, index, sequence, constraint 객체를 생성할 수 있는 다수의 권한을 user u1에게 부여하는 예이다.

gSQL> GRANT CREATE TABLE, CREATE VIEW, CREATE INDEX, CREATE SEQUENCE, ADD CONSTRAINT ON SCHEMA s1 TO u1;

Grant succeeded.

다음은 TABLESPACE mem_data_tbs에 객체를 생성할 수 있는 권한을 user u1에게 부여하는 예이다.

gSQL> GRANT CREATE OBJECT ON TABLESPACE mem_data_tbs TO u1;

Grant succeeded.

다음은 TABLE t1의 일부 column을 조회할 수 있는 권한을 user u1에 부여하는 예이다.

gSQL> GRANT SELECT( id, name ) ON TABLE t1 TO u1;

Grant succeeded.

다음은 SEQUENCE seq1에 대해 NEXTVAL(), CURRVAL() 함수를 사용할 수 있는 권한을 user u1에 부여하는 예이다.

gSQL> GRANT USAGE ON SEQUENCE seq1 TO u1;

Grant succeeded.

호환성

SQL 표준에서는 다음 privilege들을 정의하지 않고 있다.

SQL 표준 호환성

Feature ID

설명

지원 여부

S023

Basic structured types

X

S024

Enhanced structured types

X

S081

Subtables

X

T211

Basic trigger capability

X

T281

SELECT privilege with column granularity

O

T332

Extended Roles

X

F731

INSERT column privileges

O

참조

관련 내용은 다음을 참조한다.