SQL References

ALTER AUDIT POLICY

기능

Audit policy 객체에 감사 대상을 추가하거나 삭제한다.

구문

<alter audit policy statement> ::= 
    ALTER AUDIT POLICY policy_name
    { <add_audit_option> | <drop_audit_option> }
    ;

<add_audit_option> ::=
    ADD { <privilege_audit_clause> |  <action_audit_clause> | <privilege_audit_clause> <action_audit_clause> }

<drop_audit_option> ::=
    DROP { <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
    | <system_action>

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

policy_name

변경할 audit policy 객체의 이름이다.

<add_audit_option>

Audit policy에 감사대상을 추가한다.

<drop_audit_option>

Audit policy 감사대상에서 삭제한다.

<privilege_audit_clause>

자세한 내용은 CREATE AUDIT POLICY 를 참조한다.

<action_audit_clause>

자세한 내용은 CREATE AUDIT POLICY 를 참조한다.

설명

이미 활성화된 audit policy를 변경할 수 있지만 기존 session에는 영향을 주지 않고 새로 생성되는 session에만 영향을 미친다.

다음과 같이 ALL 옵션을 DROP 할 경우, 모든 action이 삭제되는 것이 아니라 해당 ALL 옵션만 삭제된다.

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

ALTER AUDIT POLICY p1 DROP
      ACTIONS ALL ON u1.t1;

사용 예

다음은 audit policy에 새로운 audit option을 추가하는 예이다.

ALTER AUDIT POLICY policy_dml
      ADD ACTIONS SELECT ON u1.t1;

다음은 audit policy에서 audit option을 삭제하는 예이다.

ALTER AUDIT POLICY policy_dml
      DROP ACTIONS SELECT ON u1.t1;

호환성

SQL 표준에는 audit policy가 없다.

참조

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

ALTER CLUSTER GROUP name ADD MEMBER

기능

Cluster group에 cluster member를 추가한다.

구문

<alter cluster group add member statement> ::=
    ALTER CLUSTER GROUP group_name ADD
        <cluster member definition> [, ...]
    ;

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

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

사용 범위 및 접근 권한

Cluster system에서 수행할 수 있다.

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

구문 규칙 및 파라미터

group_name

Cluster group의 이름이다.

<cluster member definition>

Cluster group에 포함될 cluster member를 정의한다.
Cluster group은 최대 32 개의 cluster member를 포함할 수 있다.

member_name

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

<connection attribute>

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

설명

<alter cluster group add member statement> 구문은 table들의 shard를 재배치하지 않는다.
추가된 cluster member에 shard를 재배치하려면 다음 구문을 수행해야 한다.

사용 예

다음은 cluster group에 두 개의 cluster member를 추가하는 예이다.

gSQL>
ALTER CLUSTER GROUP g1 ADD
    CLUSTER MEMBER g1n3 HOST '192.168.0.13' PORT 10130,
    CLUSTER MEMBER g1n4 HOST '192.168.0.14' PORT 10140
;

Cluster Group altered.

호환성

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

참조

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

ALTER CLUSTER GROUP name OFFLINE MEMBER

기능

Cluster group의 cluster member를 offline 상태로 변경한다.

구문

<alter cluster group offline member statement> ::=
    ALTER CLUSTER GROUP group_name OFFLINE
        <cluster member definition>
    ;

<cluster member definition> ::=
    CLUSTER MEMBER member_name
    ;

사용 범위 및 접근 권한

Cluster system에서 수행할 수 있다.

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

구문 규칙 및 파라미터

group_name

Cluster group의 이름이다.

<cluster member definition>

Cluster group에 포함될 cluster member를 정의한다.
Cluster group은 최대 32개의 cluster member를 포함할 수 있다.

member_name

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

설명

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

사용 예

다음은 특정 cluster member를 offline 상태로 변경하는 예이다.

gSQL>

ALTER CLUSTER GROUP g1 OFFLINE
    CLUSTER MEMBER g1n3
;
Cluster Group altered.

호환성

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

참조

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

ALTER CLUSTER LOCATION

기능

Cluster location 정보를 수정한다.

구문

<alter cluster location statement> ::=
    ALTER CLUSTER LOCATION member_name 
    <cluster connection attribute>
    ;

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

사용 범위 및 접근 권한

Cluster system에서 수행할 수 있다.

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

구문 규칙 및 파라미터

member_name

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

<cluster connection attribute>

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

설명

만약 cluster location의 접속 정보가 변경될 경우에는 cluster member를 제거하거나 재생성할 필요없이 ALTER CLUSTER LOCATION을 이용하여 접속 정보를 변경할 수 있다.

사용 예

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

Created

호환성

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

참조

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

ALTER DATABASE ADD LOGFILE

기능

데이터베이스에 로그파일 그룹 또는 로그파일 멤버를 추가한다.

구문

<alter database add logfile statement> ::=
      <add logfile member statement> 
    | <add logfile group statement>
    ;

<add logfile member statement> ::=
    ALTER DATABASE ADD LOGFILE MEMBER <add logfile clause> [, ...] TO 
        <group clause>

<add logfile group statement> ::=
    ALTER DATABASE ADD LOGFILE <group clause> ( 'logfile_name' ) 
        <size clause> [ REUSE ]

<group clause> ::=
    GROUP integer

<add logfile clause> ::=
    'logfile_name' [ REUSE ]

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

사용 범위 및 접근 권한

<alter database add logfile statement> 구문을 수행하려면 사용자에게 ALTER DATABASE ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

<alter database add logfile statement>

데이터베이스는 MOUNT 상태여야 한다.

<add logfile member statement>

기존의 로그파일 그룹에 로그 멤버를 추가한다.

<add logfile group statement>

새로운 로그파일 그룹을 추가한다.

설명

새로운 로그파일 그룹과 로그 멤버가 추가되는 경우 controlfile에 저장되므로 향후 controlfile 손상에 대비해 controlfile을 백업하는 것을 권장한다.

사용 예

다음은 기존 로그파일인 GROUP 3에 두 개의 로그파일 멤버를 추가하는 예이다.

ALTER DATABASE ADD LOGFILE MEMBER 'logfile1.log', 'logfile2.log' TO GROUP 3;

다음은 로그파일 크기가 100 M이고 로그파일 이름이 'logfile1.log'인 새로운 로그파일 GROUP 4를 데이터베이스에 추가하는 예이다.

ALTER DATABASE ADD LOGFILE GROUP 4 ( 'logfile1.log' ) SIZE 100M;

로그 그룹을 추가할 때는 한 개의 로그파일을 사용해야 하고 이미 존재하는 그룹에 다수의 로그 파일을 멤버로 추가할 수 있다.

호환성

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

참조

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

ALTER DATABASE ARCHIVELOG

기능

데이터베이스의 온라인 로그 파일 archive 설정을 변경한다.

구문

<alter database archivelog statement> ::=
    ALTER DATABASE { ARCHIVELOG | NOARCHIVELOG }
    ;

사용 범위 및 접근 권한

<alter database archivelog statement> 구문을 수행하려면 사용자에게 ALTER DATABASE ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

<alter database archivelog statement>

설명

Database를 백업하고 백업을 이용해 복구 (media recovery)하려면 시스템이 ARCHIVELOG 모드로 운용되어야 한다.

사용 예

다음은 데이터베이스를 archive 모드로 설정하는 예이다.

ALTER DATABASE ARCHIVELOG;

호환성

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

참조

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

ALTER DATABASE BACKUP

기능

데이터베이스 전체 백업 (full backup)을 수행하기 위해 백업 상태를 'ACTIVE' 또는 'INACTIVE'로 설정한다. 그리고 데이터베이스 증분 백업 (incremental backup)과 제어 파일 (control file) 백업을 수행한다.

구문

<alter database backup statement> ::=
      <database begin backup statement>
    | <database end backup statement>
    | <database incremental backup statement>
    | <database controlfile backup statement>
    ;

<database begin backup statement> ::=
    ALTER DATABASE BEGIN BACKUP [ AT <domain name> ]
    ;

<database end backup statement> ::=
    ALTER DATABASE END BACKUP [ AT <domain name> ]
    ;

<database incremental backup statement> ::=
    ALTER DATABASE BACKUP INCREMENTAL
        <incremental backup option> [ AT <domain name> ]    ;

<incremental backup option> ::=
      LEVEL integer [ CUMULATIVE | DIFFERENTIAL ]

<database controlfile backup statement> ::=
    ALTER DATABASE BACKUP CONTROLFILE TO 'target_name'
        [ AT <domain name> ]    ;

사용 범위 및 접근 권한

<alter database backup statement> 구문을 수행하려면 사용자에게 ALTER DATABASE ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

<database begin backup clause>

데이터베이스를 전체 백업이 가능한 상태로 설정한다.

<database end backup clause>

데이터베이스를 전체 백업 불가능한 상태로 설정한다.

<database incremental backup statement>

<incremental backup option>

<database controlfile backup statement>

GOLDILOCKS에서 관리하는 'target_name' 길이는 최대 1024 바이트이지만, OS마다 최대로 허용하는 파일 이름 길이가 다르기 때문에, 실제 생성가능한 'target_name'의 길이는 1024 바이트보다 작을 수 있다.

<domain name>

설명

Database의 datafile과 controlfile을 백업한다. BEGIN BACKUP을 수행한 후 OS의 파일 복사로 datafile들을 복사하고 나서 END BACKUP을 수행하여 database를 전체 백업한다. 한편, 증분 백업 파일은 하나의 구문으로 BACKUP_DIR_1 property에 설정된 경로에 생성한다.

사용 예

다음은 전체 백업 상태를 ACTIVE로 설정하는 예이다.

ALTER DATABASE BEGIN BACkUP;

다음은 전체 백업 상태를 INACTIVE로 설정하는 예이다.

ALTER DATABASE END BACkUP;

다음은 DIFFERENTIAL을 사용하여 LEVEL 1의 증분 백업을 만드는 예이다.

ALTER DATABASE BACKUP INCREMENTAL LEVEL 1 DIFFERENTIAL;

다음은 controlfile에 대해 'controlfile.bak' 백업 파일을 만드는 예이다. 절대 경로가 포함되지 않으면 LOG_DIR property에 설정된 경로에 백업 파일을 생성한다.

ALTER DATABASE BACKUP CONTROLFILE TO 'controlfile.bak';

호환성

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

참조

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

ALTER DATABASE CLEAR AUDIT TRAIL

기능

Audit policy 적용으로 인해 누적된 audit record를 삭제 (purge)한다.

구문

<clear audit trail statement> ::= 
    ALTER DATABASE CLEAR AUDIT TRAIL
;

사용 범위 및 접근 권한

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

설명

Audit policy를 활성화하면 시간이 지남에 따라 audit trail이 계속 커진다. 
Audit trail을 구성하는 테이블들은 MEM_AUX_TBS 테이블스페이스에 저장되는데 audit trail이 계속 커지지 않도록 해야 한다.

Audit Trail 저장

필요에 따라 audit trail 을 저장하려면 다음과 같은 절차에 따라 저장한 후에 audit trail을 삭제해야 한다.

CREATE TABLE backup_audit_trail AS SELECT * FROM AUDIT_TRAIL;
COMMIT;
INSERT INTO backup_audit_trail SELECT * FROM AUDIT_TRAIL;
COMMIT;
ALTER DATABASE CLEAR AUDIT TRAIL;

사용 예

다음 구문을 사용하여 audit trail을 삭제 (purge)한다.

ALTER DATABASE CLEAR AUDIT TRAIL;

호환성

SQL 표준에는 audit policy가 없다.

참조

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

ALTER DATABASE CLEAR PASSWORD HISTORY

기능

Profile 적용에 따라 누적된 사용자의 비밀번호 변경 이력을 삭제한다.

구문

<clear password history statement> ::= 
    ALTER DATABASE CLEAR PASSWORD HISTORY
    ;

사용 범위 및 접근 권한

<clear password history statement> 구문을 수행하려면 사용자에게 ALTER DATABASE ON DATABASE 권한이 있어야 한다.

설명

User에 profile을 적용할 때 PASSWORD_REUSE_MAX, PASSWORD_REUSE_TIME의 정책에 따라 사용자의 비밀번호 변경이력이 누적된다.

변경 이력 관리

PASSWORD_REUSE_MAX

PASSWORD_REUSE_TIME

변경 이력 관리

value

value

Value 범위 내의 변경 이력만 관리하고 범위를 벗어난 변경 이력은 자동으로 삭제한다.

value

UNLIMITED

모든 변경 이력을 검사해야 하므로 변경 이력을 누적할 뿐 제거하지 않는다.

UNLIMITED

value

모든 변경 이력을 검사해야 하므로 변경 이력을 누적할 뿐 제거하지 않는다.

UNLIMITED

UNLIMITED

변경 이력을 검사하지 않으므로 관리도 하지 않는다.

<clear password history statement> 구문은 누적된 사용자 비밀번호 변경 이력을 삭제한다.

사용 예

다음은 <clear password history statement> 구문을 수행하는 예이다.

gSQL> ALTER DATABASE CLEAR PASSWORD HISTORY;

Database altered.

gSQL> COMMIT;

Commit complete.

호환성

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

참조

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

ALTER DATABASE DELETE BACKUP

기능

증분 백업 (incremental backup)의 백업 정보와 백업 파일을 삭제한다. Database의 모든 증분 백업을 삭제하거나, 더 이상 쓸모 없는 백업 (obsolete backup)을 선택해서 삭제할 수 있다.

구문

<alter database delete backup statement> ::=
    ALTER DATABASE DELETE <delete backup list option> 
        BACKUP LIST [ <including backup file option> ]
    ;

<delete backup list option> ::=
      OBSOLETE
    | ALL

<including backup file option> ::=
    INCLUDING BACKUP FILES

사용 범위 및 접근 권한

<alter database delete backup statement> 구문을 수행하려면 사용자에게 ALTER DATABASE ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

<alter database delete backup statement>

데이터베이스가 MOUNT 또는 OPEN 상태여야 한다.

<delete backup list option>

기존 증분 백업들 중에서 삭제할 대상을 선정한다.

<including backup file option>

설명

OBSOLETE 증분 백업 삭제는 가장 최근의 LEVEL 0 데이터베이스 백업 이전의 증분 백업을 삭제한다. 즉, LEVEL 0이 아닌 증분 백업을 수행할 때는 이전에 수행한 증분 백업을 포함하는 증분 백업이 있더라도 삭제하지 않는다. 왜냐하면 증분 백업을 이용한 불완전 복구를 수행할 때 사용될 수 있기 때문이다.

증분 백업을 삭제할 때 백업 파일까지 함께 삭제하면 증분 백업 정보를 포함하는 백업된 controlfile을 이용하더라도 복구를 수행할 수 없으므로 주의해야 한다.

사용 예

다음은 기존 모든 증분 백업들의 백업정보와 백업파일들을 삭제하는 예이다.

ALTER DATABASE DELETE ALL BACKUP LIST INCLUING BACKUP FILES;

호환성

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

참조

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

ALTER DATABASE DROP INACTIVE CLUSTER MEMBERS

기능

모든 inactive cluster member들을 제거한다.

구문

<alter database drop inactive members statement> ::=
    ALTER DATABASE DROP INACTIVE CLUSTER MEMBERS
    ;

사용 범위 및 접근 권한

Cluster system에서 수행할 수 있다.

<alter database drop inactive cluster members statement> 구문을 수행하려면 사용자에게 ADMINISTRATION ON DATABASE 권한이 있어야 한다.

설명

모든 inactive cluster member들을 제거한다.

Cluster member의 inactive 상태는 cluster system과 연결되어 있지 않은 상태로서 다음과 같은 상황에서 발생한다.

단, cluster member를 제거할 때 table의 shard가 유실되는 경우에는 inactive cluster member를 제거할 수 없다.

<alter database drop inactive members statement> 구문은 모든 inactive cluster member들이 더 이상 cluster system에 포함될 수 없는 경우에 사용하는 것이 바람직하다.

사용 예

다음은 <alter database drop inactive members statement> 구문을 수행하는 예이다.

gSQL> ALTER DATABASE DROP INACTIVE CLUSTER MEMBERS;

Database altered.

호환성

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

참조

관련 내용은 ALTER SYSTEM JOIN DATABASE 를 참조한다.

ALTER DATABASE DROP LOGFILE

기능

데이터베이스에 존재하는 로그파일 그룹이나 멤버를 제거한다.

구문

<alter database drop logfile statement> ::=
      <drop logfile group statement>
    | <drop logfile member statement>
    ;

<drop logfile group statement> ::=
    ALTER DATABASE DROP LOGFILE <group clause>

<group clause> ::=
    GROUP integer

<drop logfile member statement> ::=
    ALTER DATABASE DROP LOGFILE MEMBER <logfile_list>

<logfile_list> ::=
      'logfile_name'
    | <logfile_list> , 'logfile_name'

사용 범위 및 접근 권한

<alter database drop logfile statement> 구문을 수행하려면 사용자에게 ALTER DATABASE ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

<alter database drop logfile statement>

데이터베이스는 MOUNT 상태여야 한다.
제거하려는 로그파일이 CURRENT 또는 ACTIVE 상태일 때는 에러가 발생한다.
제거한 후에 최소 네 개의 로그파일 그룹이 남아 있어야 한다.

<drop logfile group statement>

기존의 로그파일 그룹을 제거한다.

<drop logfile member statement>

기존의 로그파일 멤버들을 제거한다.

설명

각 구문별 사용 규칙을 참조한다.

사용 예

다음은 기존 로그파일인 GROUP 3을 제거하는 예이다.

ALTER DATABASE DROP LOGFILE GROUP 3;

다음은 기존 로그파일인 GROUP 3에서 'logfile1.log'와 'logfile2.log'를 제거하는 예이다.

ALTER DATABASE DROP LOGFILE MEMBER 'logfile1.log', 'logfile2.log';

호환성

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

참조

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

ALTER DATABASE MOVE SHARD

기능

특정 cluster group의 모든 table들의 shard를 다른 cluster group으로 재배치한다.

구문

<alter database move shard statement> ::=
    ALTER DATABASE MOVE SHARD FROM CLUSTER GROUP src_cluster_group
        TO CLUSTER GROUP dest_cluster_group [ ONLINE | OFFLINE ];

사용 범위 및 접근 권한

Cluster system에서 수행할 수 있다.

<alter database move shard statement> 구문을 수행하려면 사용자에게 ALTER DATABASE ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

src_cluster_group

테이블의 shard를 이동할 cluster group이다.

dest_cluster_group

테이블의 shard를 이동시킬 target cluster group이다.

[ ONLINE | OFFLINE ]

테이블의 shard를 재배치할 때 DML을 허용할지 여부를 결정한다.

설명

다음과 같은 구문을 사용하여 cluster member와 cluster group을 추가할 때 table들의 shard는 재배치하지 않는다.

Cluster group과 cluster member를 추가할 때 재배치되지 않은 모든 테이블들의 shard를 재배치하려면 <alter database rebalance statement> 구문을 수행한다.

Shard를 재배치하지 않은 테이블들에 대해 <alter database move shard statement> 구문을 수행하는 것은 다음과 같은 의미이다.

ALTER TABLE t1 MOVE SHARD FROM CLUSTER GROUP src_group TO CLUSTER GROUP dest_group;
COMMIT;
ALTER TABLE t2 MOVE SHARD FROM CLUSTER GROUP src_group TO CLUSTER GROUP dest_group;
COMMIT;
ALTER TABLE t3 MOVE SHARD FROM CLUSTER GROUP src_group TO CLUSTER GROUP dest_group;
COMMIT;
...
...
ALTER TABLE t_n MOVE SHARD FROM CLUSTER GROUP src_group TO CLUSTER GROUP dest_group;
COMMIT;

특정 테이블의 shard 재배치에 실패하더라도 <alter database move shard statement> 구문은 계속 진행되고 shard 재배치에 성공한 테이블을 rollback 하지 않는다.

따라서 에러에 대해 적절한 조치를 취한 후 <alter database move shard statement> 구문을 다시 수행하면 이미 shard 재배치에 성공한 테이블들은 재배치 대상에 포함되지 않으며, 재배치가 필요한 테이블들의 shard만 재배치한다.

사용 예

다음은 <alter database move shard statement> 구문을 수행하는 예이다.

gSQL> ALTER DATABASE MOVE SHARD FROM CLUSTER GROUP G1 TO CLUSTER GROUP G2;

Database altered.

호환성

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

참조

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

ALTER DATABASE OFFLINE INACTIVE CLUSTER MEMBERS

기능

모든 inactive cluster member들을 offline 상태로 변경한다. 즉, 해당 cluster member들에 대한 shard map을 offline 상태로 변경한다.

구문

<alter database offline inactive cluster members statement> ::=
    ALTER DATABASE OFFLINE INACTIVE CLUSTER MEMBERS
    ;

사용 범위 및 접근 권한

Cluster system에서 수행할 수 있다.

<alter database offline inactive cluster members statement> 구문을 수행하려면 사용자에게 ADMINISTRATION ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

모든 inactive cluster member들을 offline 상태로 변경한다.

Cluster member의 inactive 상태는 cluster system과 연결되어 있지 않은 상태로서 다음과 같은 상황에서 발생한다.

설명

<alter database offline inactive members statement> 구문은 모든 inactive cluster member 들이 더 이상 cluster system에 포함될 수 없는 경우에 사용하는 것이 바람직하다.

Inactive cluster member가 cluster system에 참여할 수 있으면 ALTER SYSTEM JOIN DATABASE 구문을 수행하여 cluster system에 포함시킨다.

Offline 상태로 변경된 cluster member는 join 후에 다음 구문을 사용하여 online 상태로 다시 변경할 수 있다

사용 예

gSQL> ALTER DATABASE OFFLINE INACTIVE CLUSTER MEMBERS;

호환성

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

참조

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

ALTER DATABASE REBALANCE

기능

모든 table들의 shard를 재배치한다.

구문

<alter database rebalance statement> ::=
    ALTER DATABASE REBALANCE [ ONLINE | OFFLINE ];

사용 범위 및 접근 권한

Cluster system에서 수행할 수 있다.

<alter database rebalance statement> 구문을 수행하려면 사용자에게 ALTER DATABASE ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

[ ONLINE | OFFLINE ]

테이블의 shard를 재배치할 때 DML을 허용할지 여부를 결정한다.

설명

다음과 같은 구문을 사용하여 cluster member, cluster group을 추가할 때 table들의 shard를 재배치하지 않는다.

추가된 cluster group과 cluster member에 재배치하지 않은 모든 테이블들의 shard를 재배치하기 위해 <alter database rebalance statement> 구문을 수행한다.

Shard를 재배치하지 않은 테이블들에 대해 <alter database rebalance statement> 구문을 수행하는 것은 다음과 같은 의미이다.

ALTER TABLE t1 REBALANCE;
COMMIT;
ALTER TABLE t2 REBALANCE;
COMMIT;
ALTER TABLE t3 REBALANCE;
COMMIT;
...
...
ALTER TABLE t_n REBALANCE;
COMMIT;

특정 테이블의 shard 재배치에 실패하더라도 <alter database rebalance statement> 구문은 계속 진행되며 shard 재배치에 성공한 테이블을 rollback 하지 않는다.

따라서 에러에 대해 적절한 조치를 취한 후 <alter database rebalance statement> 구문을 재수행할 경우 이미 shard 재배치에 성공한 테이블들은 재배치 대상에 포함되지 않으며, 재배치가 필요한 테이블들의 shard만 재배치한다.

사용 예

다음은 <alter database rebalance statement> 구문을 수행하는 예이다.

gSQL> ALTER DATABASE REBALANCE;

Database altered.

호환성

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

참조

관련 내용은 ALTER TABLE name REBALANCE를 참조한다.

ALTER DATABASE REBALANCE EXCLUDE CLUSTER GROUP

기능

특정 cluster group에 shard가 포함되지 않도록 모든 테이블의 shard를 재배치한다.

구문

<alter database rebalance exclude cluster group statement> ::=
    ALTER DATABASE REBALANCE EXCLUDE CLUSTER GROUP cluster_group_name [ ONLINE | OFFLINE ];

사용 범위 및 접근 권한

Cluster system에서 수행할 수 있다.

<alter database rebalance exclude cluster group statement> 구문을 수행하려면 사용자에게 ALTER DATABASE ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

cluster_group_name

테이블들의 shard를 포함하지 않는 cluster group의 이름이다.
지정한 cluster group이 유일한 cluster group인 경우 구문을 수행할 수 없다.

[ ONLINE | OFFLINE ]

테이블의 shard를 재배치할 때 DML을 허용할지 여부를 결정한다.

설명

DROP CLUSTER GROUP 구문을 사용하여 cluster group을 제거하려면 해당 cluster group에 shard가 존재하지 않아야 한다.

해당 cluster group이 shard를 포함하지 않도록 하기 위해 <alter database rebalance exclude cluster group statement> 구문을 수행한다. 해당 cluster group의 shard를 포함한 테이블들에 대해 <alter database rebalance exclude cluster group statement> 구문을 수행하는 것은 다음과 같은 의미이다.

ALTER TABLE t1 REBALANCE EXCLUDE CLUSTER GROUP g3;
COMMIT;
ALTER TABLE t2 REBALANCE EXCLUDE CLUSTER GROUP g3;
COMMIT;
ALTER TABLE t3 REBALANCE EXCLUDE CLUSTER GROUP g3;
COMMIT;
...
...
ALTER TABLE t_n REBALANCE EXCLUDE CLUSTER GROUP g3;
COMMIT;

저장 공간 부족 등으로 인해 <alter database rebalance exclude cluster group statement> 구문이 실패한 경우, shard 배제에 성공한 테이블은 rollback 하지 않는다.

따라서 에러에 대해 적절한 조치를 취한 후 <alter database rebalance exclude cluster group statement> 구문을 다시 수행하면 이미 shard 배제에 성공한 테이블들은 재배치 대상에 포함되지 않으며, 재배치가 필요한 테이블들의 shard만 배제하고 재배치한다.

사용 예

다음은 <alter database rebalance exclude cluster group statement> 구문을 수행하는 예이다.

gSQL> ALTER DATABASE REBALANCE EXCLUDE CLUSTER GROUP g3;

Database altered.

호환성

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

참조

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

ALTER DATABASE RENAME LOGFILE

기능

데이터베이스에서 로그파일의 이름을 수정한다.

구문

<alter database rename logfile statement> ::=
    ALTER DATABASE RENAME LOGFILE <logfile_list> TO <logfile_list>
    ;

<logfile_list> ::=
      'logfile_name'
    | <logfile_list> , 'logfile_name'

사용 범위 및 접근 권한

<alter database rename logfile statement> 구문을 수행하려면 사용자에게 ALTER DATABASE ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

<alter database rename logfile statement>

설명

각 구문별 사용 규칙을 참조한다.

사용 예

다음은 기존 로그파일 'logfile.log'를 'newlogfile.log'로 변경하는 예이다.

ALTER DATABASE RENAME LOGFILE 'logfile.log' TO 'newlogfile.log';

호환성

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

참조

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

ALTER DATABASE RECOVER

기능

온라인/ archive log file을 사용하여 데이터베이스 내의 전체 데이터파일 (datafile) 또는 일부 데이터파일을 복구한다.

구문

<alter database recover statement> ::=
      <complete database recover statement>
    | <datafile recover statement>
    | <complete tablespace recover statement>
    | <incomplete database recover statement>
    ;

<complete database recover statement> ::=
    ALTER DATABASE RECOVER

<datafile recover statement> ::=
    ALTER DATABASE RECOVER DATAFILE <datafile recovery clause>

<datafile recovery clause> ::=
    <datafile recovery object> [, ...]

<datafile recovery object> ::=
    'datafile_name' [<recovery using backup option>] [recovery corruption option>]

<recovery using backup option> ::=
    USING BACKUP 'backup_datafile_name'

<recovery corruption option> ::=
    CORRUPTION

<complete tablespace recover statement> ::=
    ALTER DATABASE RECOVER TABLESPACE tablespace_name

<incomplete database recover statement> ::=
      <batch incomplete recovery statement>
    | <interactive incomplete recovery statement>
    ;

<batch incomplete recovery statement> ::=
    ALTER DATABASE RECOVER <until clause> [<using backup controlfile option>]
    
<until clause> ::=
      UNTIL CHANGE integer

<using backup controlfile option> ::=
    USING BACKUP CONTROLFILE

<interactive incomplete recovery statement> ::=
    ALTER DATABASE <incomplete recovery option> [<using backup controlfile option>]

<incomplete recovery option> ::=
      BEGIN INCOMPLETE RECOVERY
    | END INCOMPLETE RECOVERY
    | RECOVER 'logfile name'
    | RECOVER AUTOMATICALLY
    | RECOVER SUGGESTION
    ;

사용 범위 및 접근 권한

<alter database recover statement> 구문을 수행하려면 사용자에게 ALTER DATABASE ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

<complete database recover statement>

온라인 및 archive log file을 이용하여 데이터베이스의 데이터 파일들을 최신 상태로 복구한다.

<datafile recover statement>

Immediate option으로 offline 된 tablespace의 datafile, backup된 datafile 또는 backup 중 장애로 인해 archive logfile을 이용한 복구가 필요한 tablespace의 datafile들을 최신상태로 복구한다.

<complete tablespace recover statement>

테이블스페이스의 데이터 파일들을 최신 상태로 복구한다.

<incomplete database recover statement>

<batch incomplete database recover statement>

온라인 및 archive log file을 이용하여 데이터베이스의 데이터 파일들을 최신상태가 아닌 특정 시점까지 일괄 복구한다.

<interactive incomplete database recover statement>

온라인 및 archive log file을 이용하여 데이터베이스의 데이터 파일들을 최신상태가 아닌 특정 시점까지 사용자와 대화식으로 복구한다.

설명

데이터베이스 불완전 복구는 복구 완료 시점을 한 번에 찾아내기 어려우므로 여러 번 수행하여 원하는 복구 시점을 찾아야 한다. 그런데 불완전 복구가 완료된 후 RESETLOGS 옵션으로 데이터베이스를 기동하면 새로운 데이터베이스가 되기 때문에 archive log file과 온라인 redo log file에 대한 복사본을 만든 후에 불완전 복구를 여러 번 수행해야 한다.

사용 예

다음은 전체 데이터베이스를 완전 복구하는 예이다.

ALTER DATABASE RECOVER;

다음은 데이터 파일을 복구하는 예이다.

ALTER DATABASE RECOVER DATAFILE 'test.dbf';

다음은 테이블스페이스를 복구하는 예이다.

ALTER DATABASE RECOVER TABLESPACE test_tbs;

다음은 LSN이 11123인 지점까지 전체 데이터베이스를 불완전 복구하는 예이다.

ALTER DATABASE RECOVER UNTIL CHANGE 11123;

다음은 복구 가능한 archive log file까지만 복구하는 대화식 불완전 복구의 예이다.

ALTER DATABASE BEGIN INCOMPLETE RECOVERY;
ALTER DATABASE RECOVER AUTOMATICALLY;
ALTER DATABASE END INCOMPLETE RECOVERY;

호환성

SQL 표준에서는 ALTER DATABASE 구문을 정의하지 않고 있다

참조

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

ALTER DATABASE REGISTER

기능

복구 불가능한 세그먼트를 데이터베이스에 등록한다.

구문

<alter database register statement> ::=
    ALTER DATABASE REGISTER IRRECOVERALBE SEGMENT 
        <segment physical identifier list>
    ;

<segment physical identifier list> ::=
      integer
    | <segment physical identifier list> , integer

사용 범위 및 접근 권한

<alter database register statement> 구문을 수행하려면 사용자에게 ALTER DATABASE ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

<alter database register statement>

복구 불가능한 세그먼트를 데이터베이스에 등록한다. 해당 구문은 백업이 존재하지 않고 데이터베이스를 복구할 수 없는 경우, 세그먼트를 더 이상 사용하지 않는다는 가정하에 사용될 수 있다.

<segment physical identifier list>

복구 불가능한 세그먼트의 식별자 목록이다.
• Integer: 8 바이트 정수형의 세그먼트 식별자

설명

서버를 비정상 종료하고 재시작할 때 데이터베이스를 복구하는데, 이 때 이전 서비스 단계에서 디스크에 반영되지 못한 페이지들을 복구하기 위해서 REDO 로그들을 이용해 페이지를 다시 수행한다.

REDO 연산을 수행하는 중에 예상하지 못한 실패가 발생한 경우, 이를 무시하고 복구하기 위해 사용될 수 있다.

사용 예

다음은 4028679323648을 식별자로 갖는 세그먼트 복구를 포기하는 예이다.

ALTER DATABASE REGISTER IRRECOVERABLE SEGMENT 4028679323648;

호환성

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

참조

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

ALTER DATABASE RESET LOCAL CLUSTER MEMBER

기능

Local cluster member에서 tablespace 객체를 제외한 부분을 database 생성 시점으로 초기화한다.

구문

<alter database reset local cluster member statement> ::=
    ALTER DATABASE RESET LOCAL CLUSTER MEMBER
    ;

사용 범위 및 접근 권한

Cluster system에서 수행할 수 있다.

Start-up 과정 중 LOCAL OPEN 단계에서 수행할 수 있다.

<alter database reset local cluster member statement> 구문을 수행하려면 사용자에게 ADMINISTRATION ON DATABASE 권한이 있어야 한다.

설명

Local cluster member에서 tablespace 객체를 제외한 부분을 database 생성 시점으로 초기화한다.
Tablespace 객체를 제외하고 사용자가 생성한 모든 객체를 제거한다.
<alter database reset local cluster member statement> 구문은 inactive cluster member를 초기화하고,
새로운 cluster member를 cluster system에 참여시키기 위해 사용한다.
Cluster system과 연결이 끊긴 inactive cluster member 들은 다음과 같이 처리할 수 있다.

이 때, cluster system에서 제외된 cluster member에 해당하는 장비는 다음 두 가지 방법으로 재사용할 수 있다.

방법 2는 방법 1보다 tablespace를 재생성하는 비용을 줄일 수 있다.

사용 예

다음은 cluster system에서 제외된 local cluster member를 LOCAL OPEN 단계까지 구동한 후, <alter database reset local cluster member statement> 구문을 이용해 초기화하는 예이다.

gSQL> \startup nomount

Startup success


gSQL> ALTER SYSTEM MOUNT DATABASE;

System altered.


gSQL> ALTER SYSTEM OPEN LOCAL DATABASE;

System altered.

gSQL> ALTER DATABASE RESET LOCAL CLUSTER MEMBER;

Database altered.

호환성

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

참조

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

ALTER DATABASE RESTORE

기능

증분 백업을 이용하여 데이터베이스나 테이블스페이스 내의 데이터 파일들을 복원한다.

구문

<alter database restore statement> ::=
      <database restore statement>
    | <tablespace restore statement>
    | <controlfile restore statement>
    ;

<database restore statement> ::=
    ALTER DATABASE RESTORE [ <until clause> ]

<until clause> ::=
    UNTIL CHANGE integer

<tablespace restore statement> ::=
    ALTER DATABASE RESTORE TABLESPACE tablespace_name

<controlfile restore statement> ::=
    ALTER DATABASE RESTORE CONTROLFILE FROM 'file_name'

사용 범위 및 접근 권한

alter database restore statement> 구문을 수행하려면 사용자에게 ALTER DATABASE ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

<database restore statement>

증분 백업을 사용하여 데이터베이스 내의 데이터 파일들을 복원한다. 
데이터베이스가 MOUNT 상태여야 한다.

<tablespace restore statement>

증분 백업을 사용하여 테이블스페이스 내의 데이터 파일들을 복원한다.

<controlfile restore statement>

'file_name'을 사용하여 제어파일을 복원한다.

설명

전체 백업을 이용한 데이터 파일 복원은 OS 복사 명령으로 백업된 파일을 직접 데이터 파일 경로에 복사하는 방법이다. 증분 백업을 이용한 데이터 파일 복원은 삭제된 데이터 파일이나 이전 데이터 파일들만 복원한다.

사용 예

다음은 증분 백업을 사용하여 데이터베이스를 복원하는 예이다.

ALTER DATABASE RESTORE;

다음은 증분 백업을 사용하여 테이블스페이스를 복원하는 예이다.

ALTER DATABASE RESTORE TABLESPACE test_tbs;

다음은 LSN이 11123 보다 작은 증분 백업만 사용하여 데이터베이스를 복원하는 예이다.

ALTER DATABASE RESTORE UNTIL CHANGE 11123;

다음은 controlfile.bak을 사용하여 제어파일을 복원하는 예이다.

ALTER DATABASE RESTORE CONTROLFILE FROM 'controlfile.bak'

호환성

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

참조

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

ALTER INDEX

기능

인덱스 정의를 변경한다.

구문

<alter index statement> ::=
      <alter index physical attribute statement>
    | <rename index statement>
    | <aging index statement>
    ;

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

<alter index physical attribute statement>

인덱스의 물리적 속성을 변경한다.
자세한 내용은 ALTER INDEX name STORAGE 구문을 참조한다.

<rename index statement>

인덱스 이름을 변경한다.
자세한 내용은 ALTER INDEX name RENAME TO 구문을 참조한다.

<aging statement>

인덱스의 빈 페이지를 삭제한다.
자세한 내용은 ALTER INDEX name AGING 구문을 참조한다.

설명

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

사용 예

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

호환성

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

ALTER INDEX name AGING

기능

인덱스의 빈 페이지를 삭제한다.

구문

<aging index statement> ::=
    ALTER INDEX index_name AGING
    ;

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

index_name

대상 인덱스의 이름이다.

설명

해당 구문은 인덱스 페이지들 중에 모든 키가 삭제된 페이지들을 세그먼트로 반납한다. Aging은 논리적 삭제와 물리적 삭제의 2단계로 진행된다. 논리적 삭제는 인덱스에서 페이지를 지칭하는 연결을 끊는 작업이며 페이지의 마지막 키를 삭제할 당시의 SCN이 시스템의 agable SCN보다 작을 때 수행된다. 이후 물리적 삭제가 이루어지는데 논리적으로 삭제할 때의 SCN이 시스템의 agable SCN보다 작을 때 수행된다.

만약 시스템의 agable SCN이 증가하지 않으면 인덱스 AGING 구문이 성공하더라도 빈 페이지가 삭제되지 않을 수 있다.

사용 예

다음은 인덱스를 aging하는 예이다.

gSQL> select index_name, empty_blocks from user_indexes where index_name = 'T1X';

INDEX_NAME EMPTY_BLOCKS
---------- ------------
T1X                   2

1 row selected.

gSQL> alter index t1x aging;

Index altered.

gSQL> select index_name, empty_blocks from user_indexes where index_name = 'T1X';

INDEX_NAME EMPTY_BLOCKS
---------- ------------
T1X                   0

1 row selected.

호환성

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

참조

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

ALTER INDEX name STORAGE

기능

인덱스의 물리적 속성을 변경한다.

구문

<alter index physical attribute statement> ::=
    ALTER INDEX index_name
    | <physical attribute clause>
    | [ STORAGE ( <segment attr 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 ]

사용 범위 및 접근 권한

<alter index physical attribute statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

index_name

대상 인덱스의 이름이다.

<physical attribute clause>

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

<segment attr clause>

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

<size clause>

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

설명

각 구문별 사용 규칙을 참조한다.

사용 예

다음은 인덱스의 물리적 속성을 변경하는 예이다.

gSQL> ALTER INDEX idx_t1_id PCTFREE 10 INITRANS 4 MAXTRANS 8;

Index altered.

호환성

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

참조

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

ALTER INDEX name RENAME TO

기능

인덱스의 이름을 변경한다.

구문

<rename index statement> ::=
    ALTER INDEX index_name
        RENAME TO new_index_name
    ;

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

index_name

대상 인덱스의 이름이다.
스키마 이름을 기술할 수 없으며, 기존 인덱스와 동일한 스키마 이름을 갖는다.

new_index_name

새로운 인덱스의 이름이며 스키마 내에서 유일한 인덱스 이름이어야 한다.

설명

각 구문별 사용 규칙을 참조한다.

사용 예

다음은 인덱스의 이름을 변경하는 예이다.

gSQL> ALTER INDEX t1_idx1 RENAME TO idx_t1_id;

Index altered.

호환성

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

참조

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

ALTER PROFILE

기능

비밀번호 관리 방법을 변경한다.

구문

<alter profile statement> ::= 
    ALTER 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

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

profile_name

변경할 profile의 이름이다.

FAILED_LOGIN_ATTEMPTS

로그인 연속 실패 허용 횟수를 설정한다.
자세한 내용은 CREATE PROFILE 구문을 참조한다.

PASSWORD_LOCK_TIME

로그인에 연속적으로 실패한 후에 계정이 잠기는 기간 (day)을 설정한다.
자세한 내용은 CREATE PROFILE 구문을 참조한다.

PASSWORD_LIFE_TIME

비밀번호의 유효 기간 (day)을 설정한다.
자세한 내용은 CREATE PROFILE 구문을 참조한다.

PASSWORD_GRACE_TIME

PASSWORD_LIFE_TIME 이후에 로그인 할 때 비밀번호 만료를 유예하는 기간을 설정한다.
자세한 내용은 CREATE PROFILE 구문을 참조한다.

PASSWORD_REUSE_MAX

이전 비밀번호를 재사용하려 할 때 재사용할 수 없는 최근 비밀번호 개수를 명시한다.
자세한 내용은 CREATE PROFILE 구문을 참조한다.

PASSWORD_REUSE_TIME

이전 비밀번호를 재사용하기 위해 필요한 경과 기간을 명시한다.
자세한 내용은 CREATE PROFILE 구문을 참조한다.

PASSWORD_VERIFY_FUNCTION

비밀번호 복잡도 검증 방법을 설정한다.
자세한 내용은 CREATE PROFILE 구문을 참조한다.

사용 예

다음은 계정 잠금을 제어하기 위해 profile을 변경하는 예이다.

gSQL> ALTER PROFILE prof1 LIMIT
        FAILED_LOGIN_ATTEMPTS 3
        PASSWORD_LOCK_TIME 3;

Profile altered.

gSQL> COMMIT;

Commit complete.

다음은 비밀번호 만료를 제어하기 위해 profile을 변경하는 예이다

gSQL> ALTER PROFILE prof1 LIMIT
        PASSWORD_LIFE_TIME 90 
        PASSWORD_GRACE_TIME 7;

Profile altered.

gSQL> COMMIT;

Commit complete.

다음은 비밀번호 재사용 여부를 제어하기 위해 profile을 변경하는 예이다.

gSQL> ALTER PROFILE prof1 LIMIT
        PASSWORD_REUSE_MAX  DEFAULT
        PASSWORD_REUSE_TIME DEFAULT;

Profile altered.

gSQL> COMMIT;

Commit complete.

다음은 비밀번호 복잡도 검사를 제어하기 위해 profile을 변경하는 예이다.

gSQL> ALTER PROFILE prof1 LIMIT
        PASSWORD_VERIFY_FUNCTION KISA_VERIFY_FUNCTION;

Profile altered.

gSQL> COMMIT;

Commit complete.

호환성

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

참조

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

ALTER SEQUENCE

기능

시퀀스를 변경한다.

구문

<alter sequence generator statement> ::=
    ALTER SEQUENCE sequence_name <alter sequence generator options>
    ;

<alter sequence generator options> ::=
    <alter sequence generator option> [, ...]

<alter sequence generator option> ::=
      <alter sequence generator restart option>
    | <basic sequence generator option>

<alter sequence generator restart option> ::=
    RESTART [ 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)

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

sequence_name

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

<alter sequence generator restart option>

시퀀스의 다음 값 (NEXT VALUE)을 설정한다.
단, CREATE SEQUENCE 구문에서 정의한 START WITH의 값은 변경하지 않는다.

<alter sequence generator restart option> 절을 명시하지 않은 경우, 시퀀스의 현재값을 기준으로 시퀀스의 속성을 변경한다.

<sequence generator increment by option>

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

<sequence generator maxvalue option>

시퀀스로 생성할 수 있는 최대값을 변경한다.
단, MAXVALUE의 값이 시퀀스의 현재값보다 작지 않아야 한다.

<sequence generator minvalue option>

시퀀스로 생성할 수 있는 최소값을 변경한다.
단, MINVALUE의 값이 시퀀스의 현재값보다 크지 않아야 한다.

<sequence generator cycle option>

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

<sequence generator cache option>

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

설명

CREATE SEQUENCE 구문에서 정의한 시퀀스 속성 중 START WITH는 변경할 수 없다.
START WITH 속성을 변경하려면 DROP SEQUENCE 구문을 수행한 후에 CREATE SEQUENCE 구문을 사용하여 다시 생성해야 한다.

사용 예

다음은 RESTART 옵션으로 시퀀스 값을 재시작하고 이를 사용하여 ID 값을 새로 부여하는 예이다.

gSQL> SELECT id, name FROM t1 ORDER BY 1;

 ID NAME  
--- ------
 10 leekmo
 42 mkkim 
 51 jhkim 
172 ehpark

4 rows selected.


gSQL> ALTER SEQUENCE seq1 RESTART;

Sequence altered.


gSQL> UPDATE t1 SET id = seq1.NEXTVAL;

4 rows updated.


gSQL> SELECT id, name FROM t1 ORDER BY 1;

ID NAME  
-- ------
 1 leekmo
 2 mkkim 
 3 jhkim 
 4 ehpark

4 rows selected.

호환성

SQL 표준에서는 CACHE/ NO CACHE 절을 정의하지 않고 있다.

SQL 표준 호환성

Feature ID

설명

지원 여부

T176

Sequence generator support

O

T177

Sequence generator support: simple restart option

O

참조

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

ALTER SESSION CLEANUP GLOBAL TEMPORARY SEGMENT POOL;

기능

세션에서 재사용하기 위해 catching 된 모든 공간들을 해당 tablespace로 반환한다.

구문

<alter session cleanup global temporary segment pool statement> ::=
    ALTER SESSION CLEANUP GLOBAL TEMPORARY SEGMENT POOL
    ;

설명

수행된 세션에서 segment cache의 segment들만 cleanup한다.

사용 예

다음은 세션 segment cache를 cleanup하는 예이다.

gSQL> ALTER SESSION CLEANUP GLOBAL TEMPORARY SEGMENT POOL;

Session altered.

호환성

SQL 표준에서는 global temporary table, global temporary index의 segment cache 개념을 정의하지 않고 있다.

참조

관련 내용은 Global Temporary Table 을 참조한다.

ALTER SESSION SET property_name

기능

세션의 프로퍼티 값을 설정한다.

구문

<alter session set statement> ::=
    ALTER SESSION SET <property name> { = <property value> | TO DEFAULT }
    ;

구문 규칙 및 파라미터

<property name>

설정할 프로퍼티 이름이다.
자세한 내용은 Database Administration 매뉴얼의 Server Property 장을 참조한다.

<property value>

설정할 프로퍼티 값이다.

TO DEFAULT

세션 프로퍼티 값을 시스템 프로퍼티 값으로 설정한다.

설명

각 property에 대한 자세한 설명은 Database Administration 매뉴얼의 Server Property 장을 참조한다.

사용 예

다음은 HINT_ERROR 속성을 설정하여 hint 구문에 오류가 있을 경우 에러가 발생하는 예이다.

gSQL> ALTER SESSION SET HINT_ERROR = ON;

Session altered.

gSQL> SELECT /*+ INDEX( t1, invalid_index ) */ name FROM t1 WHERE id = 1;

ERR-42000(16058): not applicable hint : 
SELECT /*+ INDEX( t1, invalid_index ) */ name FROM t1 WHERE id = 1
           *
ERROR at line 1:

다음은 세션 프로퍼티 값을 시스템 프로퍼티의 값으로 설정하는 예이다.

gSQL> ALTER SESSION SET HINT_ERROR TO DEFAULT;

Session altered.

호환성

SQL 표준에서는 세션 프로퍼티 개념을 정의하지 않고 있다.

참조

관련 내용은 ALTER SESSION SET property_name을 참조한다.

ALTER SYSTEM CHECKPOINT

기능

CHECKPOINT를 수행한다.

구문

<alter system checkpoint statement> ::=
    ALTER SYSTEM CHECKPOINT
    [ AT <domain name> ]
    ;

사용 범위 및 접근 권한

<alter system checkpoint statement> 구문을 수행하려면 사용자에게 ALTER SYSTEM ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

<alter system checkpoint statement>

CHECKPOINT는 commit된 트랜잭션들이 변경한 모든 데이터가 디스크에 기록되는 것을 보장하는 연산이다.

<domain name>

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

설명

체크포인트 (checkpoint) 연산은 commit 된 트랜잭션들이 변경한 모든 내용을 디스크에 기록함으로써 시스템 장애시 신속한 복구를 가능하게 한다.

사용 예

다음은 CHECKPOINT를 수행하는 예이다.

ALTER SYSTEM CHECKPOINT;

호환성

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

ALTER SYSTEM CLEANUP PLAN

기능

모든 SQL plan을 정리한다.

구문

<alter system cleanup plan statement> ::=
    ALTER SYSTEM CLEANUP PLAN
    [ AT <domain name> ]
    ;

사용 범위 및 접근 권한

<alter system cleanup plan statement> 구문을 수행하려면 사용자에게 ALTER SYSTEM ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

<alter system cleanup plan statement>

해당 구문 규칙이나 파라미터가 존재하지 않는다.

<domain name>

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

설명

캐시되어 있는 모든 SQL plan을 정리한다. 
단, V$SQL_CACHE.REF_COUNT가 0보다 큰 plan (prepare된 statement에서 참조하는 plan)들은 정리 대상에서 제외한다.

사용 예

다음은 CLEANUP PLAN을 수행하는 예이다.

ALTER SYSTEM CLEANUP PLAN;

호환성

SQL 표준에서는 CLEANUP PLAN의 개념을 정의하지 않고 있다.

ALTER SYSTEM IRRECOVERABLE CLUSTER MEMBER

기능

복구 불가능한 클러스터 멤버를 지정한다.

구문

<alter system irrecoverable cluster member statement> ::=
    ALTER SYSTEM IRRECOVERABLE CLUSTER MEMBER <domain name>
    ;

사용 범위 및 접근 권한

<alter system irrecoverable cluster member statement> 구문을 수행하려면 사용자에게 ALTER SYSTEM ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

<alter system irrecoverable cluster member statement>

해당 구문 규칙이나 파라미터가 존재하지 않는다.

<domain name>

복구 불가능한 멤버 이름이다.
그룹 내의 모든 멤버들을 복구 불가한 멤버로 지정할 수 없다.

설명

복구 불가능한 멤버로 인해 클러스터 재시작에 실패하는 경우 해당 멤버를 제외하고 시스템을 재시작하기 위해 사용한다. 시스템 재시작에 성공한 후에는 반드시 ALTER DATABASE DROP INACTIVE CLUSTER MEMBERS 구문을 이용해 해당 멤버를 삭제해야 한다.

사용 예

다음은 IRRECOVERABLE CLUSTER MEMBER를 수행하는 예이다.

gSQL> ALTER SYSTEM IRRECOVERABLE CLUSTER MEMBER g1n1;

호환성

SQL 표준에서는 IRRECOVERABLE CLUSTER MEMBER의 개념을 정의하지 않고 있다.

ALTER SYSTEM JOIN DATABASE

기능

비활성화된 특정 cluster member를 cluster system에 다시 포함시킨다.

구문

<alter system join database statement> ::=
    ALTER SYSTEM JOIN DATABASE 
    ;

사용 범위 및 접근 권한

Cluster system에서 수행할 수 있다.

<alter system join database statement> 구문을 수행하려면 사용자에게 ADMINISTRATION ON DATABASE 권한이 있어야 한다.

설명

Cluster member의 inactive 상태는 cluster system과 연결되어 있지 않은 상태로서 다음과 같은 상황에서 발생한다.

특정 cluster member가 inactive인 상태에서 해당 member를 다음과 같은 절차를 거쳐 cluster system에 포함시킬 수 있다.

$ gsql sys gliese --as sysdba --dsn=G3N2
gSQL> \startup
$ gsql sys gliese --as sysdba --dsn=G3N2
gSQL> ALTER SYSTEM JOIN DATABASE;

<alter system join database statement> 구문은 local open으로 구동된 inactive cluster member를 shutdown 하지 않고 cluster system에 참여시키려고 할 때 사용한다.

Inactive cluster member가 다시 cluster system에 참여하려면 cluster system과 inactive cluster member의 database 상태가 동일해야 한다.

Cluster system에서 database를 변경하는 트랜잭션이 완료된 후에는 inactive cluster member가 cluster system에 다시 참여할 수 없다.

다수의 inactive cluster member가 존재하는 경우, cluster system을 정상적으로 운영하기 위해 다음과 같은 순서로 inactive cluster member를 정리해야 한다.

  1. Cluster system에 참여할 수 있는 inactive cluster member를 JOIN 한다.

gSQL> ALTER SYSTEM JOIN DATABASE;
  1. Cluster system에 참여할 수 없는 inactive cluster member들을 DROP 한다.

gSQL> ALTER DATABASE DROP INACTIVE CLUSTER MEMBERS;

<alter database drop inactive cluster member statement> 구문을 수행하면 모든 inactive cluster member가 cluster system에서 제거되므로, DROP 하기 전에 참여 가능한 모든 inactive cluster member를 cluster system에 포함시켜야 한다.

사용 예

gSQL> ALTER SYSTEM JOIN DATABASE;

호환성

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

참조

관련 내용은 ALTER DATABASE DROP INACTIVE CLUSTER MEMBERS를 참조한다.

ALTER SYSTEM {MOUNT | OPEN} DATABASE

기능

데이터베이스를 시스템에 마운트하거나 서비스 가능한 상태로 변경한다.

구문

<alter system database statement> ::=
    ALTER SYSTEM <alter system database clause>
    ;

<alter system database clause> ::= 
      MOUNT DATABASE
    | OPEN [ <database_scope> ] DATABASE [ <open_database_option> ]

<open_database_option> ::=
      READ WRITE [ NORESETLOGS | RESETLOGS ]
    | READ ONLY

<database_scope> ::=
      LOCAL
    | GLOBAL

사용 범위 및 접근 권한

<alter system database statement> 구문을 수행하려면 사용자에게 ADMINISTRATION ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

<alter system database clause>

<open database option>

<database_scope>

사용 예

다음은 읽기 전용으로 데이터베이스를 구동하는 예이다.

ALTER SYSTEM OPEN DATABASE READ ONLY;

다음은 읽기/ 쓰기 모드로 구동하고, online redo log를 초기화하는 예이다.

ALTER SYSTEM OPEN DATABASE READ WRITE RESETLOGS;

호환성

SQL 표준에서는 데이터베이스의 MOUNT 또는 OPEN에 대한 개념을 정의하지 않고 있다.

참조

관련 내용은 ALTER DATABASE RECOVER를 참조한다.

ALTER SYSTEM [KILL | DISCONNECT] SESSION

기능

세션을 종료한다.

구문

<alter system end session statement> ::=
      ALTER SYSTEM DISCONNECT SESSION [<member_position>,] <session_id>,
          <serial#> [<disconnect_option>] [AT <domain_name>]
    |  ALTER SYSTEM KILL SESSION [<member_position>,] 
           <session_id>, <serial#>  [AT <domain_name>]    ;

<disconnect_option> ::=
      POST_TRANSACTION
    | IMMEDIATE

사용 범위 및 접근 권한

<alter system end session statement> 구문을 수행하려면 사용자에게 ALTER SYSTEM ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

<member_position>

Cluster 환경에서 disconnect/ kill 대상이 되는 세션의 member position 이다.

<session_id>

세션의 ID 이다.

<serial#>

세션의 SERIAL NUMBER이다.

<disconnect_option>

<disconnect_option>이 사용되지 않으면 IMMEDIATE로 작동한다.

<domain name>

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

설명

DISCONNECT SESSION은 POST_TRANSACTION과 IMMEDIATE 옵션을 지정할 수 있으며, POST_TRANSACTION은 현재 실행되는 트랜잭션이 있을 경우 트랜잭션이 끝난 후에 세션을 종료한다. IMMEDIATE는 현재 수행 중인 트랜잭션을 바로 정리한 후에 세션을 종료한다.

KILL SESSION은 해당 세션의 프로세스는 존재하지 않지만 시스템에 남아있는 비정상 세션을 종료한다.

사용 예

gSQL> SELECT USER_NAME, SESSION_ID, SERIAL_NO, SESSION_STATUS, PROGRAM_NAME FROM V$SESSION WHERE USER_NAME = 'TEST';

USER_NAME SESSION_ID SERIAL_NO SESSION_STATUS PROGRAM_NAME
--------- ---------- --------- -------------- ------------
TEST              62        49 CONNECTED      gsql        
TEST              65       109 CONNECTED      gsqlnet     
TEST              66       130 CONNECTED      gsql        

3 rows selected.

gSQL> ALTER SYSTEM DISCONNECT SESSION 65, 109;

System altered.

호환성

SQL 표준에서는 정의하지 않고 있다.

ALTER SYSTEM RECONNECT GLOBAL CONNECTION

기능

GLOBAL CONNECTION 형태로 접속한 세션에 재접속할지 여부를 설정한다.

구문

<alter system reconnect global connection statement> ::=
    ALTER SYSTEM RECONNECT GLOBAL CONNECTION
    ;

사용 범위 및 접근 권한

<alter system reconnect global connection statement> 구문을 수행하려면 사용자에게 ALTER SYSTEM ON DATABASE 권한이 있어야 한다.

설명

GLOBAL CONNECTION 클라이언트의 재접속 여부는 최초 접속할 때 서버로부터 얻은 system 객체의 SCN과 현재 서버의 system 객체의 SCN을 비교하여 결정한다. 해당 구문은 system 객체의 SCN을 상승시켜 클라이언트의 재접속을 유도한다.

해당 구문을 수행한 즉시 클라이언트가 재접속하는 것은 아니다. 클라이언트가 서버에 명령어를 실행할 때 SCN 비교를 통해서 재접속하며 만약 클라이언트에서 모든 멤버로의 연결이 유효하다면 재접속을 시도하지 않는다.

사용 예

다음은 해당 구문을 수행하는 예이다.

gSQL> ALTER SYSTEM RECONNECT GLOBAL CONNECTION;

System altered.

호환성

SQL 표준에서는 GLOBAL CONNECTION의 개념을 정의하지 않고 있다.

ALTER SYSTEM RESET property_name

기능

프로퍼티 파일에서 프로퍼티 값을 삭제한다.

구문

<alter system reset statement> ::=
    ALTER SYSTEM { RESET | UNSET } <property name>
        [ SCOPE = { FILE | SPFILE } ]
        [ AT <domain name>]
    ;

사용 범위 및 접근 권한

<alter system reset statement> 구문을 수행하려면 사용자에게 ALTER SYSTEM ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

{ RESET | UNSET }

RESET과 UNSET은 동일한 의미의 예약어이므로 어떤 것을 사용해도 무방하다.

<property name>

삭제할 프로퍼티의 이름이다.
자세한 내용은 Database Administration 매뉴얼의 Server Property 장을 참조한다.

[ SCOPE = { FILE | SPFILE } ]

프로퍼티 파일에서 삭제하는 것이므로 SCOPE=FILE/SPFILE만 사용할 수 있다.

SCOPE 절을 명시하지 않을 경우, 기본값은 SCOPE = FILE 이다.

<domain name>

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

설명

SCOPE=FILE/SPFILE을 사용하여 프로퍼티를 변경했을 경우, 갱신된 값이 프로퍼티 파일에 저장되고 데이터베이스를 재시작할 때 반영된다.

RESET 할 경우, 프로퍼티 파일에 저장된 해당 갱신값을 파일에서 제거하고 데이터베이스를 재시작할 때 default 값을 사용하도록 한다.

사용 예

다음은 SCOPE=FILE을 사용하여 프로퍼티를 변경하는 예이다.

gSQL> ALTER SYSTEM SET PROCESS_MAX_COUNT=128 SCOPE=FILE;

System altered.

gSQL> alter system set DEFAULT_INDEX_LOGGING=YES scope=FILE;

System altered.

다음은 위에서 변경한 프로퍼티를 삭제하는 예이다.

gSQL> ALTER SYSTEM RESET PROCESS_MAX_COUNT SCOPE=FILE;

System altered.

gSQL> ALTER SYSTEM RESET PROCESS_MAX_COUNT SCOPE=SPFILE;

System altered.

gSQL> ALTER SYSTEM RESET PROCESS_MAX_COUNT;

System altered.

gSQL> ALTER SYSTEM RESET DEFAULT_INDEX_LOGGING;

System altered.

gSQL> ALTER SYSTEM UNSET DEFAULT_INDEX_LOGGING;

System altered.

호환성

SQL 표준에서는 시스템 프로퍼티 개념을 정의하지 않고 있다.

참조

관련 내용은 ALTER SYSTEM SET property_name을 참조한다.

ALTER SYSTEM SET property_name

기능

시스템의 프로퍼티 값을 설정한다.

구문

<alter system set statement> ::=
    ALTER SYSTEM SET <property name> { = <property value> | TO DEFAULT }
        [ DEFERRED ]
        [ SCOPE = [ MEMORY | { FILE | SPFILE } | BOTH ] ]
    [AT <domain name>]
    ;

사용 범위 및 접근 권한

<alter system set statement> 구문을 수행하려면 사용자에게 ALTER SYSTEM ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

<property name>

설정할 프로퍼티의 이름이다.
자세한 내용은 Database Administration 매뉴얼의 Server Property 장을 참조한다.

<property value>

설정할 프로퍼티의 값이다.

TO DEFAULT

시스템 프로퍼티 값을 시스템을 구동할 당시의 최초값으로 설정한다.

[ DEFERRED ]

변경된 프로퍼티를 적용할 시점을 정의한다.

프로퍼티의 SYS_MODIFIABLE 속성값이 IMMEDIATE일 경우, DEFERRED를 명시하지 않으면 모든 SESSION에 바로 적용된다.

[ SCOPE = [ MEMORY | { FILE | SPFILE } | BOTH ] ]

시스템 프로퍼티 변경에 영향을 받는 범위를 정의한다.

SCOPE 절을 명시하지 않을 경우, 기본값은 SCOPE = MEMORY 이다.
프로퍼티의 SYS_MODIFIABLE 속성값이 FALSE인 경우에는 반드시 SCOPE=FILE/SPFILE이라고 명시해야 한다.

<domain name>

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

설명

관련 내용은 Database Administration 매뉴얼의 Server Property 장을 참조한다.

사용 예

다음은 SYS_MODIFIABLE 속성이 DEFERRED인 프로퍼티를 변경하는 예이다.

gSQL> ALTER SYSTEM SET HINT_ERROR = ON;

ERR-22000(13019): Invalid property modify mode.(HINT_ERROR)

gSQL> ALTER SYSTEM SET HINT_ERROR = ON DEFERRED;

System altered.

다음은 SYS_MODIFIABLE 속성이 FALSE인 프로퍼티를 변경하는 예이다.

gSQL> ALTER SYSTEM SET PROCESS_MAX_COUNT=128;

ERR-22000(13018): Specified property cannot be modified with this SCOPE option.(PROCESS_MAX_COUNT)

gSQL> ALTER SYSTEM SET PROCESS_MAX_COUNT=128 SCOPE=FILE;

System altered.

다음은 변경된 속성을 session 접속 당시의 default 값으로 변경하는 예이다.

gSQL> ALTER SYSTEM SET TRANSACTION_COMMIT_WRITE_MODE=0;

System altered.

gSQL> ALTER SYSTEM SET TRANSACTION_COMMIT_WRITE_MODE TO DEFAULT;

System altered.

gSQL> ALTER SYSTEM SET TRANSACTION_COMMIT_WRITE_MODE TO DEFAULT DEFERRED;

System altered.

호환성

SQL 표준에서는 시스템의 프로퍼티 개념을 정의하지 않고 있다.

참조

관련 내용은 ALTER SYSTEM RESET property_name을 참조한다.

ALTER SYSTEM SWITCH LOGFILE

기능

데이터베이스 내에 있는 CURRENT 상태의 로그파일을 ACTIVE 상태로 변경한다.

구문

<alter system switch logfile statement> ::=
    ALTER SYSTEM SWITCH LOGFILE
    [ AT <domain name> ]
    ;

사용 범위 및 접근 권한

<alter system switch logfile statement> 구문을 수행하려면 사용자에게 ALTER SYSTEM ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

<alter system switch logfile statement>

데이터베이스가 MOUNT 또는 OPEN 상태여야 한다.

<domain name>

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

설명

기본적으로 CURRENT 상태의 로그파일이 다 채워지면 자동으로 로그 스위치가 발생한다. 해당 구문은 특수한 상황에서 강제로 로그 스위치하고자 할 때 사용된다.

사용 예

ALTER SYSTEM SWITCH LOGFILE;

호환성

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

참조

관련 내용은 ALTER SYSTEM {MOUNT | OPEN} DATABASE를 참조한다.

ALTER TABLE

기능

테이블 정의를 변경한다.

구문

<alter table statement> ::=
      <alter table physical attribute statement>
    | <rename table statement>
    | <add column definition>
    | <drop column definition>
    | <alter column definition>
    | <rename column statement>
    | <add table constraint definition>
    | <drop table constraint definition>
    | <alter table constraint definition>
    | <rename table constraint statement>
    | <add table supplemental log statement>
    | <drop table supplemental log statement>
    | <rebalance statement>
    | <move shard statement>
    | <split shard statement>
    | <rename shard statement>
    | <read { only | write } statement>
    ;

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

<alter table physical attribute statement>

테이블의 물리적 속성을 변경한다.
자세한 내용은 ALTER TABLE name STORAGE 구문을 참조한다.

<rename table statement>

테이블 이름을 변경한다.
자세한 내용은 ALTER TABLE name RENAME TO 구문을 참조한다.

<add column definition>

테이블에 column을 추가한다.
자세한 내용은 ALTER TABLE name ADD COLUMN 구문을 참조한다.

<drop column definition>

테이블에서 column을 삭제한다.
자세한 내용은 ALTER TABLE name SET UNUSED COLUMN 구문을 참조한다.

<alter column definition>

테이블 column의 정의를 변경한다.
자세한 내용은 ALTER TABLE name ALTER COLUMN 구문을 참조한다.

<rename column statement>

테이블 column의 이름을 변경한다.
자세한 내용은 ALTER TABLE name RENAME COLUMN 구문을 참조한다.

<add table constraint definition>

테이블에 제약 조건을 추가한다.
자세한 내용은 ALTER TABLE name ADD CONSTRAINT 구문을 참조한다.

<drop table constraint definition>

테이블 제약 조건을 삭제한다.
자세한 내용은 ALTER TABLE name DROP CONSTRAINT 구문을 참조한다.

<alter table constraint definition>

테이블의 제약 조건을 변경한다.
자세한 내용은 ALTER TABLE name ALTER CONSTRAINT 구문을 참조한다.

<rename table constraint statement>

테이블 제약 조건의 이름을 변경한다.
자세한 내용은 ALTER TABLE name RENAME CONSTRAINT 구문을 참조한다.

<add table supplemental log statement>

테이블의 데이터가 변경되면 redo log에 부가 정보를 추가하도록 설정한다.
자세한 내용은 ALTER TABLE name ADD SUPPLEMENTAL LOG 구문을 참조한다.

<drop table supplemental log statement>

테이블의 데이터가 변경되면 redo log에 부가 정보를 추가하지 않도록 설정한다.
자세한 내용은 ALTER TABLE name DROP SUPPLEMENTAL LOG 구문을 참조한다.

<rebalance statement>

Cluster 환경에서 테이블의 shard를 재배치하거나 정합성이 깨진 shard를 동기화하여 정합성을 복구한다.
자세한 내용은 ALTER TABLE REBALANCE 구문을 참조한다.

<move shard statement>

Cluster 환경에서 테이블의 특정 shard를 특정 cluster group에 재배치한다.
자세한 내용은 ALTER TABLE MOVE SHARD 구문을 참조한다.

<split shard statement>

Cluster 환경에서 테이블의 특정 shard를 분산하여 특정 cluster group에 재배치한다.
자세한 내용은 ALTER TABLE SPLIT SHARD 구문을 참조한다.

<rename shard statement>

Cluster 환경에서 테이블의 특정 shard 이름을 변경한다.
자세한 내용은 ALTER TABLE name RENAME SHARD 구문을 참조한다.

<read { only | write } statement>

테이블에 READ ( only | write }을 설정한다.
자세한 내용은 ALTER TABLE name READ { ONLY | WRITE } 구문을 참조한다.

설명

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

사용 예

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

호환성

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

ALTER TABLE name ADD COLUMN

기능

테이블에 column을 추가한다.

구문

<add column definition> ::=
      ALTER TABLE table_name ADD [ COLUMN ] <column definition>
    | ALTER TABLE table_name ADD [ COLUMN ] ( <column definition> [, ...] )
    ;

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

table_name

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

ADD [ COLUMN ]

COLUMN 예약어는 생략할 수 있다.

<column definition>

추가할 column을 정의한다.
자세한 내용은 CREATE TABLE 구문의 <column definition> 절을 참조한다.
테이블 내에 동일한 column 이름이 존재하지 않아야 한다.
Column을 정의할 때 DEFAULT 절을 명시할 경우, 모든 row의 기본값을 추가되는 column에 저장한다.
Column을 정의할 때 <identity column specification> 절을 명시한 경우, 모든 row 각각의 자동 생성값을 추가되는 column에 저장한다.
Column을 정의할 때 NOT NULL 제약 조건을 함께 명시한 경우, 테이블을 비우거나 DEFALUT 절 또는 <identity column specification> 절을 함께 기술해야 한다.

( <column definition> [, ...] )

다수의 column을 추가한다.
괄호 내부에 다수의 <column definition>을 나열한다.

설명

추가되는 column은 기존 column들의 뒤에 위치한다.
DEFAULT 절이나 <identity column specification>을 명시한 경우, 수행시간은 테이블에 존재하는 row의 개수에 비례하여 증가한다.

사용 예

다음은 하나의 column을 추가하는 예이다.

gSQL> ALTER TABLE region ADD COLUMN r_new_comment VARCHAR(152);

Table altered.

다음은 다수의 column을 추가하는 예이다.

gSQL> ALTER TABLE partsupp ADD COLUMN ( 
   ps_retailprice NUMERIC(12,2), 
   ps_acctbal NUMERIC(12,2), ps_mktsegment  CHAR(10) );

Table altered.

다음은 identity column과 DEFAULT 절을 갖는 column을 추가하는 예이다.

gSQL> ALTER TABLE region ADD COLUMN ( 
    r_regionkey INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    r_comment   VARCHAR(152) DEFAULT 'N/A' );

Table altered.

gSQL> SELECT r_regionkey, r_name, r_comment FROM region;

R_REGIONKEY R_NAME                    R_COMMENT
----------- ------------------------- ---------
          1 AFRICA                    N/A      
          2 AMERICA                   N/A      
          3 ASIA                      N/A      
          4 EUROPE                    N/A      
          5 MIDDLE EAST               N/A      

5 rows selected.

다음은 지연가능한 제약 조건을 가지는 column을 추가하는 예이다.

gSQL> ALTER TABLE t1 ADD COLUMN ( id INTEGER CONSTRAINT t1_uk UNIQUE DEFERRABLE );

Table altered.

gSQL> COMMIT;

Commit complete.

호환성

SQL 표준에서는 다수의 column definition 추가에 대해 정의하지 않고 있다.

참조

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

ALTER TABLE name SET UNUSED COLUMN

기능

테이블 column을 제거한다.

구문

<drop column definition> ::=
    ALTER TABLE table_name <drop column clause>
    ;

<drop column clause> ::=
      SET UNUSED [ COLUMN ] <column_name_list> [ <drop behavior> ]

<column name list> ::=
      column_name
    | ( column_name [, ...] )

<drop behavior> ::=
      RESTRICT
    | CASCADE
    | CASCADE CONSTRAINTS

사용 범위 및 접근 권한

<drop column definition> 구문을 수행하려면 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

table_name

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

SET UNUSED [ COLUMN ]

해당 column들을 사용하지 않도록 설정한다.

column_name_list

한 개 이상의 삭제될 column 이름이다.

column_name

삭제할 column의 이름이다.
해당 column을 이용하는 제약 조건과 인덱스도 함께 삭제한다.

drop behavior

생략할 경우, 기본값은 RESTRICT 이다.
현재는 RESTRICT/ CASCADE가 동일하게 작동한다.

설명

SET UNUSED COLUMN은 data를 물리적으로 제거하지 않으므로 row의 개수에 관계없이 일정한 성능을 보장한다.

사용 예

다음은 해당 column을 사용하지 않도록 설정하는 예이다.

gSQL> ALTER TABLE t1 SET UNUSED COLUMN ( addr );

Table altered.

호환성

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

SQL 표준 호환성

Feature ID

설명

지원 여부

F033

ALTER TABLE statement: DROP COLUMN clause

X

참조

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

ALTER TABLE name ALTER COLUMN

기능

Column의 정의를 변경한다.

구문

<alter column definition> ::=
    ALTER TABLE table_name 
        ALTER [ COLUMN ] column_name <alter column action>

<alter column action> ::=

      <set column default clause>
    | <drop column default clause>
    | <set column not null clause>
    | <drop column not null clause>
    | <alter column data type clause>
    | <alter identity column specification>
    | <drop identity property clause>    
    ;

<set column default clause> ::=
    SET DEFAULT <default option>

<drop column default clause> ::=
    DROP DEFAULT

<set column not null clause> ::=
    SET [ CONSTRAINT constraint_name ] NOT NULL [ <constraint characteristics> ]


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

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

<drop column not null clause> ::=
    DROP NOT NULL

<alter column data type clause> ::=
    SET DATA TYPE <data type> 

<alter identity column specification> ::=
     <set identity column generation clause> [ <alter identity column option> ... ]
   | <alter identity column option> ...

<set identity column generation clause> ::=
   SET GENERATED { ALWAYS | BY DEFAULT }

<alter identity column option> ::=
     <alter sequence generator restart option>
   | [ SET ] <basic sequence generator option>

<alter sequence generator restart option> ::=
    RESTART [ 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>

<drop identity property clause> ::=
    DROP IDENTITY

사용 범위 및 접근 권한

<alter column definition> 구문을 수행하려면 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

table_name

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

ALTER [ COLUMN ]

COLUMN 예약어는 생략할 수 있다.

column_name

변경할 column의 이름이다.

<set column default clause>

Column의 기본값을 설정한다.
identity column이 아니어야 한다.
이후에 수행되는 INSERT 구문 등에서 DEFAULT 절을 사용할 경우 설정된 기본값이 사용된다.
DEFAULT expression의 데이터 타입은 column의 데이터 타입과 호환 가능해야 한다.
타입이 호환되지 않거나 공간이 부족한 경우 INSERT, UPDATE 구문에서 DEFAULT를 사용할 때 에러가 발생한다.

자세한 설명은 CREATE TABLE 구문의 <default clause> 절을 참조한다.

<drop column default clause>

Column의 기본값을 제거한다.
identity column이 아니어야 한다.
기본값을 제거하면 INSERT 구문 등에서 DEFAULT 절을 사용할 때 NULL 값으로 설정된다.

<set column not null clause>

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

<drop column not null clause>

<alter column data type clause>

SET DATA TYPE 구문은 자동으로 commit 되는 DDL 구문이다.

동일한 계열간에 타입을 변경할 수 있는데 이 때 다음 조건을 만족해야 한다.

character string type 변환

from \ to

CHAR(n)

VARHCAR(n)

LONG VARCHAR

CHAR(m)

X

X

X

VARCHAR(m)

X

n >= m

X

LONG VARCHAR

X

X

O

char length unit을 변경할 경우 다음과 같은 조건을 만족해야 한다.

character length unit 변환

from \ to

OCTETS

CHARACTERS

OCTETS

O

O

CHARACTERS

X

O

binary string type 변환

from \ to

BINARY(n)

VARBINARY(n)

LONG VARBINARY

BINARY(m)

X

X

X

VARBINARY(m)

X

n >= m

X

LONG VARBINARY

X

X

O

numeric type

from \ to

SMALLINT

INTEGER

BIGINT

NUMERIC

NUMERIC(q)

NUMERIC(q,t)

NUMBER(q)

NUMBER(q,t)

REAL

DOUBLE PRECISION

FLOAT

FLOAT(q)

NUMBER

SMALLINT

O

O

O

O

q >= 5

q >= 5

t >= 0

(q-t) >= 5

q >= 5

q >= 5

t >= 0

(q-t) >= 5

O

O

O

ddc(q) >= 5

O

INTEGER

X

O

O

O

q >= 10

q >= 10

t >= 0

(q-t) >= 10

q >= 10

q >= 10

t >= 0

(q-t) >= 10

X

O

O

ddc(q) >= 10

O

BIGINT

X

X

O

O

q >= 19

q >= 19

t >= 0

(q-t) >= 19

q >= 19

q >= 19

t >= 0

(q-t) >= 19

X

X

O

ddc(q) >= 19

O

NUMERIC

X

X

X

O

q == 38

q == 38

t == 0

q == 38

q == 38

t == 0

X

X

O

ddc(q) == 38

O

NUMERIC(p)

5 >= p

10 >= p

19 >= p

O

q >= p

q >= p

t >= 0

(q-t) >= p

q >= p

q >= p

t >= 0

(q-t) >= p

8 >= p

16 >= p

O

ddc(q) >= p

O

NUMERIC(p,s)

5 >= p

0 >= s

5 >= (p-s)

10 >= p

0 >= s

10 >= (p-s)

19 >= p

0 >= s 19 >= (p-s)

38 >= p

0 >= s

38 >= (p-s)

q >= p

0 >= s

q >= (p-s)

q >= p

t >= s

(q-t) >= (p-s)

q >= p

0 >= s

q >= (p-s)

q >= p

t >= s

(q-t) >= (p-s)

8 >= p

16 >= p

O

ddc(q) >= p

O

NUMBER(p)

5 >= p

10 >= p

19 >= p

O

q >= p

q >= p

t >= 0

(q-t) >= p

q >= p

q >= p

t >= 0 (q-t) >= p

8 >= p

16 >= p

O

ddc(q) >= p

O

NUMBER(p,s)

5 >= p

0 >= s

5 >= (p-s)

10 >= p 0 >= s 10 >= (p-s)

19 >= p

0 >= s

19 >= (p-s)

38 >= p

0 >= s

3

8 >= (p-s)

q >= p

0 >= s

q >= (p-s)

q >= p

t >= s

(q-t) >= (p-s)

q >= p

0 >= s

q >= (p-s)

q >= p

t >= s (q-t) >= (p-s)

8 >= p

16 >= p

O

ddc(q) >= p

O

REAL

X

X

X

X

X

X

X

X

O

O

O

ddc(q) >= 8

O

DOUBLE PRECISION

X

X

X

X

X

X

X

X

X

O

O

ddc(q) >= 16

O

FLOAT

X

X

X

X

X

X

X

X

X

X

O

ddc(q) == 38

O

FLOAT(p)

X

X

X

X

X

X

X

X

8 >= ddc(p)

16 >= ddc(p)

O

ddc(q) >= ddc(p)

O

NUMBER

X

X

X

X

X

X

X

X

X

-

O

ddc(q) == 38

O

FLOAT(p)에 대한 ddc (decimal digit count) 값은 다음과 같다.

ddc (decimal digit count) 값

FLOAT(p)

ddc(p)

1 ~ 3

1

4 ~ 6

2

7 ~ 9

3

10 ~ 13

4

14 ~ 16

5

17 ~ 19

6

20 ~ 23

7

24 ~ 26

8

27 ~ 29

9

30 ~ 33

10

34 ~ 36

11

37 ~ 39

12

40 ~ 43

13

44 ~ 46

14

47 ~ 49

15

50 ~ 53

16

54 ~ 56

17

57 ~ 59

18

60 ~ 63

19

64 ~ 66

20

67 ~ 69

21

70 ~ 73

22

74 ~ 76

23

77 ~ 79

24

80 ~ 83

25

84 ~ 86

26

87 ~ 89

27

90 ~ 93

28

94 ~ 96

29

97 ~ 99

30

100 ~ 103

31

104 ~ 106

32

107 ~ 109

33

110 ~ 113

34

114 ~ 116

35

117 ~ 119

36

120 ~ 123

37

124 ~ 126

38

참고로 모든 numeric type은 동일한 구조로 관리되며, 각 numeric type은 다음과 같은 NUMBER(p,s) 표현식과 동일하다.

Numeric type들의 NUMBER 표현식

Numeric type

NUMBER(p,s) 표현식

SMALLINT

NUMBER(5,0)

INTEGER

NUMBER(10,0)

BIGINT

NUMBER(19,0)

NUMERIC

NUMBER(38,0)

NUMERIC(p)

NUMBER(p,0)

NUMERIC(p,s)

NUMBER(p,s)

NUMBER(p)

NUMBER(p,0)

NUMBER(p,s)

NUMBER(p,s)

REAL

NUMBER(8,N/A) <= FLOAT(24)

DOUBLE PRECISION

NUMBER(16,N/A) <= FLOAT(53)

FLOAT

NUMBER(38,N/A) <= FLOAT(126)

FLOAT(p)

NUMBER( ddc(p), N/A )

NUMBER

NUMBER(38, N/A )

Native 숫자형은 C 언어의 숫자형 타입과 동일한 데이터 타입이며 서로 다른 타입으로 변환할 수 없다.

Native 숫자형의 변환

from \ to

NATIVE_SMALLINT

NATIVE_INTEGER

NATIVE_BIGINT

NATIVE_REAL

NATIVE_DOUBLE

NATIVE_SMALLINT

O

X

X

X

X

NATIVE_INTEGER

X

O

X

X

X

NATIVE_BIGINT

X

X

O

X

X

NATIVE_REAL

X

X

X

O

X

NATIVE_DOUBLE

X

X

X

X

O

Boolean type의 변환

from \ to

BOOLEAN

BOOLEAN

O

Date/ time type의 변환 (TZ: WITH TIME ZONE)

from \ to

DATE

TIME

TIME(g)

TIME TZ

TIME(g) TZ

TIMESTAMP

TIMESTAMP(g)

TIMESTAMP TZ

TIMESTAMP(g) TZ

DATE

O

X

X

X

X

X

X

X

X

TIME

X

O

g >= 6

X

X

X

X

X

X

TIME(f)

X

6 >= f

g >= f

X

X

X

X

X

X

TIME TZ

X

X

X

O

g >= 6

X

X

X

X

TIME(f) TZ

X

X

X

6 >= f

g >= f

X

X

X

X

TIMESTAMP

X

X

X

X

X

O

g >= 6

X

X

TIMESTAMP(f)

X

X

X

X

X

6 >= f

g >= f

X

X

TIMESTAMP TZ

X

X

X

X

X

X

X

O

g >= 6

TIMESTAMP(f) TZ

X

X

X

X

X

X

X

6 >= f

g >= f

INTERVAL YEAR TO MONTH 계열의 type 변환 (p,q 가 생략된 경우 2)

from \ to

YEAR(q)

MONTH(q)

YEAR(q) TO MONTH

YEAR(p)

q >= p

X

X

MONTH(p)

X

q >= p

X

YEAR(p) TO MONTH

X

X

q >= p

INTERVAL DAY TO TIME 계열의 type 변환 (p,q 가 생략된 경우 2) (f,g 가 생략된 경우 6)

from \ to

DAY(q)

HOUR(q)

MINUTE(q)

SECOND(q,g)

DAY(q) TO HOUR

DAY(q) TO MINUTE

DAY(q) TO SECOND(g)

HOUR(q) TO MINUTE

HOUR(q) TO SECOND(g)

MINUTE(q) TO SECOND(g)

DAY(p)

q >= p

X

X

X

X

X

X

X

X

X

HOUR(p)

X

q >= p

X

X

X

X

X

X

X

X

MINUTE(p)

X

X

q >= p

X

X

X

X

X

X

X

SECOND(p,f)

X

X

X

q >= p

g >= f

X

X

X

X

X

X

DAY(p) TO HOUR

X

X

X

X

q >= p

X

X

X

X

X

DAY(p) TO MINUTE

X

X

X

X

X

q >= p

X

X

X

X

DAY(p) TO SECOND(f)

X

X

X

X

X

X

q >= p

g >= f

X

X

X

HOUR(p) TO MINUTE

X

X

X

X

X

X

X

q >= p

X

X

HOUR(p) TO SECOND(f)

X

X

X

X

X

X

X

X

q >= p

g >= f

X

MINUTE(p) TO SECOND(f)

X

X

X

X

X

X

X

X

X

q >= p

g >= f

ROWID type

from \ to

ROWID

ROWID

O

<alter identity column specification>

Column의 identity 속성을 변경한다.
Column은 identity column 이어야 한다.

<drop identity property clause>

Column의 identity 속성을 제거한다.
Column은 identity column 이어야 한다.

설명

SET NOT NULL 절의 null 검사 수행시간은 테이블의 row 개수에 비례한다.

다음과 같은 column은 NULL 값을 허용하지 않는다. 즉, DROP NOT NULL 절을 수행하더라도 다음 조건 중 하나를 만족할 경우 NULL 값을 허용하지 않는다.

SET DEFAULT 절을 이용한 기본값 변경과 <alter identity column specification> 절을 이용한 identity 속성의 변경은 이후에 수행되는 INSERT 또는 UPDATE 구문에 적용된다.

사용 예

다음은 column에 DEFAULT 속성을 설정하는 예이다.

gSQL> ALTER TABLE region ALTER COLUMN r_comment SET DEFAULT 'N/A';

Table altered.

다음은 column의 DEFAULT 속성을 제거하는 예이다.

gSQL> ALTER TABLE region ALTER COLUMN r_comment DROP DEFAULT;

Table altered.

다음은 column에 NOT NULL 제약 조건을 설정하는 예이다.

gSQL> ALTER TABLE region ALTER COLUMN r_regionkey SET NOT NULL;

Table altered.

다음은 column의 NOT NULL 제약 조건을 제거하는 예이다.

gSQL> ALTER TABLE region ALTER COLUMN r_regionkey DROP NOT NULL;

Table altered.

다음은 column의 data type 크기를 확장하는 예이다.

gSQL> ALTER TABLE region ALTER COLUMN r_comment SET DATA TYPE VARCHAR(512);

Table altered.

다음은 identity column의 다음 값을 다시 시작하는 예이다.

gSQL> ALTER TABLE region ALTER COLUMN r_regionkey RESTART;

Table altered.

다음은 column의 identity 속성을 제거하는 예이다.

gSQL> ALTER TABLE region ALTER COLUMN r_regionkey DROP IDENTITY;

Table altered.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

F381

Extended schema manipulation

X

F382

Alter column data type

O

F383

Set column not null clause

O

F384

Drop identity property value

O

F385

Drop column generation expression clause

X

F386

Set identity column generation clause

O

S043

Enhanced reference types

X

T174

Identity columns

O

T178

Identity columns: simple restart option

O

참조

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

ALTER TABLE name RENAME COLUMN

기능

테이블 column의 이름을 변경한다.

구문

<rename column statement> ::=
    ALTER TABLE table_name 
        RENAME COLUMN old_column_name TO new_column_name
    ;

사용 범위 및 접근 권한

<rename column statement> 구문을 수행하려면 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

table_name

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

old_column_name

변경할 column의 기존 이름이다.

new_column_name

변경할 column의 새로운 이름이다.
테이블 내에 동일한 column 이름이 존재하지 않아야 한다.

설명

Column 이름이 변경되더라도 이전에 해당 column을 기준으로 생성된 index, constraint 등의 객체를 변경할 필요는 없다.

사용 예

다음은 두 개의 column 이름인 col_1과 col_2를 서로 바꾸는 예이다.

gSQL> ALTER TABLE t1 RENAME COLUMN col_1 TO col_temp;

Table altered.

gSQL> ALTER TABLE t1 RENAME COLUMN col_2 TO col_1;

Table altered.

gSQL> ALTER TABLE t1 RENAME COLUMN col_temp TO col_2;

Table altered.

gSQL> COMMIT;

Commit complete.

호환성

SQL 표준에서는 <rename column statement> 구문을 정의하지 않고 있다.

참조

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

ALTER TABLE name ADD CONSTRAINT

기능

테이블 제약 조건을 추가한다.

구문

<add table constraint definition> ::=
    ALTER TABLE table_name 
        ADD <table constraint definition>
    ;

사용 범위 및 접근 권한

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

Cluster system에서 PRIMARY KEY와 UNIQUE 제약 조건은 모든 sharding key를 포함해야 한다.

구문 규칙 및 파라미터

table_name

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

<table constraint definition>

추가할 제약 조건을 정의한다.
NOT NULL 제약 조건은 ALTER TABLE .. ADD CONSTRAINT 구문으로 추가할 수 없으며, 다음 예와 같이 ALTER TABLE name ALTER COLUMN 구문을 이용해 정의할 수 있다.
ALTER TABLE t1 ALTER COLUMN c1 SET NOT NULL;

자세한 내용은 CREATE TABLE 구문의 <table constraint definition> 절을 참조한다.

설명

Primary key, unique key와 같은 key 제약을 추가할 때 이를 위한 index가 자동으로 생성된다.

사용 예

다음은 테이블에 primary key 제약 조건을 추가하는 예이다.

gSQL> ALTER TABLE t1 ADD PRIMARY KEY ( id );

Table altered.

다음은 테이블에 primary key 제약 조건을 추가할 때 제약 조건 이름을 명시하는 예이다.

gSQL> ALTER TABLE t1 ADD CONSTRAINT t1_pk PRIMARY KEY ( id );

Table altered.

다음은 지연 가능한 제약 조건을 추가하는 예이다.

gSQL> ALTER TABLE t1 ADD CONSTRAINT t1_uk UNIQUE ( id ) DEFERRABLE INITIALLY DEFERRED;

Table altered.

gSQL> COMMIT;

Commit complete.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

F381

Extended schema manipulation

O

참조

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

ALTER TABLE name DROP CONSTRAINT

기능

테이블 제약 조건을 제거한다.

구문

<drop table constraint definition> ::=
    ALTER TABLE table_name 
        DROP <constraint object>
        [ <drop behavior> ]
    ;

<constraint object> ::=
      CONSTRAINT constraint_name
    | PRIMARY KEY 
    | UNIQUE ( column_name [, ...] ) 

<drop behavior> ::=
      RESTRICT
    | CASCADE
    | CASCADE CONSTRAINTS

사용 범위 및 접근 권한

<drop table constraint definition> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

table_name

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

CONSTRAINT constraint_name

제거할 제약 조건의 이름이다.

PRIMARY KEY

테이블의 primary key 제약 조건이다.

UNIQUE( column_name [, ...] )

Column들에 대한 unique 제약 조건이다.

<drop behavior>

생략할 경우, 기본값은 RESTRICT 이다.
현재는 RESTRICT/ CASCADE가 동일하게 작동한다.

설명

제약 조건의 이름을 사용하지 않고 NOT NULL 제약 조건을 제거하려고 할 경우 ALTER TABLE name ALTER COLUMN 구문의 <drop column not null clause> 절을 이용한다.

사용 예

다음은 테이블의 primary key 제약 조건을 제거하는 예이다.

gSQL> ALTER TABLE t1 DROP PRIMARY KEY;

Table altered.

다음은 제약 조건 이름을 명시하여 테이블의 제약 조건을 제거하는 예이다.

gSQL> ALTER TABLE t1 DROP CONSTRAINT t1_pk;

Table altered.

호환성

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

SQL 표준 호환성

Feature ID

설명

지원 여부

F381

Extended schema manipulation

O

참조

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

ALTER TABLE name ALTER CONSTRAINT

기능

테이블 제약 조건의 특성을 변경한다.

구문

<alter table constraint definition> ::=
    ALTER TABLE table_name 
        ALTER <constraint object> <constraint characteristics>
    ;

<constraint object> ::=
      CONSTRAINT constraint_name
    | PRIMARY KEY 
    | UNIQUE ( column_name [, ...] ) 

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

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

사용 범위 및 접근 권한

<alter table constraint definition> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

Cluster는 지연 가능한 제약 조건을 지원하지 않는다.

구문 규칙 및 파라미터

table_name

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

<constraint object>

변경할 제약 조건은 다음과 같이 지정할 수 있다.

DEFERRABLE | NOT DEFERRABLE

제약 조건의 지연 가능 여부를 변경한다.

INITIALLY IMMEDIATE | INITIALLY DEFERRED

제약 조건의 검사시점 초기값을 변경한다.

NOT DEFERRABLE로 정의된 제약 조건은 INITIALLY DEFERRED로 변경할 수 없다.

설명

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

사용 예

다음은 t1_uk 제약 조건을 지연가능하게 하고 검사시점을 DEFERRED로 설정하는 예이다.

gSQL> ALTER TABLE t1 ALTER CONSTRAINT t1_uk DEFERRABLE INITIALLY DEFERRED;

Table altered.

gSQL> COMMIT;

Commit complete.

호환성

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

SQL 표준 호환성

Feature ID

설명

지원 여부

F492

Optional table constraint enforcement

X

ALTER TABLE name RENAME CONSTRAINT

기능

테이블 제약 조건의 이름을 변경한다.

구문

<rename table constraint statement> ::=
    ALTER TABLE table_name 
        RENAME <constraint object> TO new_constraint_name
    ;

<constraint object> ::=
      CONSTRAINT constraint_name
    | PRIMARY KEY 
    | UNIQUE ( column_name [, ...] )

사용 범위 및 접근 권한

<rename table constraint statement> 구문을 수행하려면 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

table_name

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

<constraint object>

변경할 제약 조건의 기존 이름은 다음과 같이 지정할 수 있다.

new_column_name

변경할 제약 조건의 새로운 이름이다.

설명

Primary key, unique key와 같이 key 제약 조건으로 자동 생성된 index의 이름은 변경되지 않는다. Index 이름은 ALTER INDEX name RENAME TO 구문을 사용하여 변경해야 한다.

사용 예

다음은 테이블의 primary key 제약 조건 이름을 변경하는 예이다.

gSQL> ALTER TABLE t1 RENAME PRIMARY KEY TO pk_t1;

Table altered.

다음은 제약 조건 이름을 명시하여 테이블의 제약 조건 이름을 변경하는 예이다.

gSQL> ALTER TABLE t1 RENAME CONSTRAINT pk_t1 TO t1_pk;

Table altered.

호환성

SQL 표준에서는 <rename table constraint statement> 구문을 정의하지 않고 있다.

참조

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

ALTER TABLE name ADD GLOBAL SECONDARY INDEX

기능

테이블에 global secondary index를 생성한다.

구문

<alter table add global secondary index definition> ::=
    ALTER TABLE table_name 
        ADD GLOBAL SECONDARY INDEX
        [ <index attributes> [...] ] [ TABLESPACE tablespace_name ]
    ;

<index attributes> ::=
      <physical attribute clause>
    | STORAGE ( <segment attr clause> [...] )
    | <logging 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 ]

<logging clause> ::=
      LOGGING
    | NOLOGGING

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

사용 범위 및 접근 권한

<alter table add global secondary index definition> 구문은 cluster system에서 정의할 수 있으며 사용자는 다음 조건들을 만족해야 한다.

구문 규칙 및 파라미터

table_name

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

<physical attribute clause>

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

<segment attr clause>

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

<size clause>

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

LOGGING | NOLOGGING

인덱스의 리두 로깅 여부를 명시한다.
명시하지 않을 경우, 기본값은 NOLOGGING 이다.

NOPARALLEL | PARALLEL [ integer ]

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

TABLESPACE tablespace_name

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

설명

Non-deterministic 질의에는 global secondary index가 반드시 필요하다. LOGGING 인덱스와 NOLOGGING 인덱스에는 다음과 같은 trade-off가 있다.

사용 예

다음은 테이블 T1에 global secondary index를 추가하는 예이다.

gSQL> ALTER TABLE T1 ADD GLOBAL SECONDARY INDEX;

Table altered.

gSQL> COMMIT;

Commit complete.

다음은 logging option으로 테이블 T1의 tablespace USER_DATA_TBS에 global secondary index를 생성하는 예이다.

gSQL> ALTER TABLE T1 ADD GLOBAL SECONDARY INDEX LOGGING TABLESPACE USER_DATA_TBS;

Table altered.

gSQL> COMMIT;

Commit complete.

다음은 nologging option으로 테이블 T1의 tablespace USER_TEMP_TBS에 global secondary index를 생성하는 예이다.

gSQL> ALTER TABLE T1 ADD GLOBAL SECONDARY INDEX NOLOGGING TABLESPACE USER_TEMP_TBS;

Table altered.

gSQL> COMMIT;

Commit complete.

호환성

SQL 표준에서는 global secondary index에 대한 개념을 다루지 않고 있다.

참조

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

ALTER TABLE name DROP GLOBAL SECONDARY INDEX

기능

테이블에서 global secondary index를 제거한다.

구문

<alter table drop global secondary index definition> ::=
    ALTER TABLE table_name 
        DROP GLOBAL SECONDARY INDEX
    ;

사용 범위 및 접근 권한

<alter table drop global secondary index definition> 구문은 cluster system에서 정의할 수 있으며 사용자는 다음 조건들을 만족해야 한다.

구문 규칙 및 파라미터

table_name

인덱스를 제거할 테이블 이름이다.

설명

Non-deterministic 질의를 하려면 global secondary index가 반드시 필요하다.

사용 예

테이블 T1에서 global secondary index를 제거한다.

gSQL> ALTER TABLE T1 DROP GLOBAL SECONDARY INDEX;

Table altered.

gSQL> COMMIT;

Commit complete.

호환성

SQL 표준에서는 global secondary index에 대한 개념을 다루지 않고 있다.

참조

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

ALTER TABLE name ALTER GLOBAL SECONDARY INDEX

기능

테이블에서 global secondary index의 물리적 속성을 변경한다.

구문

<alter table alter global secondary index storage statement> ::=
    ALTER TABLE table_name ALTER GLOBAL SECONDARY INDEX
      <physical attribute clause>
    | [ STORAGE ( <segment attr 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 ]

사용 범위 및 접근 권한

<alter table alter global secondary index storage statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

table_name

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

<physical attribute clause>

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

<segment attr clause>

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

<size clause>

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

설명

Non-deterministic 질의를 하려면 global secondary index가 반드시 필요하다.

사용 예

테이블 T1의 global secondary index가 사용할 최대 크기를 100 Mbyte로 변경한다.

gSQL> ALTER TABLE T1 ALTER GLOBAL SECONDARY INDEX STORAGE( MAXSIZE 100M );

Table altered.

gSQL> COMMIT;

Commit complete.

테이블 T1의 global secondary index가 사용할 INITRANS, MAXTRANS 값을 2와 4로 변경한다.

gSQL> ALTER TABLE T1 ALTER GLOBAL SECONDARY INDEX INITRANS 2 MAXTRANS 4;

Table altered.

gSQL> COMMIT;

Commit complete.

호환성

SQL 표준에서는 global secondary index에 대한 개념을 다루지 않고 있다.

참조

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

ALTER TABLE name MOVE SHARD

기능

테이블의 특정 shard 또는 특정 cluster group의 전체 shard를 특정 cluster group에 재배치한다.

구문

<alter table move shard statement> ::=
    ALTER TABLE table_name MOVE SHARD
        { shard_name_list | FROM CLUSTER GROUP src_cluster_group }
        TO CLUSTER GROUP dest_cluster_group [ ONLINE | OFFLINE ]
    ;

사용 범위 및 접근 권한

Cluster system에서 수행할 수 있다.

<alter table move shard statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

table_name

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

shard_name_list

재배치할 shard name 목록이다.
해당 테이블에 존재하지 않는 shard인 경우 구문을 수행할 수 없다.

src_cluster_group

재배치할 특정 cluster group의 이름이다.

dest_cluster_group

테이블의 shard를 배치할 target cluster group의 이름이다.
해당 테이블의 shard가 지정한 cluster group에 이미 존재할 경우 구문을 수행할 수 없다.

[ ONLINE | OFFLINE ]

테이블의 shard를 재배치할 때 DML을 허용할지 여부를 결정한다.

설명

테이블의 특정 shard를 특정 cluster group에서 다른 cluster group으로 재배치한다.

특정 cluster group을 제거하려면 테이블의 shard를 재배치한 후에 DROP CLUSTER GROUP 구문을 수행해야 한다.

모든 테이블의 shard를 특정 cluster group에서 다른 cluster group으로 이동시키는 경우, ALTER DATABASE MOVE SHARD FROM CLUSTER GROUP TO CLUSTER GROUP 구문을 수행한다.

사용 예

다음은 <alter table move shard statement> 구문을 수행하는 예이다.

gSQL> ALTER TABLE t1 MOVE SHARD shard1, shard2 TO CLUSTER GROUP g3;

Table altered.

gSQL> ALTER TABLE t1 MOVE SHARD FROM CLUSTER GROUP g1 TO CLUSTER GROUP g3;

Table altered.

호환성

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

참조

관련 내용은 ALTER DATABASE MOVE SHARD를 참조한다.

ALTER TABLE name REBALANCE

기능

테이블의 shard를 재배치한다.

구문

<alter table rebalance statement> ::=
    ALTER TABLE table_name REBALANCE [ ONLINE | OFFLINE ]
    ;

사용 범위 및 접근 권한

Cluster system에서 수행할 수 있다.

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

구문 규칙 및 파라미터

table_name

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

[ ONLINE | OFFLINE ]

테이블의 shard를 재배치할 때 DML을 허용할지 여부를 결정한다

설명

다음과 같은 구문을 통해 cluster member, cluster group을 추가할 때 table들의 shard는 재배치하지 않는다.

추가된 cluster group과 cluster member의 테이블 shard를 재배치하려면 <alter table rebalance statement> 구문을 수행한다. 테이블의 shard가 이미 재배치된 경우, 별도의 재배치 작업 없이 실행에 성공한다.

모든 테이블들의 shard를 재배치하려면 ALTER DATABASE REBALANCE 구문을 수행한다.

사용 예

다음은 <alter table rebalance statement> 구문을 수행하는 예이다.

gSQL> ALTER TABLE t1 REBALANCE;

Table altered.

호환성

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

ALTER TABLE name REBALANCE EXCLUDE CLUSTER GROUP cluster_group_list

기능

특정 cluster group에 shard를 포함하지 않도록 테이블의 shard를 재배치한다.

구문

<alter table rebalance exclude cluster group statement> ::=
    ALTER TABLE table_name REBALANCE 
        EXCLUDE CLUSTER GROUP cluster_group_list [ ONLINE | OFFLINE ]
    ;

사용 범위 및 접근 권한

Cluster system에서 수행할 수 있다.

<alter table rebalance exclude cluster group statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

table_name

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

cluster_group_list

테이블의 shard를 포함하지 않는 cluster group의 list이다.
재배치에서 제외될 cluster group이 cluster 전체 group인 경우 구문을 수행할 수 없다.

[ ONLINE | OFFLINE ]

테이블의 shard를 재배치할 때 DML을 허용할지 여부를 결정한다.

설명

특정 cluster group을 배제하고 테이블의 shard를 재배치한다.
해당 cluster group에 테이블의 shard가 존재하지 않을 경우, 별도의 재배치 작업없이 성공한다.
테이블의 shard가 위치한 cluster group을 기준으로 shard를 재배치한다.
특정 cluster group을 제거하려면 테이블의 shard를 재배치한 후 DROP CLUSTER GROUP 구문을 수행해야 한다.
모든 테이블들에서 cluster group을 배제하고 shard를 재배치하고자 할 경우, ALTER DATABASE REBALANCE EXCLUDE CLUSTER GROUP을 수행한다.

사용 예

다음은 <alter table rebalance exclude cluster group statement> 구문을 수행하는 예이다.

gSQL> ALTER TABLE t1 REBALANCE EXCLUDE CLUSTER GROUP g3;

Table altered.

호환성

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

ALTER TABLE name SPLIT SHARD

기능

Cluster 환경에서 테이블의 특정 shard를 split하여 재배치한다.

구문

<alter table split shard statement> ::=
    ALTER TABLE table_name SPLIT SHARD source_shard_name
        INTO ( <split shard placement> [, ...] )
    ;

<split shard placement> ::=
    <split shard bound def> AT CLUSTER GROUP dest_group_name

<split shard bound def> ::=
    <split list shard def>
  | <split range shard def>

<split list shard def> :=
    SHARD dest_shard_name VALUES IN ( <split list value clause> )

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

<split list value> :=
    constant
  | NULL

<split range shard def> :=
    SHARD dest_shard_name VALUES LESS THAN ( <split range value clause> )

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

<split range value> :=
    constant

사용 범위 및 접근 권한

Cluster system에서 수행할 수 있다.

<alter table split shard statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

table_name

테이블 이름이다.
schema_name.table_name과 같이 테이블이 소속한 스키마를 정의할 수 있는데 schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.
해당 테이블이 cluster group specific이고 list shard 또는 range shard인 경우에만 구문을 수행할 수 있다.

source_shard_name

Split할 원본 shard 이름이다.
해당 테이블에 shard가 존재하지 않을 경우 구문을 수행할 수 없다.

<split shard placement>

원본 shard를 split하여 재배치할 대상 shard를 정의한다.

<split shard bound def>

Split 될 대상 shard의 bound를 정의한다.

다음 두 가지 bound def 중 하나로 정의할 수 있다.

<split list shard def>

List shard를 위한 split shard bound를 정의한다.

<split range shard def>

Range shard를 위한 split shard bound를 정의한다.

dest_group_name

Split 된 shard가 배치될 cluster group의 이름이다.

설명

특정 테이블의 특정 shard를 분산하여 임의의 cluster group에 배치한다.
특정 shard에 해당하는 레코드가 많거나 특정 group member에 부하가 편중될 때 shard를 분산하여 레코드와 부하를 분산하기 위해 사용된다.

사용 예

다음은 <alter table split shard statement> 구문을 수행하는 예이다.

gSQL> ALTER TABLE t1 SPLIT SHARD shard1 INTO ( SHARD shard11 VALUES IN ( 11 ) AT CLUSTER GROUP G2 );

Table altered.

gSQL> ALTER TABLE t1 SPLIT SHARD shard1 INTO ( SHARD shard11 VALUES LESS THAN ( 11 ) AT CLUSTER GROUP G2 );


Table altered.

호환성

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

참조

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

ALTER TABLE name RENAME SHARD

기능

Cluster 환경에서 테이블의 특정 shard의 이름을 변경한다.

구문

<alter table rename shard statement> ::=
    ALTER TABLE table_name 
        RENAME SHARD shard_name TO new_shard_name
    ;

사용 범위 및 접근 권한

Cluster system에서 수행할 수 있다.

<alter table rename shard statement> 구문을 수행하려면 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

table_name

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

shard_name

변경할 shard의 기존 이름이다.
Shard가 해당 테이블에 존재하지 않을 경우 구문을 수행할 수 없다.

new_shard_name

변경할 shard의 새 이름이다.
테이블 내에 동일한 shard 이름이 존재하지 않아야 한다.

설명

Hash, range, list 테이블의 특정 shard의 이름을 변경한다. Cloned 테이블에 대해서는 해당 구문을 수행할 수 없다.

사용 예

다음은 <alter table rename shard statement> 구문을 수행하는 예이다.

gSQL> ALTER TABLE t_range RENAME SHARD r_01 TO r_new_01;

Table altered.

gSQL> ALTER TABLE t_list RENAME SHARD l_01 TO l_new_01;

Table altered.

gSQL> ALTER TABLE t_hash RENAME SHARD shard_000000 TO h_new_00;

Table altered.

gSQL> COMMIT;

Commit complete.

호환성

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

참조

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

ALTER TABLE name READ { ONLY | WRITE }

기능

테이블에 READ { ONLY | WRITE }을 설정한다.

구문

<alter table read { only | write } statement> :==
     ALTER TABLE table_name
         READ { ONLY | WRITE }
     ;

사용 범위 및 접근 권한

<alter table read { only | write } statement> 구문을 수행하려면 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

table_name

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

설명

테이블 속성을 READ { ONLY | WRITE } 으로 지정한다.

READ ONLY로 지정하면 SELECT .. FOR UPDATE 구문, 테이블의 데이터가 변경되는 DML 또는 DDL 구문들을 사용할 수 없다. 반면, 테이블의 데이터가 변경이 되지 않는 DDL 구문은 허용한다.

READ ONLY로 지정할 때 허용하지 않는 SQL 구문


READ ONLY로 지정할 때 허용하는 SQL 구문

사용 예

다음은 <alter table read { only | write } statement> 구문을 수행하는 예이다.

gSQL> ALTER TABLE t1 READ ONLY;

Table altered.

gSQL> ALTER TABLE t1 READ WRITE;

Table altered.

호환성

SQL 표준에서는 <alter table read { only | write } statement> 구문을 정의하지 있지 않다.

참조

관련 내용은 ALTER TABLE을 참조한다.

ALTER TABLE name RENAME TO

기능

테이블의 이름을 변경한다.

구문

<rename table statement> ::=
    ALTER TABLE table_name 
        RENAME TO new_table_name
    ;

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

table_name

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

new_table_name

테이블의 새 이름이다.
스키마 내에 동일한 테이블 이름이 존재하지 않아야 한다.

설명

테이블 이름이 변경되더라도 이를 참조하는 index constraint 등의 객체는 변경할 필요없다.

사용 예

다음은 두 테이블 t1, t2의 이름을 서로 바꾸는 예이다.

gSQL> ALTER TABLE t1 RENAME TO t_temp;

Table altered.

gSQL> ALTER TABLE t2 RENAME TO t1;

Table altered.

gSQL> ALTER TABLE t_temp RENAME TO t2;

Table altered.

gSQL> COMMIT;

Commit complete.

호환성

SQL 표준에서는 <rename table statement> 구문을 정의하지 않고 있다.

참조

관련 내용은 ALTER TABLE을 참조한다.

ALTER TABLE name STORAGE

기능

테이블의 물리적 속성을 변경한다.

구문

<alter table physical attribute statement> ::=
    ALTER TABLE table_name 
      [ <physical attribute clause> ]
    | [ STORAGE ( <segment attr clause> [...] ) ]
    ;

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

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

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

사용 범위 및 접근 권한

<alter table physical attribute statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

table_name

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

<physical attribute clause>

테이블을 구성하는 page의 물리적 속성을 변경한다.
이미 할당된 page에는 적용되지 않으며 새로 할당받는 page에 적용된다.
자세한 설명은 CREATE TABLE 구문의 <table physical attribute clause> 절을 참조한다.

<segment attr clause>

세그먼트를 구성하는 extent의 물리적 속성을 변경한다. 
이미 할당된 extent에는 적용되지 않으며, 새로 할당받는 extent에 적용된다.

설명

각 구문별 사용 규칙을 참조한다.

사용 예

다음은 테이블의 물리적 속성을 변경하는 예이다.

gSQL> ALTER TABLE t1 PCTFREE 10 PCTUSED 40 STORAGE ( NEXT 10M  MAXSIZE  100M );

Table altered.

호환성

SQL 표준에서는 테이블의 물리적 속성에 대하여 정의하지 않고 있다.

참조

관련 내용은 ALTER TABLE을 참조한다.

ALTER TABLE name ADD SUPPLEMENTAL LOG

기능

테이블의 데이터가 변경될 때 테이블에 primary key가 있으면 redo log에 primary key 값을 추가하도록 설정한다.

구문

<add table supplemental log statement> ::=
    ALTER TABLE table_name 
        ADD SUPPLEMENTAL LOG DATA ( PRIMARY KEY ) COLUMNS
    ;

사용 범위 및 접근 권한

<add table supplemental log statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

table_name

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

테이블에 primary key가 존재하지 않더라도 구문을 수행할 수 있다.

설명

해당 TABLE에 UPDATE/ DELETE를 수행할 때 SUPPLEMENTAL LOG를 추가로 기록하도록 한다. 기록된 SUPPLEMENTAL LOG는 CDC와 같은 tool 또는 로그를 분석할 때 사용된다.

모든 TABLE의 SUPPLEMENTAL LOG를 기록하려면 SUPPLEMENTAL_LOG_DATA_PRIMARY_KEY = YES 로 설정한다.

사용 예

다음은 테이블의 data를 변경할 때 redo log에 primary key 값을 추가하도록 설정하는 예이다.

gSQL> ALTER TABLE t1 ADD SUPPLEMENTAL LOG DATA ( PRIMARY KEY ) COLUMNS;

Table altered.

호환성

SQL 표준에서는 <add table supplemental log statement>를 다루지 않는다.

참조

관련 내용은 ALTER TABLE name DROP SUPPLEMENTAL LOG를 참조한다.

ALTER TABLE name DROP SUPPLEMENTAL LOG

기능

테이블의 데이터가 변경될 때 redo log에 primary key 정보를 남기지 않도록 설정한다.

구문

<add table supplemental log statement> ::=
    ALTER TABLE table_name 
        DROP SUPPLEMENTAL LOG DATA ( PRIMARY KEY ) COLUMNS
    ;

사용 범위 및 접근 권한

<drop table supplemental log statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

table_name

변경할 테이블의 이름이다.
schema_name.table_name과 같이 테이블이 소속한 스키마를 정의할 수 있는데 schema_name을 생략할 경우 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.
ALTER TABLE name ADD SUPPLEMENTAL LOG 구문을 사용해 설정된 상태여야 한다.

설명

각 구문별 사용 규칙을 참조한다.

사용 예

다음은 테이블의 데이터가 변경되었을 때 redo log에 primary key 정보를 남기지 않도록 설정하는 예이다.

gSQL> ALTER TABLE t1 DROP SUPPLEMENTAL LOG DATA ( PRIMARY KEY ) COLUMNS;

Table altered.

호환성

SQL 표준에서는 <drop table supplemental log statement>를 다루지 않는다.

ALTER TABLESPACE

기능

테이블스페이스의 정의를 변경한다.

구문

<alter tablespace statement> ::=
      <rename tablespace statement>
    | <backup tablespace statement>
    | <on/offline tablespace statement>
    | <add file statement>
    | <drop file statement>
    | <rename datafile statement>
    ;

사용 범위 및 접근 권한

<alter tablespace statement> 구문을 수행하려면 사용자에게 database에 대한 ALTER TABLESPACE 권한이 있어야 한다.

구문 규칙 및 파라미터

<rename tablespace statement>

테이블스페이스의 이름을 변경한다.
자세한 내용은 ALTER TABLESPACE name RENAME TO 구문을 참조한다.

<backup tablespace statement>

테이블스페이스를 백업한다.
자세한 내용은 ALTER TABLESPACE name BACKUP 구문을 참조한다.

<on-offline tablespace statement>

테이블스페이스의 모든 파일을 online 또는 offline으로 변경한다.
자세한 내용은 ALTER TABLESPACE name [ONLINE|OFFLINE] 구문을 참조한다.

<add file statement>

테이블스페이스에 파일을 추가한다.
자세한 내용은 ALTER TABLESPACE name ADD [DATAFILE|MEMORY] 구문을 참조한다.

<drop file statement>

테이블스페이스의 파일을 제거한다.
자세한 내용은 ALTER TABLESPACE name DROP [DATAFILE|MEMORY] 구문을 참조한다.

<rename datafile statement>

데이터 테이블스페이스의 데이터 파일 이름을 변경한다.
자세한 내용은 ALTER TABLESPACE name RENAME DATAFILE 구문을 참조한다.

설명

ALTER TABLESPACE 구문은 다른 Data Definition Language (DDL)과 달리 ROLLBACK 할 수 없고 구문을 수행한 transaction이 자동으로 COMMIT 된다.

사용 예

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

호환성

SQL 표준에서는 테이블스페이스 개념을 정의하지 않고 있다.

참조

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

ALTER TABLESPACE name RENAME TO

기능

테이블스페이스의 이름을 변경한다.

구문

<rename tablespace statement> ::=
    ALTER TABLESPACE tablespace_name RENAME TO <new_tablespace_name>
    ;

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

tablespace_name

기존 테이블스페이스의 이름이다.

new_tablespace_name

새로운 테이블스페이스의 이름이다.

설명

Tablespace 이름이 변경되더라도 기존에 이미 해당 tablespace에 생성된 table, index 등은 변경할 필요없다.

사용 예

다음은 테이블스페이스의 이름을 변경하는 예이다.

gSQL> ALTER TABLESPACE space1 RENAME TO space2;

Tablespace altered.

호환성

SQL 표준에서는 테이블스페이스 개념을 정의하지 않고 있다.

참조

관련 내용은 ALTER TABLESPACE를 참조한다.

ALTER TABLESPACE name BACKUP

기능

테이블스페이스를 backup 하기 위해 backup이 가능한 상태와 불가능한 상태로 전환한다.

구문

<backup tablespace statement> ::=
      <tablespace begin backup statement>
    | <tablespace end backup statement>
    | <tablespace incremental backup statement>    
    ;

<tablespace begin backup statement> ::=
    ALTER TABLESPACE tablespace_name BEGIN BACKUP [AT <domain_name>]
    ;

<tablespace end backup statement> ::=
    ALTER TABLESPACE tablespace_name END BACKUP [AT <domain_name>]
    ;

<tablesapce incremental backup statement> ::=
    ALTER TABLESPACE tablespace_name 
        BACKUP INCREMENTAL <incremental backup option> [AT <domain_name>]    ;

<incremental backup option> ::=
      LEVEL integer [ CUMULATIVE | DIFFERENTIAL ]

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

<tablespace begin backup statement>

테이블스페이스를 백업 가능한 상태로 설정한다.

tablespace_name

Backup 상태를 전환할 테이블스페이스의 이름이다.

<tablespace end backup statement>

테이블스페이스를 백업이 불가능한 상태로 설정한다.

<tablesapce incremental backup statement>

테이블스페이스의 증분 백업을 수행한다.
데이터베이스가 OPEN 상태이고, ARCHIVELOG로 운영되어야 한다.

<incremental backup option>

<domain_name>

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

설명

테이블스페이스에 생성된 datafile을 백업한다. 테이블스페이스 전체를 백업하려면 BEGIN BACKUP을 수행한 후 OS의 파일 복사로 datafile들을 복사하고 나서 END BACKUP을 수행한다. 한편, 증분 백업 파일은 하나의 구문으로 BACKUP_DIR_1 property에 설정된 경로에 생성한다.

사용 예

다음은 DICTIONARY_TBS 테이블스페이스의 전체 백업 상태를 'ACTIVE'로 설정하는 예이다.

ALTER TABLESPACE DICTIONARY_TBS BEGIN BACKUP;

다음은 DICTIONARY_TBS 테이블스페이스의 전체 백업 상태를 'INACTIVE'로 설정하는 예이다.

ALTER TABLESPACE DICTIONARY_TBS END BACKUP;

다음은 DICTIONARY_TBS 테이블스페이스의 LEVEL 0 증분 백업을 만드는 예이다.

ALTER TABLESPACE DICTIONARY_TBS BACKUP INCREMENTAL LEVEL 0;

호환성

SQL 표준에서는 테이블스페이스 개념을 정의하지 않고 있다.

참조

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

ALTER TABLESPACE name [ONLINE|OFFLINE]

기능

테이블스페이스 상태를 변경한다.

구문

<on/off tablespace statement> ::=
    ALTER TABLESPACE tablespace_name { ONLINE | OFFLINE [ NORMAL | IMMEIDATE ] }
    [ AT <domain name> ]
    ;

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

ONLINE

OFFLINE 상태의 테이블스페이스를 ONLINE으로 변경한다.

OFFLINE NORMAL

ONLINE 상태의 테이블스페이스를 OFFLINE으로 변경한다.

OFFLINE으로 변경된 테이블스페이스는 일관된 (consistent) 상태이기 때문에 ONLINE 상태로 변경할 때 미디어 복구할 필요없다.

MOUNT 단계에서는 OFFLINE NORMAL을 사용할 수 없다.

(단, 이전 인스턴스가 \SHUTDOWN NORMAL에 의해서 종료된 경우에는 가능하다.)

OFFLINE IMMEDIATE

ONLINE 상태의 테이블스페이스를 OFFLINE으로 변경한다.

OFFLINE으로 변경된 테이블스페이스는 비일관적인 (inconsistent) 상태이기 때문에, ONLINE 상태로 변경할 때 미디어 복구해야 한다.

SYSTEM 테이블스페이스는 OFFLINE으로 변경할 수 없다.

OFFLINE IMMEDIATE는 미디어 복구를 필요로 하기 때문에 archive log mode에서만 수행할 수 있다.

<domain name>

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

설명

각 구문별 사용 규칙을 참조한다.

사용 예

다음은 테이블스페이스를 OFFLINE으로 설정하는 예이다.

gSQL> ALTER TABLESPACE space1 OFFLINE;

Tablespace altered.

다음은 MOUNT 단계에서 테이블스페이스에 OFFLINE NORMAL을 수행하여 실패하는 예이다.

gSQL> ALTER TABLESPACE space1 OFFLINE;

ERR-42000(16290): OFFLINE NORMAL is only allowed if the database is in OPEN phase : 
ALTER TABLESPACE space1 OFFLINE
                 *
ERROR at line 1:

gSQL> ALTER TABLESPACE space1 OFFLINE NORMAL;

ERR-42000(16290): OFFLINE NORMAL is only allowed if the database is in OPEN phase : 
ALTER TABLESPACE space1 OFFLINE NORMAL
                 *
ERROR at line 1:

호환성

SQL 표준에서는 테이블스페이스 개념을 정의하지 않고 있다.

참조

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

ALTER TABLESPACE name ADD [DATAFILE|MEMORY]

기능

테이블스페이스의 공간을 확장한다.

구문

<add space statement> ::=
    ALTER TABLESPACE tablespace_name ADD <space specification>
        [AT <domain name>]
    ;

<space specification> ::=
      MEMORY <memory clause> [, ...]
    | DATAFILE <add datafile clause> [, ...]

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

<memory clause> 
     'memory_name' { SIZE <size clause> }

<add datafile clause> ::=
     'filename' 
        { SIZE <size clause> | REUSE | SIZE <size clause> REUSE }

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

tablespace_name

변경할 테이블스페이스의 이름이다.

<file specification>

테이블스페이스의 유형에 따라 다음과 같은 구문을 사용해야 한다.

<add datafile clause>

추가할 메모리 데이터 파일을 정의한다.

<memory clause>

자세한 내용은 CREATE MEMORY TEMPORARY TABLESPACE 구문의 <memory clause>를 참조한다.

<domain name>

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

설명

각 구문별 사용 규칙을 참조한다.

사용 예

다음은 테이블스페이스에 data file을 추가하는 예이다.

gSQL> ALTER TABLESPACE space1 ADD DATAFILE 'test_file_a2.dbf' SIZE 10M REUSE;

Tablespace altered.

호환성

SQL 표준에서는 테이블스페이스 개념을 정의하지 않고 있다.

참조

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

ALTER TABLESPACE name DROP [DATAFILE|MEMORY]

기능

테이블스페이스의 공간을 축소한다.

구문

<drop space statement> ::=
    ALTER TABLESPACE tablespace_name DROP <file specification>
    [ AT <domain name> ]
    ;

<file specification> ::=
      DATAFILE 'filename' 
    | MEMORY 'memory_name'

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

tablespace_name

변경할 테이블스페이스의 이름이다.

<file specification>

테이블스페이스의 유형에 따라 다음과 같은 구문을 사용해야 한다.

오프라인 테이블스페이스의 파일은 삭제할 수 없다.

테이블스페이스의 첫 번째 파일은 삭제할 수 없다.

한 번이라도 사용된 적이 있는 데이터 파일은 삭제할 수 없다.

<domain name>

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

설명

각 구문별 사용 규칙을 참조한다.

사용 예

다음은 테이블스페이스의 파일을 제거하는 예이다.

gSQL> ALTER TABLESPACE space1 DROP DATAFILE 'test_file_f2.dbf';

Tablespace altered.

호환성

SQL 표준에서는 테이블스페이스 개념을 정의하지 않고 있다.

참조

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

ALTER TABLESPACE name RENAME DATAFILE

기능

테이블스페이스를 구성하는 데이터 파일의 이름을 변경한다.

구문

<rename datafile statement> ::=
    ALTER TABLESPACE tablespace_name RENAME DATAFILE <filename_list> TO <filename_list>
    ;

    <filename_list> ::= 
        'filename' [ AT <domain name> ] [, ...]

사용 범위 및 접근 권한

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

TDS 모드이면서 데이터베이스가 OPEN인 상태에서는 온라인 테이블스페이스 파일을 변경할 수 없다. (임시 메모리 테이블스페이스는 제외된다.)

변경한 후에도 파일은 반드시 존재해야 한다.

구문 규칙 및 파라미터

tablespace_name

변경할 테이블스페이스의 이름이다.

'filename'

메모리 임시 테이블스페이스는 'memory_name'을 의미하며, 그 외의 테이블스페이스 종류는 'filename'을 의미한다.

<domain name>

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

설명

테이블스페이스 상태에 따라 연산 가능 여부가 결정된다.

사용 예

다음은 'test.dbf'를 'test1.dbf'로 변경하는 예이다.

gSQL> ALTER TABLESPACE TEST_TBS RENAME DATAFILE 'test.dbf' TO 'test1.dbf';

Tablespace altered.

호환성

SQL 표준에서는 테이블스페이스 개념을 정의하지 않고 있다.

참조

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

ALTER USER

기능

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

구문

<alter user statement> ::=
      ALTER USER user_identifier <alter user action>
    | ALTER USER PUBLIC <alter schema path>
    ;

<alter user action> ::=
      <alter password>
    | <alter profile>
    | <password expire>
    | <account lock>
    | <alter default tablespace>
    | <alter temporary tablespace>
    | <alter index tablespace>
    | <alter schema path>

<alter password> ::=
    IDENTIFIED BY new_password [ REPLACE old_password ]

<alter profile> ::=
    PROFILE { profile_name | DEFAULT | NULL }

<password expire> ::=
    PASSWORD EXPIRE

<account lock> ::=
    ACCOUNT { LOCK | UNLOCK }

<alter default tablespace> ::=
    DEFAULT TABLESPACE tablespace_name

<alter temporary tablespace> ::=
    TEMPORARY TABLESPACE tablespace_name

<alter index tablespace> ::=
    INDEX TABLESPACE { tablespace_name | NULL }

<alter schema path> ::=
    SCHEMA PATH ( { schema_name | CURRENT PATH } [, ...] )

사용 범위 및 접근 권한

<alter user statement> 구문을 수행하려면 사용자에게 ALTER USER ON DATABASE 권한이 있어야 한다.
단, <alter password>는 사용자가 user_identifier와 동일할 경우에 권한 없이 수행할 수 있다.

구문 규칙 및 파라미터

user_identifier

변경할 사용자의 이름이다.

<alter password>

사용자의 password를 변경한다.

<alter profile>

비밀번호 관리 정책 profile을 변경한다.

<password expire>

사용자의 비밀번호를 만료시킨다.

<account lock>

<alter default tablespace>

사용자의 기본 tablespace를 변경한다.
tablespace_name은 data tablespace여야 한다.

<alter temporary tablespace>

사용자의 temporary tablespace를 변경한다.
tablespace_name은 temporary tablespace여야 한다.

<alter index tablespace>

사용자의 index tablespace를 변경한다.

<alter schema path>

사용자의 스키마 접근 경로를 변경한다.
사용자의 SQL 구문에 schema가 명시되지 않았을 경우 스키마 접근 경로는 객체의 naming resolution을 위한 스키마 순서에 따라 결정된다.

스키마 이름이 기존에 스키마 접근 경로에 나열된 스키마 이름과 동일할 경우에는 추가적으로 반영되지 않는다.

다음은 ALTER USER u1 SCHEMA PATH ( u1, s2, public ); 구문을 수행했을 때 schema에 존재하는 객체의 예이다.

스키마 이름

u1

s2

public

-

t1

-

t1

-

-

t2

-

-

-

-

t3

다음과 같이 u1 사용자가 수행하는 schema가 명시되지 않은 객체의 이름은 SCHEMA PATH에 의해 다음과 같이 해석된다.

CURRENT PATH

현재 사용자의 schema path이다.

다음 예와 같이 CURRENT PATH를 이용해 기존의 schema path를 유지하면서 새로운 schema path를 추가할 수 있다.

ALTER USER PUBLIC <alter schema path>

PUBLIC 계정의 schema path를 변경한다.
PUBLIC 계정의 schema path는 모든 사용자의 schema path에 포함된다.

PUBLIC 계정에 최초로 부여된 schema path는 다음과 같다.

설명

각 구문별 사용 규칙을 참조한다.

사용 예

다음은 사용자의 password를 변경하는 예이다.

gSQL> ALTER USER u1 IDENTIFIED BY new_password;

User altered.

다음의 사용자에게 profile을 할당하는 예이다.

gSQL> ALTER USER u1 PROFILE prof1;

User altered.

gSQL> COMMIT;

Commit complete.

다음은 사용자의 profile을 제거하는 예이다.

gSQL> ALTER USER u1 PROFILE NULL;

User altered.

gSQL> COMMIT;

Commit complete.

다음은 사용자의 비밀번호를 만료시키는 예이다.

gSQL> ALTER USER u1 PASSWORD EXPIRE;

User altered.

gSQL> COMMIT;

Commit complete.

다음은 사용자의 계정잠금을 해제하는 예이다.

gSQL> ALTER USER u1 ACCOUNT UNLOCK;

User altered.

gSQL> COMMIT;

Commit complete.

다음은 사용자의 DEFAULT TABLESPACE를 변경하는 예이다.

gSQL> ALTER USER u1 DEFAULT TABLESPACE mem_data_tbs;

User altered.

다음은 사용자의 TEMPORARY TABLESPACE를 변경하는 예이다.

gSQL> ALTER USER u1 TEMPORARY TABLESPACE mem_temp_tbs;

User altered.

다음은 사용자의 INDEX TABLESPACE를 변경하는 예이다.

gSQL> ALTER USER u1 INDEX TABLESPACE mem_temp_tbs;

User altered.

다음은 사용자의 schema path를 변경하는 예이다.

gSQL> ALTER USER u1 SCHEMA PATH ( s1, CURRENT PATH );

User altered.

호환성

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

참조

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

ALTER VIEW

기능

View 정의를 변경한다.

구문

<alter view statement> ::=
    ALTER VIEW view_name <alter view action>
    ;

<alter view action> ::=
    COMPILE

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

view_name

변경할 view의 이름이다.
schema_name.view_name과 같이 view가 소속한 스키마를 정의할 수 있는데 schema_name을 생략할 경우 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.

COMPILE

View를 다시 컴파일한다.
View column에 부여한 COMMENT는 초기화된다.

설명

View가 참조하는 테이블이나 view가 변경되거나 삭제되면 해당 view도 영향을 받는다.

이런 정보는 INFORMATION_SCHEMA.VIEWS를 통해 조회할 수 있다.

사용 예

다음은 view가 참조하는 table 변경에 영향을 받은 view를 COMPILE 하는 예이다.

gSQL> SELECT TABLE_NAME, IS_AFFECTED 
        FROM INFORMATION_SCHEMA.VIEWS 
       WHERE TABLE_SCHEMA = 'PUBLIC'
         AND TABLE_NAME = 'V1';

TABLE_NAME IS_AFFECTED
---------- -----------
V1         TRUE       

1 row selected.


gSQL> ALTER VIEW v1 COMPILE;

View altered.

COMMIT;

Commit complete.

gSQL> SELECT TABLE_NAME, IS_AFFECTED 
        FROM INFORMATION_SCHEMA.VIEWS 
       WHERE TABLE_SCHEMA = 'PUBLIC'
         AND TABLE_NAME = 'V1';

TABLE_NAME IS_AFFECTED
---------- -----------
V1         FALSE      

1 row selected.

호환성

SQL 표준에서는 <alter view statement> 구문을 정의하지 않고 있다.

참조

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

ANALYZE SYSTEM

기능

시스템의 통계 정보를 제어한다.

구문

<analyze system statement> ::=
    ANALYZE SYSTEM [ <analyze action> ]
    ;

<analyze action> ::=
      COMPUTE STATISTICS
    | DELETE STATISTICS

사용 범위 및 접근 권한

<analyze system statement> 구문을 수행하려면 사용자에게 ANALYZE ANY ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

<analyze action>

생략할 경우 기본값은 COMPUTE STATISTICS 이다.

COMPUTE STATISTICS

시스템과 관련된 다음과 같은 통계 정보를 구축한다.

DELETE STATISTICS

시스템 통계 정보를 삭제한다.

설명

구축한 시스템 통계 정보는 질의 처리를 위한 최적화 과정의 비용을 계산하기 위해 사용한다.

사용 예

다음은 <analyze system statement> 구문을 사용하여 시스템 통계 정보를 구축하는 예이다.

gSQL> ANALYZE SYSTEM COMPUTE STATISTICS;

analyzed.

다음은 구축된 시스템 통계 정보를 조회하는 예이다.

gSQL> 
SELECT * FROM DBA_STAT_SYSTEM;

 CPU_OPS NETWORK_IOPS NETWORK_BUFSIZE LAST_ANALYZED             
-------- ------------ --------------- --------------------------
53000412         2914           65536 2017-03-30 16:49:42.200000

1 row selected.

호환성

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

참조

관련 내용은 ANALYZE TABLE을 참조한다.

ANALYZE TABLE

기능

테이블의 통계 정보를 제어한다.

구문

<analyze table statement> ::=
    ANALYZE TABLE table_name
    [ <parallel clause> ]
    [ <analyze action> ]
    ;

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

<analyze action> ::=
      COMPUTE STATISTICS [ <for_clause> ]
    | ESTIMATE STATISTICS <sample_clause> [ <for_clause> ]
    | DELETE STATISTICS

<sample_clause>
      SAMPLE row_count ROWS
    | SAMPLE percentage PERCENT

<for_clause>
      FOR ALL COLUMNS
    | FOR ALL INDEXED COLUMNS
    | FOR COLUMNS column_name [, ...]
    | FOR ALL INDEXES
    | FOR INDEXES index_name [, ...]

사용 범위 및 접근 권한

<analyze table statement> 구문을 수행하려면 사용자에게 ANALYZE ANY ON DATABASE 권한이 있어야 한다.

구문 규칙 및 파라미터

table_name

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

<parallel clause>

분석 과정에서 사용할 thread 개수를 지정한다.
명시하지 않을 경우, 기본값은 PARALLEL 이다.

<analyze action>

생략할 경우 기본값은 COMPUTE STATISTICS 이다.

COMPUTE STATISTICS

전수 검사를 통해 테이블과 관련된 다음과 같은 통계 정보를 구축한다.

Column의 data type에 따라 구축하는 통계 정보는 다음과 같다.

Data type에 따라 구축된 통계 정보

Data type

NUM_DISTINCT

NUM_NULLS

AVG_LENGTH

MIN/MAX

BOOLEAN

O

O

O

X

NATIVE_SMALLINT

O

O

O

O

NATIVE_INTEGER

O

O

O

O

NATIVE_BIGINT

O

O

O

O

NATIVE_REAL

O

O

O

O

NATIVE_DOUBLE

O

O

O

O

NUMBER

O

O

O

O

NUMERIC

O

O

O

O

FLOAT

O

O

O

O

CHAR(n)

O

O

O

64 bytes 이하인

경우에 구축된다.

VARCHAR(n)

O

O

O

64 bytes 이하인

경우에 구축된다.

LONG VARCHAR

X

X

X

X

BINARY

O

O

O

X

VARBINARY

O

O

O

X

LONG VARBINARY

X

X

X

X

DATE

O

O

O

O

TIME

O

O

O

O

TIMESTAMP

O

O

O

O

INTERVAL

O

O

O

O

ROWID

O

O

O

X

ESTIMATE STATISTICS <sample_clause>

지정한 <sample_clause>만큼의 샘플을 사용하여 column과 index의 통계 정보를 구축한다.

샘플링 row의 개수가 MIN_SAMPLE_ROW_COUNT 프로퍼티 값보다 작을 경우 프로퍼티 값을 따른다.

<for_clause>

생략할 경우, 통계정보 구축이 가능한 모든 column과 모든 인덱스의 통계 정보를 구축한다.

FOR ALL COLUMNS

통계 정보 구축이 가능한 모든 column의 통계 정보를 구축한다. 
인덱스 통계 정보는 구축하지 않는다.

FOR ALL INDEXED COLUMNS

인덱스에 포함된 모든 column의 통계 정보를 구축한다. 
그 외 column의 통계 정보는 구축하지 않는다. 
인덱스 통계 정보는 구축하지 않는다.

FOR COLUMNS column_name [, ...]

나열한 column의 통계 정보를 구축한다. 
기술하지 않은 column의 통계 정보는 구축하지 않는다. 
인덱스 통계 정보는 구축하지 않는다.

FOR ALL INDEXES

모든 인덱스의 통계 정보를 구축한다. 
Column 통계 정보는 구축하지 않는다.

FOR INDEXES index_name [, ...]

나열한 인덱스의 통계 정보를 구축한다. 
기술하지 않은 인덱스의 통계 정보는 구축하지 않는다. 
Column 통계 정보는 구축하지 않는다.

DELETE STATISTICS

테이블의 통계 정보를 제거한다.

설명

테이블 통계 정보는 질의 최적화의 정확도에 영향을 미치는 매우 중요한 정보이다.

통계 정보 구축시간은 테이블의 데이터 양에 비례하므로, 데이터 양이 많을 경우 샘플링을 사용하여 통계 정보를 구축하거나 질의에 영향을 미치는 주요 정보에 대해서만 통계 정보를 구축하는 것이 바람직하다.

ANALYZE TABLE lineitem ESTIMATE STATISTICS SAMPLE 10 PERCENT;
ANALYZE TABLE lineitem COMPUTE STATISTICS FOR ALL INDEXED COLUMNS;
ANALYZE TABLE lineitem COMPUTE STATISTICS FOR ALL INDEXES;

사용 예

다음은 전수 검사를 통해 통계 정보를 구축하는 예이다.

gSQL> ANALYZE TABLE orders;

Table analyzed.

다음은 구축된 테이블 통계 정보를 조회하는 예이다.

gSQL>
SELECT 
       TABLE_NAME
     , NUM_ROWS
  FROM
       DICTIONARY_SCHEMA.USER_TABLES
 WHERE
       TABLE_SCHEMA = 'PUBLIC'
   AND TABLE_NAME   = 'ORDERS'
;

TABLE_NAME NUM_ROWS
---------- --------
ORDERS      1500000

1 row selected.


gSQL>
SELECT 
       TABLE_NAME
     , COLUMN_NAME
     , NUM_DISTINCT
     , NUM_NULLS
     , LOW_VALUE
     , HIGH_VALUE
  FROM
       DICTIONARY_SCHEMA.USER_TAB_COLUMNS
 WHERE
       TABLE_SCHEMA = 'PUBLIC'
   AND TABLE_NAME   = 'ORDERS'
;

TABLE_NAME COLUMN_NAME     NUM_DISTINCT NUM_NULLS LOW_VALUE           HIGH_VALUE         
---------- --------------- ------------ --------- ------------------- -------------------
ORDERS     O_ORDERKEY           1500000         0 1                   6000000            
ORDERS     O_CUSTKEY              99996         0 1                   149999             
ORDERS     O_ORDERSTATUS              3         0 F                   P                  
ORDERS     O_TOTALPRICE         1464556         0 857.71              555285.16          
ORDERS     O_ORDERDATE             2406         0 1992-01-01 00:00:00 1998-08-02 00:00:00
ORDERS     O_ORDERPRIORITY            5         0 1-URGENT            5-LOW              
ORDERS     O_CLERK                 1000         0 Clerk#000000001     Clerk#000001000    
ORDERS     O_SHIPPRIORITY             1         0 0                   0                  
ORDERS     O_COMMENT            1482071         0 null                null               

9 rows selected.

gSQL>
SELECT 
       TABLE_NAME
     , INDEX_NAME
     , DISTINCT_KEYS
  FROM
       DICTIONARY_SCHEMA.USER_INDEXES
 WHERE
       TABLE_SCHEMA = 'PUBLIC'
   AND TABLE_NAME   = 'ORDERS'
;

TABLE_NAME INDEX_NAME        DISTINCT_KEYS
---------- ----------------- -------------
ORDERS     ORDERS_PK_INDEX         1500000
ORDERS     ORDERS_CUSTKEY_FK         99996

2 rows selected.

호환성

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

참조

관련 내용은 ANALYZE SYSTEM을 참조한다.

AUDIT POLICY

기능

Audit policy를 활성화한다.

구문

<audit policy statement> ::= 
    AUDIT POLICY policy_name
    [ <specified_user_option> ]
    [ <specified_success_option> ]
    ;

<specified_user_option> ::=
      BY user_name [, ...]
    | EXCEPT user_name [, ...]

<specified_success_option> ::=
      WHENEVER SUCCESSFUL
    | WHENEVER NOT SUCCESSFUL

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

policy_name

활성화할 audit policy 객체의 이름이다.
활성화 된 audit policy는 기존 session에 영향을 미치지 않으며 새로 생성되는 session에만 영향을 준다.

<specified_user_option>

감사를 수행할 사용자를 명시한다.   
생략할 경우 모든 사용자에 대해 감사를 수행한다.

동일한 audit policy에 대해 BY 절과 EXCEPT 절을 함께 사용할 수 없다.

<specified_success_option>

설명

Audit policy를 활성화하면 기존 session에는 영향을 미치지 않으며 새로 생성되는 session에 대해 감사를 시작한다.

Audit Record 조회

감사 조건에 부합할 경우 audit record를 생성하는데 다음과 같이 DICTIONARY_SCHEMA.AUDIT_TRAIL view를 통해 조회할 수 있다.
SELECT logon_user
     , event_timestamp
     , action_name
     , object_name 
     , sql_text
  FROM audit_trail
 WHERE policy_name = 'P1'
;

일반 사용자가 AUDIT_TRAIL을 조회하려면 SELECT 권한을 부여받아야 한다.

GRANT SELECT ON DICTIONARY_SCHEMA.AUDTI_TRAIL TO user_name;

Audit Policy 정보 조회

Audit policy 객체 정보는 DICTIONARY_SCHEMA.AUDIT_POLICY_OPTIONS view를 통해 조회할 수 있다.

SELECT policy_name
     , audit_option
     , object_schema
     , object_name
  FROM audit_policy_options
;

Audit policy 객체들의 활성화 정보는 DICTIONARY_SCHEMA.AUDIT_POLICY_ENABLED view를 통해 조회할 수 있다.

SELECT policy_name
     , enabled_opt
     , user_name
     , when_success
     , when_failure
  FROM audit_policy_enabled
;

BY 절과 EXCEPT 절 사용 시 유의사항

동일한 audit policy에 대해 다수의 AUDIT POLICY BY 절을 사용할 경우, user들의 집합을 활성화한다.
즉, 다음 두 예는 동일한 의미이다.
AUDIT POLICY p1 BY u1;
AUDIT POLICY p1 BY u2;
AUDIT POLICY p1 BY u1, u2;
동일한 audit policy에 대해 다수의 AUDIT POLICY EXCEPT 절을 사용할 경우, 마지막 AUDIT POLICY 구문만 유효하다.
즉, 다음 두 예는 다른 의미이다.
AUDIT POLICY p1 EXCEPT u1;
AUDIT POLICY p1 EXCEPT u2;
AUDIT POLICY p1 EXCEPT u1, u2;

같은 audit policy에 대해 BY와 EXCEPT를 함께 사용할 수 없다.

AUDIT POLICY p1 BY u1;
AUDIT POLICY p1 EXCEPT u2;
AUDIT POLICY p1 EXCEPT u1;
AUDIT POLICY p1;
BY로 활성화된 audit policy를 EXCEPT로 전환하거나 EXCEPT로 활성화된 audit policy를 BY로 전환하려면 먼저 활성화된 audit policy를 비활성화 한 후에 전환해야 한다.

다음 예와 같이 NOAUDIT POLICY 구문으로 비활성화한다.

BY 절과 함께 사용하는 WHENEVER 절은 누적된다.

다음 두 예는 동일한 의미이다.

AUDIT POLICY p1 BY u1 WHENEVER SUCCESSFUL;
AUDIT POLICY p1 BY u1 WHENEVER NOT SUCCESSFUL;
AUDIT POLICY p1 BY u1;

WHENEVER 절이 EXCEPT 절과 함께 사용되면 마지막 WHENEVER 절만 유효하다.

다음 두 예는 서로 다른 의미이다.

AUDIT POLICY p1 EXCEPT u1 WHENEVER SUCCESSFUL;
AUDIT POLICY p1 EXCEPT u1 WHENEVER NOT SUCCESSFUL;
AUDIT POLICY p1 EXCEPT u1;

사용 예

다음은 모든 사용자에 대해 audit policy를 활성화하는 예이다.

AUDIT POLICY table_pol;

다음 질의를 통해 활성화 정보를 확인할 수 있다.

SELECT policy_name
     , enabled_opt
     , user_name
  FROM audit_policy_enabled
 WHERE policy_name = 'TABLE_POL';

POLICY_NAME  ENABLED_OPT  USER_NAME
-----------  -----------  ---------
TABLE_POL    BY           ALL USERS

다음은 특정 사용자들을 한정하여 audit policy를 활성화하는 예이다.

AUDIT POLICY dml_pol BY u1, u2;

다음은 특정 사용자를 배제하여 audit policy를 활성화하는 예이다.

AUDIT POLICY read_seq_pol EXCEPT sys;

다음은 특정 사용자가 SQL 구문에 실패한 경우를 감사하는 예이다.

AUDIT POLICY delete_pol BY u1 WHENEVER NOT SUCCESSFUL;

호환성

SQL 표준에는 audit policy가 없다.

참조

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

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>

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

사용 범위 및 접근 권한

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 단계는 OPEN 단계여야 한다.

<connection attribute>

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

설명

<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 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> [...] )
    | <logging 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 ]

<logging clause> ::=
      LOGGING
    | NOLOGGING

<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이다.)

LOGGING | NOLOGGING

인덱스의 리두 로깅 여부를 명시한다.
명시하지 않을 경우, 기본값은 NOLOGGING이다.

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 ) LOGGING;

Index created.

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

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

Index created.

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

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

Index created.

호환성

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

참조

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

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> [...] )
    | <logging 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 ]

<logging clause> ::=
      LOGGING
    | NOLOGGING


<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가 standalone 인지 아니면 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의 데이터 타입과 호환 가능해야 한다.

타입이 호환되지 않거나 공간이 부족한 경우 INSERT, UPDATE 구문에서 DEFAULT를 사용할 때 다음과 같은 에러가 발생한다.

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>

테이블 제약 정의는 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을 사용한다.

LOGGING | NOLOGGING

인덱스의 리두 로깅 수행 여부를 명시한다.
명시하지 않을 경우, 기본값은 NOLOGGING이다.

TABLESPACE index_tablespace_name

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

<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 option으로 생성한다.

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

Table created.

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

gSQL> CREATE TABLE T1 ( I1 INTEGER, I1 CHAR(32) ) 
      WITH GLOBAL SECONDARY INDEX
      NOLOGGING 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 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 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 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 (with LOGGING option) 등의 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 (with NOLOGGING option) 등의 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 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는 영문자로 시작해야 하고 영문자, 숫자, 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

X

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을 제거할 수 있다.

사용 예

다음은 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> ]
    ;

<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 이다.

설명

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 이다.

설명

DROP TABLESPACE 구문은 다른 Data Definition Language (DDL)과 달리 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가 소유한 모든 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 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

참조

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

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

참조

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

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

참조

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

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

<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

<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

구문 규칙 및 파라미터

<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을 수행할 수 있는 권한

<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을 수행할 수 있는 권한

<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을 실행할 수 있는 권한

설명

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

참조

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

INSERT INTO

기능

테이블에 새로운 row들을 생성한다.

구문

<insert statement> ::=
    INSERT INTO table_name [ ( column_name [, ...] ) ]
        <insert source>
    ;

<insert source> ::=
      <values clause>
    | <from subquery>
    | <from default>

<values clause> ::=
    VALUES { ( { <value expression> | DEFAULT } [, ...] ) } [, ...]

<from subquery> ::=
    <query expression>

<from default> ::=
    DEFAULT VALUES

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

table_name

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

[ ( column_name [, ...] ) ]

테이블의 column 이름이다.
Column 리스트는 생략할 수 있다.
Column의 개수와 <insert source> 값의 개수는 동일해야 하며, 생략된 column에는 DEFAULT 값을 할당한다.

<values clause>

대응하는 column에 할당할 값의 리스트이다.

다음과 같이 다수의 row를 생성할 수 있다.

INSERT INTO table_name VALUES ( 1, 'A' ), ( 2, 'B' ), ( 3, 'C' )

<from subquery>

Row들을 생성할 질의이다.
자세한 내용은 SELECT 구문의 query expression 절을 참조한다.

DEFAULT VALUES

모든 column들을 기본값으로 채운다.

DEFAULT VALUES 절은 다음과 같은 의미이다.

VALUES ( DEFAULT, DEFAULT, ..., DEFAULT )

설명

INSERT 관련 구문들의 차이점

사용 예

다음은 INSERT 구문을 이용해 row 하나를 생성하는 예이다.

gSQL> INSERT INTO region VALUES ( 0, 'AFRICA' );

1 row created.

다음은 INSERT 구문에서 column의 DEFAULT 값 또는 identity 값을 사용하는 예이다.

gSQL> CREATE TABLE region
(
    r_regionkey   BIGINT    GENERATED BY DEFAULT AS IDENTITY
  , r_name        CHAR(25)  DEFAULT 'N/A'
);

Table created.

gSQL> COMMIT;

Commit complete.
gSQL> INSERT INTO region DEFAULT VALUES;

1 row created.
gSQL> INSERT INTO region VALUES (DEFAULT, DEFAULT);

1 row created.
gSQL> INSERT INTO region(r_regionkey) VALUES (-100);

1 row created.
gSQL> INSERT INTO region(r_name) VALUES ('ASIA');

1 row created.


gSQL> SELECT * FROM region;

R_REGIONKEY R_NAME                   
----------- -------------------------
          1 N/A                      
          2 N/A                      
       -100 N/A                      
          3 ASIA                     

4 rows selected.

다음은 VALUES 구문에 다수의 row를 기술하여 생성하는 예이다.

gSQL> INSERT INTO region
       VALUES ( 1, 'AFRICA' ),
              ( 2, 'ASIA'   ),
              ( 3, 'EUROPE' );

3 rows created.

다음은 subquery를 사용하여 다수의 row를 생성하는 예이다.

gSQL> INSERT INTO region SELECT r_regionkey, r_name FROM tmp_region WHERE r_regionkey < 3;

3 rows created.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

F781

Self-referencing operations

X

F222

INSERT statement: DEFAULT VALUES clause

O

S204

Enhanced structured types

X

S043

Enhanced reference types

X

T111

Updatable joins, unions, and columns

X

참조

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

INSERT INTO name RETURNING

기능

테이블에 새로운 row를 생성하고, 생성한 row들을 검색한다.

구문

<insert statement> ::=
    INSERT INTO table_name [ ( column_name [, ...] ) ]
        <insert source>
        <returning clause>
    ;

<insert source> ::=
      <values clause>
    | <from subquery>
    | <from default>

<values clause> ::=
    VALUES { ( { <value expression> | DEFAULT } [, ...] ) } [, ...]

<from subquery> ::=
    <query expression>

<from default> ::=
    DEFAULT VALUES

<returning clause> ::=
      [ RETURN | RETURNING ] { * | { <value expression> [ [AS] alias_name ] } [, ...]

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

table_name

Row를 생성할 대상 테이블의 이름이다.

[ ( column_name [, ...] ) ]

테이블의 column 이름이다.
자세한 내용은 INSERT INTO 구문을 참조한다.

<values clause>

대응하는 column에 할당할 값의 리스트이다.
자세한 내용은 INSERT INTO 구문을 참조한다.

<from subquery>

Row들을 생성할 질의이다.
자세한 내용은 INSERT INTO 구문을 참조한다.

DEFAULT VALUES

모든 column들을 기본값으로 채운다. 
자세한 내용은 INSERT INTO 구문을 참조한다.

<returning clause>

INSERT 된 row들을 반환한다.

RETURN과 RETURNING은 동일한 의미의 키워드이다.

설명

자세한 내용은 INSERT 관련 구문들의 차이점을 참조한다.

사용 예

다음은 INSERT 구문으로 생성된 column 값을 검색하는 예이다.

gSQL> CREATE TABLE region
(
    r_regionkey   BIGINT    GENERATED BY DEFAULT AS IDENTITY
  , r_name        CHAR(25)  DEFAULT 'N/A'
);

Table created.

gSQL> COMMIT;

Commit complete.
gSQL> INSERT INTO region VALUES ( DEFAULT, DEFAULT ) RETURNING r_regionkey, r_name;

R_REGIONKEY R_NAME                   
----------- -------------------------
          1 N/A                      

1 row created.
gSQL> INSERT INTO region(r_name) VALUES ('ASIA') RETURNING r_regionkey;

R_REGIONKEY
-----------
          2

1 row created.

다음은 subquery로부터 생성된 row들을 검색하는 예이다.

gSQL> INSERT INTO region 
      SELECT r_regionkey, r_name FROM tmp_region WHERE r_regionkey < 3 
      RETURNING r_regionkey, r_name;

R_REGIONKEY R_NAME                   
----------- -------------------------
          0 AFRICA                   
          1 AMERICA                  
          2 ASIA                     

3 rows created.

호환성

SQL 표준에서는 <insert returning query statement> 구문을 정의하지 않고 있다.

참조

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

INSERT INTO name RETURNING .. INTO

기능

테이블에 row 하나를 생성하고, 생성한 row의 값을 호스트 변수에 얻어온다.

구문

<insert statement> ::=
    INSERT INTO table_name [ ( column_name [, ...] ) ]
        <insert source>
        <returning into clause>
    ;

<insert source> ::=
      <values clause>
    | <from subquery>
    | <from default>

<values clause> ::=
    VALUES { ( { <value expression> | DEFAULT } [, ...] ) } [, ...]

<from subquery> ::=
    <query expression>

<from default> ::=
    DEFAULT VALUES

<returning into clause> ::=
      [ RETURN | RETURNING ] { * | { <value expression> [ [AS] alias_name ] } [, ...] INTO variable_name [, ...]

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

table_name

Row를 생성할 대상 테이블의 이름이다.

[ ( column_name [, ...] ) ]

테이블의 column 이름이다.
자세한 내용은 INSERT INTO 구문을 참조한다.

<values clause>

대응하는 column에 할당할 값의 리스트이다.
자세한 내용은 INSERT INTO 구문을 참조한다.

<from subquery>

Row들을 생성할 질의이다.
자세한 내용은 INSERT INTO 구문을 참조한다.

DEFAULT VALUES

모든 column들을 기본값으로 채운다.
자세한 내용은 INSERT INTO 구문을 참조한다.

<returning clause>

INSERT 된 row를 반환한다.
INSERT INTO name RETURNING 구문의 <returning clause> 절을 참조한다.

INTO variable_name [, ...]

INTO 절에 기술된 변수의 개수는 RETURNING 절에 기술된 expression의 개수와 동일해야 한다.
생성할 row가 한 건 이하여야 한다. Row가 두 건 이상 생성될 경우, 에러가 발생한다.

설명

자세한 내용은 INSERT 관련 구문들의 차이점을 참조한다.

사용 예

다음은 생성된 row의 값을 호스트 변수에 얻어오는 예이다.

gSQL> CREATE TABLE region
(
    r_regionkey   BIGINT    GENERATED BY DEFAULT AS IDENTITY
  , r_name        CHAR(25)  DEFAULT 'N/A'
);

Table created.

gSQL> COMMIT;

Commit complete.
\VAR v_key  BIGINT
\VAR v_name VARCHAR(128)
gSQL> INSERT INTO region 
      VALUES ( DEFAULT, DEFAULT ) 
      RETURNING r_regionkey, r_name 
      INTO :v_key, :v_name;

V_KEY V_NAME                   
----- -------------------------
    1 N/A                      

1 row created.
gSQL> INSERT INTO region(r_name) 
      VALUES ('ASIA') 
      RETURNING r_regionkey 
      INTO :v_key;

V_KEY
-----
    2

1 row created.

호환성

SQL 표준은 <insert returning into statement> 구문을 정의하지 않고 있다.

참조

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

LOCK TABLE

기능

하나 이상의 테이블에 lock을 설정한다.

구문

<lock table statement> ::=
    LOCK TABLE lock target [, ...] 
    IN <lock mode> MODE [<wait clause>]
    ;

<lock mode> ::=
    SHARE
    | EXCLUSIVE
    | ROW SHARE
    | ROW EXCLUSIVE
    | SHARE ROW EXCLUSIVE


<wait clause> ::=
    NOWAIT
    | WAIT time

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

<lock target>

LOCK 대상 테이블을 명시한다.

<lock mode>

LOCK mode를 명시한다.

<wait clause>

Lock을 획득하기 위한 대기 시간을 명시한다.

설명

Transaction을 COMMIT 하거나 ROLLBACK 할 경우 획득한 모든 lock은 자동으로 해제된다. ROLLBACK TO SAVEPOINT 구문을 사용할 경우 해당 savepoint 이후에 획득한 모든 lock이 해제된다.

사용 예

다음은 다른 transaction이 TABLE t1에 대해 어떠한 변경 연산도 수행할 수 없도록 하는 예이다.

gSQL> LOCK TABLE t1 IN EXCLUSIVE MODE;

Table locked.

다음은 다수의 table에 LOCK 구문을 수행하는 예이다.

gSQL> LOCK TABLE t1, t2 IN EXCLUSIVE MODE;

Table locked.

다음은 TABLE t1에 SHARE ROW EXCLUSIVE lock을 획득하는 예이다.

gSQL> LOCK TABLE t1 IN SHARE ROW EXCLUSIVE MODE;

Table locked.

다음은 해당 TABLE에 즉시 lock을 획득할 수 있을 경우에만 수행할 수 있는 구문이다. Lock을 획득할 수 없을 경우에는 에러가 발생한다.

gSQL> LOCK TABLE t1 IN EXCLUSIVE MODE NOWAIT;

Table locked.

다음은 lock을 획득하기 위해 10 초 동안 대기하도록 하는 예이다.

gSQL> LOCK TABLE t1 IN EXCLUSIVE MODE WAIT 10;

Table locked.

호환성

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

참조

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

NOAUDIT POLICY

기능

Audit policy를 비활성화한다.

구문

<noaudit policy statement> ::= 
    NOAUDIT POLICY policy_name
    [ <specified_user_option> ]
    ;

<specified_user_option> ::=
      BY user_name [, ...]

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

policy_name

비활성화할 audit policy 객체의 이름이다.
비활성화 된 audit policy는 기존 session에 영향을 미치지 않으며 새로 생성되는 session에만 영향을 준다.

<specified_user_option>

감사 대상에서 제외할 사용자를 명시한다.

AUDIT POLICY 구문과 달리 NOAUDIT POLICY 구문에는 EXCEPT 옵션이 없다.

AUDIT POLICY name BY 절을 사용한 경우 NOAUDIT POLICY name BY 구문으로 비활성화해야 하고 
AUDIT POLICY name EXCEPT 절을 사용한 경우 BY 절 없이 NOAUDIT POLICY name 구문으로 비활성화해야 한다.

AUDIT POLICY 구문의 사용 방법에 따라 다음과 같이 NOAUDIT POLICY 구문을 사용하여 해당 옵션을 비활성화해야 한다.

Audit policy 활성화/ 비활성화

유형

AUDIT POLICY 구문

NOAUDIT POLICY 구문

전체 사용자

AUDIT POLICY p1

NOAUDIT POLICY p1

BY를 사용

AUDIT POLICY p1 BY u1

NOAUDIT POLICY p1 BY u1

EXCEPT를 사용

AUDIT POLICY p1 EXCEPT u1

NOAUDIT POLICY p1

활성화된 모든 user들을 비활성화한 경우, audit policy 객체가 완전히 비활성화된다.

설명

Audit policy 객체의 활성화 정보는 다음과 같이 조회한다.

SELECT policy_name
     , enabled_opt
     , user_name
  FROM audit_policy_enabled
 WHERE policy_name = 'P1';
NOAUDIT POLICY 구문은 AUDIT POLICY 지정 방식에 따라 생성된 개별 활성화 정보를 삭제한다. 
위의 질의를 통해 활성화한 정보가 없을 경우, audit policy는 완전히 비활성화된다.

다음과 같이 모든 user를 활성화한 경우, NOAUDIT POLICY BY 절은 영향을 미치지 않는다.

AUDIT POLICY p1;
NOAUDIT POLICY p1 BY u1;
NOAUDIT POLICY p1;

하나 이상의 user들을 개별적으로 활성화한 경우 AUDIT POLICY 설정 방법에 따라 NOAUDIT POLICY 구문을 사용해야 한다.

BY를 이용해 활성화한 경우

다음과 같이 audit policy를 활성화한 경우,

AUDIT POLICY p1 WHENEVER NOT SUCCESSFUL;
AUDIT POLICY p1 BY u1;
AUDIT POLICY p1 BY u2;

활성화 정보를 조회하면 다음과 같다.

SELECT policy_name
     , enabled_opt
     , user_name
     , when_success
     , when_failure
  FROM audit_policy_enabled
 WHERE policy_name = 'P1';

POLICY_NAME  ENABLED_OPT  USER_NAME    WHEN_SUCCESS  WHEN_FAILURE
-----------  -----------  ---------    ------------  ------------
P1           BY           ALL USERS    NO            YES
P1           BY           U1           YES           YES
P1           BY           U2           YES           YES

다음은 NOAUDIT 구문을 수행하고 활성화 정보를 조회하는 예이다.

NOAUDIT POLICY p1;

SELECT policy_name
     , enabled_opt
     , user_name
     , when_success
     , when_failure
  FROM audit_policy_enabled
 WHERE policy_name = 'P1';

POLICY_NAME  ENABLED_OPT  USER_NAME    WHEN_SUCCESS    WHEN_FAILURE
-----------  -----------  ---------    ------------    ------------
P1           BY           U1           YES             YES
P1           BY           U2           YES             YES
ALL USERS의 failure에 대한 감사가 비활성화되었으며, u1, u2 사용자에 대한 감사는 여전히 활성화되어 있다.

다음과 같이 BY 옵션을 통해 NOAUDIT POLICY 구문을 추가적으로 사용하면 audit policy p1은 완전히 비활성화된다.

NOAUDIT POLICY p1 BY u1, u2;

SELECT policy_name
     , enabled_opt
     , user_name
     , when_success
     , when_failure
  FROM audit_policy_enabled
 WHERE policy_name = 'P1';

no rows selected.

EXCEPT를 이용해 활성화한 경우

다음과 같이 audit policy를 활성화한 경우,

AUDIT POLICY p1 EXCEPT u1, sys;

활성화 정보를 조회하면 다음과 같다.

SELECT policy_name
     , enabled_opt
     , user_name
     , when_success
     , when_failure
  FROM audit_policy_enabled
 WHERE policy_name = 'P1';

POLICY_NAME  ENABLED_OPT  USER_NAME    WHEN_SUCCESS    WHEN_FAILURE
-----------  -----------  ---------    ------------    ------------
P1           EXCEPT       U1           YES             YES
P1           EXCEPT       SYS          YES             YES
AUDIT POLICY 구문과 달리 NOAUDIT POLICY 구문에는 EXCEPT option이 없으므로 다음과 같이 옵션 없이 구문을 수행한다.
NOAUDIT POLICY p1;

SELECT policy_name
     , enabled_opt
     , user_name
     , when_success
     , when_failure
  FROM audit_policy_enabled
 WHERE policy_name = 'P1';

no rows selected.
즉, EXCEPT 옵션을 이용해 audit policy를 활성화한 경우, NOAUDIT POLICY 구문으로 개별 사용자를 다시 비활성화할 수 없다.

사용 예

다음은 전체 사용자를 비활성화한 예이다.

NOAUDIT POLICY table_pol;

다음은 BY를 사용하여 활성화된 특정 사용자를 비활성화하는 예이다.

NOAUDIT POLICY table_pol BY u1;

호환성

SQL 표준에는 audit policy가 없다.

참조

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

OPEN cursor_name

기능

커서를 연다.

구문

<open statement> ::=
    OPEN cursor_name [ <parameter using clause> ]
    ;

<parameter using clause> ::=
      <using parameter arguments>

<using parameter arguments> ::=
    USING variable_name [, ...]

사용 범위 및 접근 권한

cursor_name이 PREPARE statement_name 구문과 DECLARE cursor_name 구문을 사용해 선언한 동적 커서인 경우 embedded SQL에서 사용 가능하다.

cursor_name을 선언한 DECLARE cursor_name 구문에 포함된 <cursor query>의 권한과 동일하다.

구문 규칙 및 파라미터

cursor_name

세션 내에서 DECLARE cursor_name 구문으로 선언된 커서여야 한다.

<parameter using clause>

Embedded SQL에서 사용할 수 있다.

<parameter using clause> 구문이 사용될 경우, cursor_name이 PREPARE statement_name 구문과 DECLARE cursor_name 구문을 이용해 선언한 동적 커서여야 한다.

<using parameter arguments>

<using parameter arguments> 구문이 사용될 경우, variable_name의 개수는 PREPARE statement_name 구문이 참조하는 query 문장에 포함된 parameter의 개수와 동일해야 한다.

variable_name은 나열된 순서에 따라 dynamic parameter에 순서대로 대응된다.

{
    ...
    EXEC SQL PREPARE stmt1 FROM 'SELECT c1, c2 FROM t1 WHERE c1 IN ( ?, ?, ? )';
    EXEC SQL DECLARE cur1 CURSOR FOR stmt1;
    EXEC SQL OPEN cur1 USING :sValue1, :sValue2, :sValue3;
    ...
    EXEC SQL WHENEVER NOT FOUND DO break;
    for(;;)
    {
        EXEC SQL FETCH cur1 INTO :sC1, :sC2;    
    }
    EXEC SQL WHENEVER NOT FOUND CONTINUE;
    ...
    EXEC SQL CLOSE cur1;    
    ... 
}

설명

Cursor는 session 내에서 구별되는 객체이며, 현재 session 내에서 사용되고 있는 cursor는 다른 session에서 사용되고 있는 cursor와 무관하다.

OPEN cursor_name 구문을 사용하려면 DECLARE cursor_name 구문으로 선언된 커서여야 하며, 커서는 닫혀 있는 상태여야 한다.

사용 예

다음은 interactive SQL (gsql)에서 cursor를 선언하고 OPEN 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.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

B031

Basic Dynamic SQL

O

참조

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

PREPARE statement_name

기능

반복 수행을 위한 dynamic SQL 문장을 준비한다.

구문

<prepare statement> ::=
    PREPARE statement_name FROM <SQL statement variable>
    ;

<SQL statement variable> ::=
      variable_name
    | 'sql statement'
    | "sql statement"
    | sql statement

사용 범위 및 접근 권한

Embedded SQL에서 사용할 수 있다.
Dynamic SQL 구문의 종류에 부합하는 수행 권한이 있어야 한다.

구문 규칙 및 파라미터

statement_name

준비할 statement의 이름이다.
statement 이름의 길이는 128 바이트보다 작아야 한다.
이후에 수행될 EXECUTE statement_name 구문 또는 DECLARE cursor_name 구문은 statement_name을 참조한다.
동일한 statement_name이 존재할 경우, 이전에 준비된 dynamic SQL은 삭제된다.
{
    ...

    EXEC SQL PREPARE stmt1 FROM 'DELETE FROM t1';
    ...
    EXEC SQL PREPARE stmt1 FROM 'UPDATE t1 SET c1 = c1 + 10';
    ...
}

<SQL statement variable>

<SQL statement variable>은 다음과 같이 네 가지 유형으로 사용된다.

Single-quoted string 내에 문자열 data를 표현하려면 다음과 같이 single quote (')를 두 번 기술한다.

{
    ...
    PREPARE stmt_name FROM 'INSERT INTO t1 VALUES ( ''literal data'' )'; 
    ...
}
<SQL statement variable>이 참조하는 dynamic SQL 문장은 host 변수 (:var)나 parameter marker (?)를 사용할 수 있다.
단, quote 없는 SQL 문장을 사용할 경우 parameter marker (?)를 사용할 수 없다.
참조되는 dynamic SQL 문장의 특성에 따라 변수는 input 또는 output dynamic parameter가 된다.
Dynamic SQL 문장 내에 기술된 dynamic parameter는 변수의 이름이 아무 의미가 없으며 종류에 관계없이 구문에 기술된 순서에 따라 식별된다.
{
    ...
    int sValue1;
    int sValue2;
    ...
    EXEC SQL PREPARE stmt1 FROM 'DELETE FROM t1 WHERE c1 BETWEEN ? AND ?';
    EXEC SQL EXECUTE stmt1 USING :sValue1, :sValue2;   
    ...
}
{
    ...
    int sValue1;
    int sValue2;
    ...
    EXEC SQL PREPARE stmt1 FROM 'SELECT SUM(c2) INTO :v1 FROM t1 WHERE c1 > :v2';
    EXEC SQL EXECUTE stmt1 USING :sValue1, :sValue2;
    ...
}

variable_name

variable_name에 대응하는 type은 character string이어야 한다.
variable_name에 정의된 dynamic SQL 문장은 유효한 문장이어야 한다.

sql statement

sql statement에 정의된 dynamic SQL 문장은 유효한 문장이어야 한다.

설명

PREPARE statement_name FROM sql_string 구문은 EXECUTE나 cursor를 사용하기 위해 SQL 문을 분석한다. statement_name은 embedded SQL 소스 코드에서 precompiler에게 statement를 알려주는 식별자로써 host variable이 아니기 때문에 별도의 type이나 선언이 필요하지 않다.

자세한 내용은 Embedded Dynamic SQL을 참조한다.

사용 예

다음은 embedded SQL 소스 코드 내에서 PREPARE statement_name를 사용하는 예이다.

{
    ...
    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;
    }
    ...
}

PREPARE statement_name이 사용된 전체 소스 코드는 Dynamic Embedded SQL Example Program에서 확인할 수 있다.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

B031

Basic Dynamic SQL

O

B034

Dynamic specification of cursor attributes

X

참조

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

RELEASE SAVEPOINT savepoint_specifier

기능

저장점을 제거한다.

구문

<release savepoint statement> ::=
    RELEASE SAVEPOINT savepoint_name 
    ;

구문 규칙 및 파라미터

savepoint_name

저장점의 이름으로써 반드시 존재해야 한다. 
이름의 길이는 128 바이트보다 작아야 한다.

설명

다수의 savepoint가 정의되어 있을 경우, RELEASE SAVEPOINT savepoint_name 구문을 수행할 때savepoint_name 이후에 정의된 savepoint도 함께 제거된다.

사용 예

다음은 savepoint를 제거하는 예이다.

gSQL> RELEASE SAVEPOINT sp2;

Savepoint dropped.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

T271

Savepoints

O

참조

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

REVOKE privileges FROM

기능

사용자에게 부여된 권한을 취소한다.

구문

<revoke privilege statement> ::=
    REVOKE [ <revoke option extention> ] <privilege>
      FROM <grantee> [, ...]
      [ <revoke behavior> ]
    ;

<revoke option extention> ::=
      GRANT OPTION FOR

<revoke behavior> ::=
      RESTRICT
    | CASCADE
    | CASCADE CONSTRAINTS

구문 규칙 및 파라미터

<privilege>

Revokee (권한을 취소당할 사용자)로부터 취소할 권한이다.

Revoker (구문을 수행하는 사용자)는 다음 조건 중 하나를 만족해야 한다.

ALL [PRIVILEGES]를 사용하는 경우, 만족하는 <privilege>가 없더라도 성공한다.

<privilege> 종류에 대한 내용은 GRANT privileges TO 구문의 <privilege> 절을 참조한다.

<grantee>

권한을 취소당할 사용자이다.

GRANT OPTION FOR

권한에 포함된 WITH GRANT OPTION을 삭제한다.
Dependent privilege의 WITH GRANT OPTION도 함께 삭제한다.

권한은 그대로 유지된다.

<revoke behavior>

설명

REVOKE privilege와 같은 Data Definition Language (DDL) 구문도 트랜잭션이 COMMIT 되기 전이라면 ROLLBACK 할 수 있다.

다음과 같은 DROP 구문을 수행할 경우, 별도로 REVOKE 구문을 수행하지 않더라도 해당 객체와 관련된 모든 권한 정보가 삭제된다.

사용 예

다음은 table t1에 대한 다수의 권한을 REVOKE하는 예이다.

gSQL> REVOKE INSERT, UPDATE, DELETE, LOCK, ALTER, INDEX ON t1 FROM u1;

Revoke succeeded.

다음은 모든 사용자를 의미하는 PUBLIC 계정에 부여된 SELECT ON TABLE t1 권한을 REVOKE 하는 예이다. 단, PUBLIC 계정의 권한만 제거될 뿐 특정 사용자에게 명시적으로 부여된 SELECT ON TABLE t1 권한이 제거되는 것은 아니다.

gSQL> REVOKE SELECT ON t1 FROM PUBLIC;

Revoke succeeded.

다음은 user u1에게 부여된 SELECT ON TABLE t1 권한은 그대로 두고 다른 사용자에게 해당 권한을 부여할 수 있는 GRANT OPTION만 REVOKE하는 예이다.

gSQL> REVOKE GRANT OPTION FOR SELECT ON t1 FROM u1;

Revoke succeeded.

다음은 RESTRICT 옵션을 이용해 user u1에게 부여한 권한을 REVOKE 하면서 u1이 다른 사용자에게 해당 권한을 부여할 경우 에러가 발생하는 예이다. 이런 dependent privilege들도 함께 제거하려 할 경우 CASCADE 옵션을 사용한다.

gSQL> REVOKE SELECT ON t1 FROM u1 RESTRICT;

ERR-2B000(16235): dependent privilege descriptors still exist

gSQL> REVOKE SELECT ON t1 FROM u1 CASCADE;

Revoke succeeded.

호환성

SQL 표준에서는 다음 privilege들을 정의하지 않고 있다.

SQL 표준의 <revoke behavior>와는 다음과 같은 차이가 있다.

SQL 표준 호환성

Feature ID

설명

지원 여부

T311

Basic roles

X

F034

Extended REVOKE statement

X

S081

Subtables

X

참조

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

ROLLBACK

기능

트랜잭션을 취소하거나, 저장점 이후의 작업을 취소한다.

구문

<rollback statement> ::=
    ROLLBACK [ WORK ] [ <rollback force clause> | <savepoint clause> ]
    ;

<rollback force clause> ::=
    FORCE 'xid_string' [ COMMENT 'comment_string' ]

<savepoint clause> ::=
    TO SAVEPOINT savepoint_name

구문 규칙 및 파라미터

WORK

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

<rollback force clause>

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

<savepoint clause>

현재 트랜잭션의 ROLLBACK 범위를 명시한다.

설명

ROLLBACK 구문은 트랜잭션 내에서 수행된 다음 구문들을 rollback 한다.

예외적으로, DDL 중에 OS 자원을 다루거나 DATA TYPE을 변경하는 다음 구문들은 rollback 되지 않고 구문을 수행할 때 자동으로 COMMIT 된다.

사용 예

다음은 INSERT 구문을 ROLLBACK 하는 예이다.

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

1 row created.

gSQL> SELECT * FROM t1;

ID DATA     
-- ---------
 1 anonymous

1 row selected.

gSQL> ROLLBACK;

Rollback complete.

gSQL> SELECT * FROM t1;

no rows selected.

다음은 DROP TABLE 구문을 수행한 후에 이를 ROLLBACK 하는 예이다.

gSQL> DROP TABLE t1;

Table dropped.

gSQL> SELECT * FROM t1;

ERR-42000(16040): table or view does not exist : 
SELECT * FROM t1
              *
ERROR at line 1:

gSQL> ROLLBACK;

Rollback complete.

gSQL> SELECT * FROM t1;

ID DATA     
-- ---------
 1 anonymous

1 row selected.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

T271

Savepoints

O

T261

Chained transactions

X

참조

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

SAVEPOINT savepoint_specifier

기능

저장점을 정의한다.

구문

<savepoint statement> ::=
    SAVEPOINT savepoint_name 
    ;

구문 규칙 및 파라미터

savepoint_name

저장점 이름이다.
저장점 이름이 기존의 저장점 이름과 중복될 경우 기존의 저장점이 삭제된다.
이름의 길이는 128 바이트보다 작아야 한다.

설명

정의된 savepoint는 ROLLBACK TO SAVEPOINT 구문 (ROLLBACK 구문 참조)에서 사용되며, 해당 savepoint까지 수행된 DML, DDL 구문이 철회되고 해당 구문이 획득한 lock도 해제된다.

정의된 savepoint는 transaction을 COMMIT 하거나 ROLLBACK 할 때 자동으로 제거되는데 RELEASE SAVEPOINT savepoint_specifier 구문을 사용하여 명시적으로 제거할 수도 있다.

사용 예

다음은 savepoint를 정의하고 ROLLBACK TO SAVEPOINT 구문을 사용하는 예이다.

gSQL> SAVEPOINT sp1;

Savepoint created.

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

1 row created.

gSQL> SAVEPOINT sp2;

Savepoint created.

gSQL> INSERT INTO t1 VALUES ( 2, 'someone' );

1 row created.

gSQL> SAVEPOINT sp3;

Savepoint created.

gSQL> INSERT INTO t1 VALUES ( 3, 'anyone' );

1 row created.

gSQL> SELECT * FROM t1;

ID DATA     
-- ---------
 1 anonymous
 2 someone  
 3 anyone   

3 rows selected.

gSQL> ROLLBACK TO SAVEPOINT sp3;

Rollback complete.

gSQL> SELECT * FROM t1;

ID DATA     
-- ---------
 1 anonymous
 2 someone  

2 rows selected.

gSQL> ROLLBACK TO SAVEPOINT sp2;

Rollback complete.

gSQL> SELECT * FROM t1;

ID DATA     
-- ---------
 1 anonymous

1 row selected.

gSQL> ROLLBACK TO SAVEPOINT sp1;

Rollback complete.

gSQL> SELECT * FROM t1;

no rows selected.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

T271

Savepoints

O

참조

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

SELECT

query expression

기능

하나 이상의 table 또는 view에서 원하는 row를 검색한다.

구문

<query expression> ::=
    <query expression body> [ <order by clause> ] [ <offset limit clause> ]

<query expression body> ::=
      <query term>
    | <set operator>

<query term> ::=
      <query specification>
    | <left paren> <query expression body> [ <order by clause> ] [ <offset limit clause> ] <right paren>

사용 범위 및 접근 권한

<query expression> 구문을 수행하려면 사용자가 구문에 사용된 모든 테이블에 대해 다음 권한 중 하나를 가져야 한다.

구문 규칙 및 파라미터

<set operator>

부질의 (subquery) 간의 집합 연산을 수행한다.
자세한 내용은 set operator 절을 참조한다.

<query specification>

하나의 부질의 (subquery)를 기술한다.
자세한 내용은 query specification 절을 참조한다.

<order by clause>

검색 결과에 대한 정렬 정보를 기술한다.
자세한 내용은 order by clause를 참조한다.

<offset limit clause>

검색 결과 집합에서 skip 할 row의 개수와 fetch 할 row의 개수를 기술한다.
자세한 내용은 offset limit clause를 참조한다.

설명

SELECT 구문을 기술하는 것으로써 <order by clause>, <offset limit clause>는 생략할 수 있고 <set operator>를 사용하여 둘 이상의 부질의 (subquery)를 가질 수 있다.

사용 예

다음은 SELECT 구문의 예이다.

gSQL> SELECT s_name, s_nation FROM supplier;

S_NAME                    S_NATION     
------------------------- -------------
Supplier#1                FRANCE       
Supplier#2                KOREA        
Supplier#3                GERMANY      
Supplier#4                UNITED STATES
Supplier#5                CANADA       

5 rows selected.

다음은 <order by clause>를 사용한 SELECT 구문의 예이다.

gSQL> SELECT s_name, s_nation FROM supplier ORDER BY s_name DESC;

S_NAME                    S_NATION
------------------------- -------------
Supplier#5                CANADA
Supplier#4                UNITED STATES
Supplier#3                GERMANY
Supplier#2                KOREA
Supplier#1                FRANCE

5 rows selected.

다음은 <offset limit clause>를 사용한 SELECT 구문의 예이다.

gSQL> SELECT s_name, s_nation FROM supplier OFFSET 1;

S_NAME                    S_NATION
------------------------- -------------
Supplier#2                KOREA
Supplier#3                GERMANY
Supplier#4                UNITED STATES
Supplier#5                CANADA

4 rows selected.

gSQL> SELECT s_name, s_nation FROM supplier LIMIT 1; 

S_NAME                    S_NATION
------------------------- --------
Supplier#1                FRANCE  

1 row selected.

다음은 <order by clause>와 <offset limit clause>를 사용한 SELECT 구문의 예이다.

gSQL> SELECT s_name, s_nation FROM supplier ORDER BY s_name DESC OFFSET 3 LIMIT 1; 

S_NAME                    S_NATION
------------------------- --------
Supplier#2                KOREA   

1 row selected.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

T121

WITH (excluding RECURSIVE ) in query expression

X

T122

WITH (excluding RECURSIVE ) in subquery

X

T131

Recursive query

X

T132

Recursive query in subquery

X

F661

Simple tables

O

F302

INTERSECT table operator

O

F301

CORRESPONDING in query expressions

X

T551

Optional key words for default syntax

O

F304

EXCEPT ALL table operator

O

F850

Top-level <order by clause>in <query expression>

X

F851

<order by clause>in subqueries

O

F855

Nested <order by clause>in <query expression>

O

F856

Nested <fetch first clause>in <query expression>

X

F857

Top-level <fetch first clause>in <query expression>

X

F858

<fetch first clause>in subqueries

X

F860

dynamic <fetch first row count>in <fetch first clause>

X

F861

Top-level <result offset clause>in <query expression>

O

F862

<result offset clause>in subqueries

O

F863

Nested <result offset clause>in <query expression>

O

F865

dynamic <offset row count>in <result offset clause>

X

F866

FETCH FIRST clause: PERCENT option

X

F867

FETCH FIRST clause: WITH TIES option

X

query specification

기능

<table expression> 결과로부터 파생된 table을 기술한다.

구문

<query specification> ::=
    SELECT [ <hint clause> ] [ <set quantifier> ] <select list> <table expression>

<set quantifier> ::=
      ALL
    | DISTINCT

<table expression> ::=
      <from clause> [ <where clause> ] [ <group by clause> ] [ <having clause> ]

사용 범위 및 접근 권한

<query specification> 구문을 수행하려면 사용자가 다음 조건 중 하나를 만족해야 한다.

구문 규칙 및 파라미터

<hint clause>

질의 수행에 필요한 힌트를 기술한다.
자세한 내용은 hint clause를 참조한다.

<set quantifier>

질의 결과의 중복 제거 여부를 기술한다.
생략할 경우, ALL과 동일하게 동작한다.

<select list>

검색 결과 중 결과로 내보낼 expression들을 기술한다.
자세한 내용은 select list를 참조한다.

<from clause>

검색할 table들을 기술한다.
자세한 내용은 from clause를 참조한다.

<where clause>

검색 조건을 기술한다.
자세한 내용은 where clause를 참조한다.

<group by clause>

검색 결과에 대한 grouping을 기술한다.
자세한 내용은 group by clause를 참조한다.

<having clause>

Grouping 된 결과에 대한 조건을 기술한다.
자세한 내용은 having clause를 참조한다.

설명

<hint clause>

<hint clause>는 optimizer가 선택한 실행 계획보다 더 좋은 실행 계획이 있는 경우 사용자가 optimizer에게 더 좋은 실행 계획을 수행하도록 지시하는 구문이다.

GOLDILOCKS의 optimizer는 사용자가 기술한 <hint clause>를 우선 적용한다. 
만약 적용할 수 없을 경우에는 cost 계산을 통해 최적의 실행 계획을 선택한다.

GOLDILOCKS는 <hint clause>에 구문상 에러가 발생하더라도 이를 무시하고 진행하도록 기본 설정되어 있다. <hint clause>에 구문상 에러가 있는지 확인하려면 "HINT_ERROR" property를 on으로 설정하고 질의를 수행하도록 한다.

<set quantifier>

<set quantifier>는 <select list>에 기술된 expression들로써 구성된 각 row의 중복 제거 여부를 설정하며 각 set quantifier의 의미는 다음과 같다.

<set quantifier>는 생략할 수 있는데 생략할 경우, default로 ALL이 설정된 것과 동일하게 동작한다.

<select list>

<select list>는 결과 집합의 각 row에서 반환할 expression들의 목록을 기술한다. 이 목록은 콤마 (,) 리스트로 구분하여 기술할 수 있으며, <from clause>에 기술한 모든 column들을 기술하고 싶은 경우에는 별표 (*)를 사용한다.

<from clause>

<from clause>는 검색할 table 또는 view들을 기술한다.

<where clause>

<where clause>는 <table expression>으로부터 얻은 결과 집합 중에 원하는 결과만 가져오도록 검색 조건을 기술한다.

<group by clause>

<group by clause>는 <table expression>으로부터 얻은 결과 집합을 grouping 할 방법을 기술한다.

<group by clause>가 기술된 경우, <select list>에는 group을 결정하는 group key나 group에 속하는 데이터에 대한 집계 함수만 사용할 수 있다.

<having clause>

<having clause>는 grouping된 결과 집합 중에 원하는 결과만 가져오도록 group에 대한 검색 조건을 기술한다.
일반적으로 <group by clause>와 함께 사용되며, <group by clause> 없이 사용된 경우 <table expression>에서 반환된 결과 집합 모두가 하나의 group인 <group by clause>가 기술된 것과 동일하게 동작한다.

사용 예

다음은 <hint clause>를 사용한 SELECT 구문의 예이다.

gSQL> SELECT /*+ INDEX_DESC(supplier, supplier_pk_index) */ s_name, s_nation FROM supplier;

S_NAME                    S_NATION
------------------------- -------------
Supplier#5                CANADA
Supplier#4                UNITED STATES
Supplier#3                GERMANY
Supplier#2                KOREA
Supplier#1                FRANCE

5 rows selected.

다음은 <set quantifier>를 사용한 SELECT 구문의 예이다.

gSQL> SELECT ALL p_type FROM part;

P_TYPE
------
COPPER
NICKEL
STEEL
NICKEL
STEEL

5 rows selected.

gSQL> SELECT DISTINCT p_type FROM part;

P_TYPE
------
COPPER
STEEL
NICKEL

3 rows selected.

다음은 <where clause>를 사용한 SELECT 구문의 예이다.

gSQL> SELECT p_name, p_brand, p_type, p_size FROM part where p_size < 10;

P_NAME P_BRAND    P_TYPE P_SIZE
------ ---------- ------ ------
Part#1 Brand#1    COPPER      7
Part#2 Brand#1    NICKEL      1

2 rows selected.

다음은 <group by clause>를 사용한 SELECT 구문의 예이다.

gSQL> SELECT ps_partkey, SUM(ps_availqty) FROM partsupp GROUP BY ps_partkey;

PS_PARTKEY SUM(PS_AVAILQTY)
---------- ----------------
         1            11401
         2             8025
         3            13864
         4            11564
         5             8744

5 rows selected.

다음은 <having clause>를 사용한 SELECT 구문의 예이다.

gSQL> SELECT ps_partkey, SUM(ps_availqty) FROM partsupp GROUP BY ps_partkey having SUM(ps_availqty) > 10000;

PS_PARTKEY SUM(PS_AVAILQTY)
---------- ----------------
         1            11401
         3            13864
         4            11564

3 rows selected.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

F801

Full set function

X

T051

Row types

X

T301

Functional dependencies

X

T325

Qualified SQL parameter references

X

T053

Explicit aliases for all-fields reference

O

T285

Enhanced derived column names

O

참조

관련 내용은 query expression을 참조한다.

select list

기능

질의 결과로부터 검색할 column을 기술한다.

구문

<select list> ::=
      <asterisk>
    | <select sublist> [ { <comma> <select sublist> } ... ]

<select sublist> ::=
      <derived column>
    | <qualified asterisk>

<qualified asterisk> ::=
      <asterisked identifier chain> <period> <asterisk>

<asterisked identifier chain> ::=
    <asterisked identifier> [ { <period> <asterisked identifier> } ... ]

<derived column> ::=
    <value expression> [ <as clause> ]

<as clause> ::=
    [ AS ] <column name>

사용 범위 및 접근 권한

<select list> 구문에 column이나 subquery가 존재할 때 <select list> 구문을 수행하려면 사용자가 column에 대한 접근 권한과 subquery에 존재하는 table 및 column에 대한 접근 권한을 만족해야 한다.

구문 규칙 및 파라미터

<select list>

<asterisk>나 <select sublist>를 갖는다.
<asterisk>는 <select list>에 단독으로만 쓰일 수 있다. 즉, <select sublist>를 기술할 수 없다.
둘 이상의 <select sublist>를 기술할 경우, 각 <select sublist>를 콤마 (,)로 구분해야 한다.

<select sublist>

<derived column>이나 <qualified asterisk>를 갖는다.
테이블 하나당 한 개의 <quantified asterisk>만 가질 수 있다.
<derived column>은 AS를 사용하여 출력 이름을 변경할 수 있으며, AS는 생략할 수 있다.

설명

<select list>

<select list>는 결과 집합에 포함될 column들을 기술한다. <select list>에 <asterisk>를 기술할 경우, <from clause>에 있는 모든 column들을 select list로 설정하며, <select sublist>를 추가로 기술할 수 없다.

<select sublist>

<select sublist>는 <derived column> 또는 <qualified asterisk>를 갖는다. <select sublist>를 둘 이상 기술할 경우에는 반드시 콤마 (,)로 구분해야 한다.

<qualified asterisk>는 특정 table이나 view에 속하는 모든 column들을 select list로 설정하고 <derived column>은 column을 직접 기술하거나 <value expression>을 기술할 수 있다.

<derived column>은 <as clause>를 사용하여 column name을 변경할 수 있으며, 이 때 AS는 생략할 수 있다.

select list에 설정되는 이름

사용 예

다음은 <asterisk>를 사용한 SELECT 구문의 예이다.

gSQL> SELECT * FROM supplier;

S_SUPPKEY S_NAME                    S_NATION      S_PHONE
--------- ------------------------- ------------- ---------------
        1 Supplier#1                FRANCE        27-918-335-1736
        2 Supplier#2                KOREA         15-679-861-2259
        3 Supplier#3                GERMANY       11-383-516-1199
        4 Supplier#4                UNITED STATES 25-843-787-7479
        5 Supplier#5                CANADA        21-151-690-3663

5 rows selected.

다음은 <select sublist>를 사용한 SELECT 구문의 예이다.

gSQL> SELECT revenue.* FROM revenue;

SUPPLIER_NO TOTAL_REVENUE
----------- -------------
          1      11978.64
          2       20321.5
          3      41844.68

3 rows selected.

gSQL> SELECT supplier_no suppno, total_revenue AS TOTAL FROM revenue;

SUPPNO    TOTAL
------ --------
     1 11978.64
     2  20321.5
     3 41844.68

3 rows selected.

gSQL> SELECT 1, revenue.*, CAST( total_revenue AS NATIVE_INTEGER ) TOTAL FROM revenue;

1 SUPPLIER_NO TOTAL_REVENUE TOTAL
- ----------- ------------- -----
1           1      11978.64 11979
1           2       20321.5 20322
1           3      41844.68 41845

3 rows selected.

호환성

<select list>와 달리 SQL 표준에서는 <all fields reference>를 지원한다.

참조

관련 내용은 query specification을 참조한다.

from clause

기능

하나 이상의 table들로부터 파생된 table을 기술한다.

구문

<from clause> ::=
    FROM <table reference list>

<table reference list> ::=
    <table reference> [ { , <table reference> } ... ]

<table reference> ::=
      <table factor>
    | <joined table>

<table factor> ::=
    <table primary>

<table primary> ::=
      <table name> [ <cluster domain> ] [ [ AS ] <correlation name> ]
    | <derived table> [ <cluster domain> ] [ [ AS ] <correlation name> [ <left paren> <derived column list> <right paren> ] ]
    | <parenthesized joined table>

<derived table> ::=
    <table subquery>

<parenthesized joined table> ::=
      <left paren> <parenthesized joined table> <right paren>
    | <left paren> <joined table> <right paren>

<derived column list> ::=
    <column name list>

<cluster domain> ::=
    @ <cluster domain name>

<cluster domain name> ::=
      GLOBAL
    | LOCAL
    | LOCAL_OFFLINE
    | <identifier>

사용 범위 및 접근 권한

<table reference list>에 기술한 table 또는 view에 대한 접근 권한이 있어야 한다.

구문 규칙 및 파라미터

<table reference list>

<table primary>

<correlation name>을 사용하여 별칭 (alias name)을 기술할 수 있다.
<derived table>에는 <table subquery>가 있고 <correlation name>을 이용하여 별칭 (alias name)을 기술할 수 있다.
<derived table>에 <derived column list>를 기술할 수 있으며, <derived column list>의 <column name> 개수는 <table subquery>에 기술한 <select list>의 target 개수와 동일해야 한다.
<derived table>에 <derived column list>를 기술한 경우 <table subquery>에 기술한 <select list>의 target과 순서대로 1 : 1 매핑된다.
<derived table>에 <derived column list>를 기술한 경우 해당 <derived table>내 <table subquery>의 <select list>를 참조하려면 반드시 <derived column list>에 기술한 <column name>을 사용하여야 한다.

<correlation name>

<table reference list>에는 동일한 <correlation name>이 두 개 이상 존재할 수 없다.
<table name>이나 <derived table>에 <correlation name>이 기술된 경우 해당 <table name>이나  <derived table>을 참조하려면 반드시 <correlation name>을 사용해야 한다.
<correlation name>을 기술할 때 그 앞의 AS는 생략할 수 있다.

<derived column list>

<derived column list>에는 동일한 <column name>이 두 개 이상 존재할 수 없다.

<cluster domain>

<cluster domain name>

Cluster group name이나 cluster member name만이 <cluster domain name>의 <identifier>가 될 수 있다.

설명

<table reference list>

<table reference list>에는 콤마 (,)를 사용하여 두 개 이상의 테이블들을 기술할 수 있다. 두 개 이상의 테이블을 기술하면 해당 테이블들을 왼쪽부터 오른쪽으로 각각 cross join하듯 작동하며 이 때 <where clause>에 두 테이블의 join 조건이 존재하는 경우 해당하는 두 테이블은 <where clause>를 join 조건으로 갖는 inner join처럼 동작한다. 만약 <where clause>에 outer join operator (+)를 사용한 경우, outer join과 동일하게 작동한다.

Outer join operator (+)에 대한 자세한 내용은 joined table 절의 outer join operator specification을 참조한다.

<table reference>

단일 table이나 view, table subquery, joined table 등이 <table reference>가 될 수 있다. Joined table을 제외한 나머지는 correlation name을 가질 수 있다.

Joined table에 대한 자세한 내용은 joined table 절을 참조한다.

<table primary>

Table이나 view, table subquery, 괄호로 묶인 joined table이 <table primary>가 될 수 있다. Table이나 view, table subquery는 correlation name을 가질 수 있는데, 이 때 AS는 생략할 수 있다. Correlation name이 기술될 경우, <select list>나 <where clause>와 같이 해당 table이나 view, table subquery를 참조하는 모든 경우에 correlation name을 사용해야 한다.

Table subquery는 괄호를 이용하여 <derived column list>에 기술할 수 있으며, correlation name과 마찬가지로 해당 table subquery의 column을 참조하는 모든 경우에 <derived column list>에 기술한 이름을 사용하여야 한다. Table subquery에 <derived column list>를 사용하려면 correlation name을 반드시 기술하여야 한다.

괄호로 묶은 joined table은 join 연산에 참여하는 table들의 논리적 join 순서를 기술한다. 이 때 괄호로 묶은 모든 table들에 대한 join이 모두 cross join과 inner join일 경우, optimizer가 join 순서를 변경할 수 있다.

<cluster domain>

<cluster domain>이 생략된 경우 <cluster domain name>으로 GLOBAL을 사용한 것과 동일한 의미를 갖는다.

<cluster domain name>

<cluster domain name>에 정의된 예약어는 다음과 같은 의미를 가진다.

<cluster domain name>에 <identifier>를 기술한 경우 해당 이름의 cluster group 또는 cluster member를 Cluster Domain으로 선정한다.

사용 예

다음은 <table name>을 이용하여 단일 table을 검색하는 SELECT 구문의 예이다.

gSQL> SELECT c_name, c_nation FROM customer;

C_NAME     C_NATION
---------- -------------
Customer#1 KOREA
Customer#2 CANADA
Customer#3 KOREA
Customer#4 GERMANY
Customer#5 UNITED STATES

5 rows selected.

다음은 <derived table>을 이용하는 SELECT 구문의 예이다.

gSQL> SELECT * FROM (SELECT c_name, c_nation FROM customer);

C_NAME     C_NATION
---------- -------------
Customer#1 KOREA
Customer#2 CANADA
Customer#3 KOREA
Customer#4 GERMANY
Customer#5 UNITED STATES

5 rows selected.


gSQL> SELECT * FROM (SELECT c_name, c_nation FROM customer) AS CUST ("CUSTOMER_NAME", "CUSTOMER_NATION");

CUSTOMER_NAME CUSTOMER_NATION
------------- ---------------
Customer#1    KOREA          
Customer#2    CANADA         
Customer#3    KOREA          
Customer#4    GERMANY        
Customer#5    UNITED STATES  

5 rows selected.

다음은 괄호를 이용한 joined table에 대한 SELECT 구문의 예이다.

gSQL> SELECT customer.c_name, o_totalprice FROM (customer INNER JOIN orders ON customer.c_custkey = orders.o_custkey);

C_NAME     O_TOTALPRICE
---------- ------------
Customer#1    173665.47
Customer#2     46929.18
Customer#4    193846.25
Customer#3     32151.78
Customer#5     144659.2

5 rows selected.

다음은 콤마 (,)로 구분한 두 개의 table들을 사용하는 SELECT 구문의 예이다.

gSQL> SELECT c_name, o_totalprice FROM customer, orders;

C_NAME     O_TOTALPRICE
---------- ------------
Customer#1    173665.47
Customer#1     46929.18
Customer#1    193846.25
Customer#1     32151.78
Customer#1     144659.2
Customer#2    173665.47
Customer#2     46929.18
Customer#2    193846.25
Customer#2     32151.78
Customer#2     144659.2
Customer#3    173665.47
Customer#3     46929.18
Customer#3    193846.25
Customer#3     32151.78
Customer#3     144659.2
Customer#4    173665.47
Customer#4     46929.18
Customer#4    193846.25
Customer#4     32151.78
Customer#4     144659.2

C_NAME     O_TOTALPRICE
---------- ------------
Customer#5    173665.47
Customer#5     46929.18
Customer#5    193846.25
Customer#5     32151.78
Customer#5     144659.2

25 rows selected.

다음은 <cluster domain>을 이용하는 SELECT 구문의 예이다.

gSQL> SELECT * FROM (SELECT c_name, c_nation FROM customer@GLOBAL);

C_NAME     C_NATION
---------- -------------
Customer#1 KOREA
Customer#2 CANADA
Customer#3 KOREA
Customer#4 GERMANY
Customer#5 UNITED STATES

5 rows selected.
gSQL> SELECT * FROM (SELECT c_name, c_nation FROM customer)@LOCAL;

C_NAME     C_NATION
---------- -------------
Customer#1 KOREA
Customer#2 CANADA

2 rows selected.
gSQL> SELECT * FROM (SELECT c_name, c_nation FROM customer@G1);

C_NAME     C_NATION
---------- -------------
Customer#1 KOREA
Customer#2 CANADA

2 rows selected.
gSQL> SELECT * FROM (SELECT c_name, c_nation FROM customer@G2N1);

C_NAME     C_NATION
---------- -------------
Customer#3 KOREA
Customer#4 GERMANY

2 rows selected.

호환성

SQL 표준은 GOLDILOCKS와 비교하여 다음과 같은 차이가 있다.

참조

관련 내용은 subquery를 참조한다.

joined table

기능

Cartesian product, inner join, outer join 등에서 파생되는 table을 기술한다.

구문

<joined table> ::=
      <cross join>
    | <qualified join>
    | <natural join>

<cross join> ::=
    <table reference> CROSS JOIN <table factor>

<qualified join> ::=
    <table reference> [ <join type> ] JOIN <table reference> <join specification>

<natural join> ::=
    <table reference> NATURAL [ <join type> ] JOIN <table factor>

<join specification> ::=
      <join condition>
    | <named columns join>

<join condition> ::=
    ON <search condition>

<named columns join> ::=
    USING ( <join column list> )

<join type> ::=
      INNER
    | { LEFT | RIGHT | FULL } [ OUTER ]

<join column list> ::=
    <column name list>

사용 범위 및 접근 권한

Joined table에 기술된 모든 table 및 view에 대한 접근 권한이 있어야 한다.

구문 규칙 및 파라미터

<cross join>

<join specification>은 <cross join> 위치에 오지 않으며, <cross join>의 오른쪽에는 단일 테이블이나 <table subquery>, 괄호로 묶은 <joined table>이 올 수 있다.

<qualified join>

<natural join>

<join specification>

설명

<cross join>

<cross join>은 왼쪽의 각 row를 오른쪽의 모든 row들과 결합한 결과를 반환한다.

<cross join>에는 join 조건을 명시적으로 기술할 수 없지만, <where clause>를 통해 두 table에 대한 join 조건을 기술할 수 있으며, 이 경우 inner join과 동일하게 동작한다.

<qualified join>

<qualified join>은 왼쪽의 각 row들을 오른쪽의 모든 row들과 결합한 후 join 조건을 만족하는 row들만 결과로 반환한다. <where clause>가 존재하면 join 구문을 수행할 때 join 조건을 적용한 결과 row들에 <where clause>의 조건들을 적용한다.

Inner join은 <where clause>에 존재하는 조건들을 join 조건처럼 처리해도 결과가 동일하지만, outer join은 <where clause>에 존재하는 조건들을 join 조건처럼 처리하면 결과가 달라지게 된다.

Left outer join은 왼쪽 row에 대하여 join 조건을 만족하는 오른쪽 row가 있을 경우, 해당 row들을 결합한 row를 결과로 반환하며, join 조건을 만족하는 오른쪽 row가 존재하지 않을 경우 왼쪽 row의 값은 그대로 유지하고 오른쪽 row의 값은 모두 NULL로 채운 row를 결과로 반환한다.

Right outer join은 left outer join과 정확히 반대로 동작한다.

Full outer join은 left outer join의 결과와 함께 join 조건을 만족하지 않는 모든 오른쪽 row에 왼쪽 row의 값을 NULL로 채운 row들을 결과로 반환한다.

<natural join>

<natural join>은 join에 참여하는 두 table에서 동일한 이름을 갖는 모든 column들을 각각 equal 조건으로 join 한다. 즉, join에 참여하는 두 table에서 동일한 이름을 갖는 모든 column들을 inner join에서 USING 구문에 기술한 것과 동일하다.

<join specification>

<join condition>은 join 구문의 왼쪽 row와 오른쪽 row를 조인할 조건을 기술하며, <named columns join>은 왼쪽 row와 오른쪽 row에 대해 동일한 <column name>이 존재하는 경우 이를 나열하여 조인 조건을 기술한다.

사용 예

다음은 <cross join>을 사용한 SELECT 구문의 예이다.

gSQL> SELECT c_name, o_totalprice FROM customer CROSS JOIN orders;

C_NAME     O_TOTALPRICE
---------- ------------
Customer#1    173665.47
Customer#1     46929.18
Customer#1    193846.25
Customer#1     32151.78
Customer#1     144659.2
Customer#2    173665.47
Customer#2     46929.18
Customer#2    193846.25
Customer#2     32151.78
Customer#2     144659.2
Customer#3    173665.47
Customer#3     46929.18
Customer#3    193846.25
Customer#3     32151.78
Customer#3     144659.2
Customer#4    173665.47
Customer#4     46929.18
Customer#4    193846.25
Customer#4     32151.78
Customer#4     144659.2

C_NAME     O_TOTALPRICE
---------- ------------
Customer#5    173665.47
Customer#5     46929.18
Customer#5    193846.25
Customer#5     32151.78
Customer#5     144659.2

25 rows selected.

다음은 inner join을 사용한 SELECT 구문의 예이다.

gSQL> SELECT c_name, o_totalprice FROM customer INNER JOIN orders ON c_custkey = o_custkey;

C_NAME     O_TOTALPRICE
---------- ------------
Customer#1    173665.47
Customer#2     46929.18
Customer#4    193846.25
Customer#3     32151.78
Customer#5     144659.2

5 rows selected.

다음은 outer join을 사용한 SELECT 구문의 예이다.

gSQL> SELECT c_name, o_totalprice FROM customer LEFT OUTER JOIN orders ON c_custkey = o_custkey AND o_orderdate < '1996-01-01';

C_NAME     O_TOTALPRICE
---------- ------------
Customer#1         null
Customer#2         null
Customer#3     32151.78
Customer#4    193846.25
Customer#5     144659.2

5 rows selected.

gSQL> SELECT c_name, o_totalprice FROM customer RIGHT OUTER JOIN orders ON c_custkey = o_custkey AND c_nation = 'KOREA';

C_NAME     O_TOTALPRICE
---------- ------------
Customer#1    173665.47
null           46929.18
null          193846.25
Customer#3     32151.78
null           144659.2

5 rows selected.

gSQL> SELECT c_name, o_totalprice FROM customer FULL OUTER JOIN orders ON c_custkey = o_custkey AND c_nation = 'KOREA' AND o_orderdate < '1996-01-01';

C_NAME     O_TOTALPRICE
---------- ------------
Customer#1         null
Customer#2         null
Customer#3     32151.78
Customer#4         null
Customer#5         null
null          173665.47
null           46929.18
null          193846.25
null           144659.2

9 rows selected.

다음은 natural join을 사용한 SELECT 구문의 예이다.

gSQL> SELECT c_name, o_totalprice FROM (SELECT c_custkey custkey, c_name FROM customer) NATURAL JOIN (SELECT o_custkey custkey, o_totalprice FROM orders);

C_NAME     O_TOTALPRICE
---------- ------------
Customer#1    173665.47
Customer#2     46929.18
Customer#4    193846.25
Customer#3     32151.78
Customer#5     144659.2

5 rows selected.

호환성

SQL 표준은 GOLDILOCKS와 비교하여 다음과 같은 차이가 있다.

SQL 표준 호환성

Feature ID

설명

지원 여부

F401

Extended joined table

O

F402

Named column joins for LOBs, arrays, and multisets

X

F403

Partitioned join tables

X

참조

관련 내용은 from clause를 참조한다.

where clause

기능

<from clause> 결과에 <search condition>을 적용한다.

구문

<where clause> ::=
    WHERE <search condition>

구문 규칙 및 파라미터

<where clause>

WHERE 키워드 뒤에는 boolean type을 반환하는 <search condition>이 와야 한다.

설명

<where clause>에 대한 자세한 내용은 Conditions를 참조한다.

사용 예

다음은 <where clause>를 사용한 SELECT 구문의 예이다.

gSQL> SELECT s_name, s_nation FROM supplier WHERE s_nation = 'KOREA';

S_NAME                    S_NATION
------------------------- --------
Supplier#2                KOREA

1 row selected.

gSQL> SELECT s_name, ps_availqty, ps_supplycost FROM supplier, partsupp WHERE s_nation = 'KOREA' AND s_suppkey = ps_suppkey;

S_NAME                    PS_AVAILQTY PS_SUPPLYCOST
------------------------- ----------- -------------
Supplier#2                       8076        993.49
Supplier#2                       4069        357.84

2 rows selected.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

F441

Extended set function support

O

참조

관련 내용은 query specification을 참조한다.

group by clause

기능

이전 구문들이 처리한 결과에 <group by clause>를 적용한 grouped table을 기술한다.

구문

<group by clause> ::=
    GROUP BY <grouping element list>

<grouping element list> ::=
    <grouping element> [ { , <grouping element> } ... ]

<grouping element> ::=
      <ordinary grouping set>
    | <empty grouping set>

<ordinary grouping set> ::=
      <grouping column reference>

<grouping column reference> ::=
    <column reference>
    | <value_expression>

<empty grouping set> ::=
    <left paren> <right paren>

사용 범위 및 접근 권한

<group by clause>를 수행하기 위해 별도의 접근 권한이 필요한 것은 아니다.

구문 규칙 및 파라미터

<ordinary grouping set>

하나 이상의 <grouping column reference>로 구성한다.
LONG type은 지원하지 않는다.

<empty grouping set>

괄호만 사용하여 기술할 수 있으며, 괄호 안에는 어떠한 expression도 쓸 수 없다.

설명

<grouping element list>

<group by clause>에 기술된 <grouping element>를 순서대로 결합하여 하나의 GROUPING SET로 만드는 grouping을 수행한다. 이 때 GROUPING SET에 존재하는 모든 <grouping element>들의 값이 순서대로 일치하는 group은 동일한 group으로 처리한다.

<group by clause>가 기술된 경우, <select list>에는 <group by clause>에 기술된 column이나 <group by clause>에 기술되어 있지 않는 column 중에 집계 함수에 사용되는 column만 올 수 있다.

<grouping column reference>

<grouping column reference>에는 <column reference>나 <value expression>이 올 수 있다.

<column reference>는 <query specification>의 <from clause>에 속하는 column들만 참조할 수 있으며, 동일한 column 이름이 존재하는 경우 table 이름 등을 사용하여 column 이름을 명확하게 기술하여야 한다.

<value expression>은 <column reference>를 포함한 expression이나 <column reference>를 포함하지 않는 expression으로 구성될 수 있다. 전자의 경우 <column reference>를 사용하여 여러 group으로 구분할 수 있지만, 후자의 경우 <value expression>의 값이 모두 동일한 상수값이기 때문에 모든 레코드가 단일 group으로 구성된다.

<value expression>에 null 값을 기술하는 경우, null 값들은 동일한 값으로 취급되어 모든 레코드가 단일 group으로 구성된다.

<empty grouping set>

<empty grouping set>는 grouping 대상 column이 존재하지 않는다는 의미이다. 따라서, 모든 레코드가 단일 group으로 구성된다.

사용 예

다음은 GROUP BY를 사용한 SELECT 구문의 예이다.

gSQL> SELECT c_nation, COUNT(c_name) FROM customer GROUP BY c_nation;

C_NATION      COUNT(C_NAME)
------------- -------------
UNITED STATES             1
CANADA                    1
KOREA                     2
GERMANY                   1

4 rows selected.

gSQL> SELECT COUNT(c_name) FROM customer GROUP BY NULL;

COUNT(C_NAME)
-------------
            5

1 row selected.

gSQL> SELECT COUNT(c_name) FROM customer GROUP BY ();

COUNT(C_NAME)
-------------
            5

1 row selected.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

T431

Extended grouping capabilities

X

T432

Nested and concatenated GROUPING SETS

X

T434

GROUP BY DISTINCT

X

참조

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

having clause

기능

<search condition>을 만족하지 않는 group을 제거한 grouped table을 기술한다.

구문

<having clause> ::=
    HAVING <search condition>

사용 범위 및 접근 권한

<having clause>를 수행하기 위해 별도의 접근 권한이 필요한 것은 아니다.

구문 규칙 및 파라미터

<having clause>

<group by clause>에 기술된 column만 <search condition>에 집계 함수 없이 사용할 수 있다.
<group by clause>에 기술되지 않은 column은 집계 함수를 사용하여 기술할 수 있다.

설명

<having clause>

<having clause>는 grouping된 데이터들에 대한 검색 조건을 기술한다. 일반적으로 <group by clause>와 같이 사용되며, <group by clause> 없이 <having clause>를 사용할 경우, "GROUP BY ()"가 있는 것으로 간주한다.

<having clause>에는 <group by clause>에 기술된 column만 단독으로 기술할 수 있다. 이 외의 column을 단독으로 기술하려면 집계 함수를 사용해야 한다.

사용 예

다음은 <having clause>를 사용한 SELECT 구문의 예이다.

gSQL> SELECT c_nation, COUNT(c_name) FROM customer GROUP BY c_nation HAVING COUNT(c_name) > 1;

C_NATION COUNT(C_NAME)
-------- -------------
KOREA                2

1 row selected.

gSQL> SELECT COUNT(c_name) FROM customer HAVING COUNT(c_name) > 1;

COUNT(C_NAME)
-------------
            5

1 row selected.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

T301

Functional dependencies

O

참조

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

order by clause

기능

검색 결과의 정렬 순서를 기술한다.

구문

<order by clause> ::=
    ORDER BY <sort specification list>

<sort specification list> ::=
    <sort specification> [ { <comma> <sort specification> }... ]

<sort specification> ::=
    <sort key> [ <ordering specification> ] [ <null ordering> ]

<sort key> ::=
    <value expression>

<ordering specification> ::=
      ASC
    | DESC

<null ordering> ::=
      NULLS FIRST
    | NULLS LAST

사용 범위 및 접근 권한

정렬을 위해 기술한 sort key에 column이 존재하는 경우 사용자에게 column에 대한 접근 권한이 있어야 한다.

구문 규칙 및 파라미터

<order by clause>

<sort specification list>

<ordering specification>을 명시하지 않은 경우, 기본값은 ASC이다.
<null ordering>을 명시하지 않은 경우, 기본값은 NULLS LAST이다.

<sort key>

설명

<order by clause>

<order by clause>는 검색 결과를 정렬하기 위한 방법을 기술한다. <order by clause>에는 <sort key>들을 콤마 (,) 리스트로 나열할 수 있으며, 나열한 순서대로 각 레코드들의 <sort key>를 비교하여 순서대로 정렬한다.

<sort key>에는 오름차순 정렬이나 내림차순 정렬을 지정하는 <ordering specification>을 기술할 수 있는데 생략할 경우에는 오름차순으로 정렬된다. 또한 <sort key>에는 NULL 값과 NULL이 아닌 값의 순서를 <null ordering>을 사용하여 지정할 수 있는데 생략할 경우에는 NULLS LAST로 정렬된다.

<sort key>에 상수값을 기술할 경우 <select list>에서 해당 값의 순번에 위치한 expression을 <sort key>로 간주한다. 그리고 이 때 기술하는 상수값은 0보다 크면서 <select list>에 기술한 expression의 전체 개수와 같거나 작아야 하고 scale은 0이어야 하다.

<sort key>에는 LONG type을 기술할 수 없다.

Null value와의 비교

동일한 sort key 값을 가지는 row들의 정렬

Sort key로 구분할 수 없는 row들을 peer라고 하며, peer들은 탐색 순서에 따라 정렬된다.

<sort key>로 사용되는 <aggregation function>

<query specification>에서 <aggregation function>이 사용되거나 <group by clause>가 기술된 경우, <aggregation function>을 <sort key>로 사용할 수 있다. 단, <group by clause>가 기술된 경우에만 중첩된 <aggregation function>을 <sort key>로 사용할 수 있다.

사용 예

다음은 ORDER BY를 사용한 SELECT 구문의 예이다.

gSQL> SELECT c_name, c_nation FROM customer ORDER BY c_nation;

C_NAME     C_NATION
---------- -------------
Customer#2 CANADA
Customer#4 GERMANY
Customer#1 KOREA
Customer#3 KOREA
Customer#5 UNITED STATES

5 rows selected.

gSQL> SELECT c_name, c_nation FROM customer ORDER BY c_nation DESC;

C_NAME     C_NATION
---------- -------------
Customer#5 UNITED STATES
Customer#1 KOREA
Customer#3 KOREA
Customer#4 GERMANY
Customer#2 CANADA

5 rows selected.

gSQL> SELECT c_name, c_nation FROM customer ORDER BY 2 DESC;

C_NAME     C_NATION     
---------- -------------
Customer#5 UNITED STATES
Customer#1 KOREA        
Customer#3 KOREA        
Customer#4 GERMANY      
Customer#2 CANADA       

5 rows selected.

호환성

<order by clause>는 SQL 표준과 비교하여 다음과 같은 차이가 있다.

SQL 표준 호환성

Feature ID

설명

지원 여부

F850

Top-level <order by clause> in <query expression>

X

F851

<order by clause> in subqueries

O

F852

Top-level <order by clause> in views

O

F855

Nested <order by clause> in <query expression>

O

참조

관련 내용은 query expression을 참조한다.

offset limit clause

기능

검색 결과 중 skip 할 row의 개수와 fetch 할 row의 개수를 기술한다.

구문

<offset limit clause> ::=
      <result offset clause>
    | <fetch limit clause>
    | <result offset clause> <fetch limit clause>

<result offset clause> ::=
    OFFSET <offset row count> [ { ROW | ROWS } ]

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

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

<limit clause> ::=
    LIMIT { <fetch row count> | <offset row count> , <fetch row count> | ALL }

사용 범위 및 접근 권한

<offset limit clause>는 접근 권한을 필요로 하지 않는다.

구문 규칙 및 파라미터

<result offset clause>

<fetch limit clause>

<fetch first clause>

<limit clause>

설명

<result offset clause>

검색한 결과 중 <offset row count> 번째의 row부터 사용자에게 보낸다. 만약 <offset row count>가 검색한 결과 row의 개수와 같거나 크면 사용자에게 보내지는 결과의 개수는 0이다.

<fetch first clause>

검색한 결과 중에 <fetch row count> 개수만큼만 사용자에게 반환한다.

<limit clause>

LIMIT <fetch_row_count>로 사용된 경우 검색한 결과 중 <fetch row count> 개수만큼만 사용자에게 반환한다.

LIMIT <offset row count>, <fetch row count>로 사용한 경우, 검색한 결과 중 <offset row count> 번째의 row부터 <fetch row count> 개수만큼만 사용자에게 반환한다.

LIMIT ALL로 사용한 경우 개수 제한없이 검색한 결과를 사용자에게 반환한다.

사용 예

다음은 <result offset clause>을 사용한 SELECT 구문의 예이다.

gSQL> SELECT c_name, c_nation FROM customer OFFSET 1;

C_NAME     C_NATION
---------- -------------
Customer#2 CANADA
Customer#3 KOREA
Customer#4 GERMANY
Customer#5 UNITED STATES

4 rows selected.

다음은 <fetch first clause>을 사용한 SELECT 구문의 예이다.

gSQL> SELECT c_name, c_nation FROM customer FETCH FIRST ROW ONLY;

C_NAME     C_NATION
---------- --------
Customer#1 KOREA

1 row selected.

gSQL> SELECT c_name, c_nation FROM customer FETCH FIRST 2 ROW ONLY;

C_NAME     C_NATION
---------- --------
Customer#1 KOREA
Customer#2 CANADA

2 rows selected.

다음은 <limit clause>을 사용한 SELECT 구문의 예이다.

gSQL> SELECT c_name, c_nation FROM customer LIMIT 1;

C_NAME     C_NATION
---------- --------
Customer#1 KOREA

1 row selected.

gSQL> SELECT c_name, c_nation FROM customer LIMIT 1, 2;

C_NAME     C_NATION
---------- --------
Customer#2 CANADA
Customer#3 KOREA

2 rows selected.

gSQL> SELECT c_name, c_nation FROM customer LIMIT ALL;

C_NAME     C_NATION
---------- -------------
Customer#1 KOREA
Customer#2 CANADA
Customer#3 KOREA
Customer#4 GERMANY
Customer#5 UNITED STATES

5 rows selected.

다음은 <result offset clause>와 <fetch limit clause>를 사용한 SELECT 구문의 예이다.

gSQL> SELECT c_name, c_nation FROM customer OFFSET 1 FETCH 2;

C_NAME     C_NATION
---------- --------
Customer#2 CANADA
Customer#3 KOREA

2 rows selected.

gSQL> SELECT c_name, c_nation FROM customer OFFSET 1 LIMIT 2;

C_NAME     C_NATION
---------- --------
Customer#2 CANADA
Customer#3 KOREA

2 rows selected.

호환성

SQL 표준은 GOLDILOCKS와 비교하여 다음과 같은 차이가 있다.

OFFSET and LIMIT 구문

• SQL 표준은 OFFSET .. FETCH {FIRST|NEXT} ... 구문을 정의하고 있다.

• IBM DB2와 Postgres는 SQL 표준과 동일한 구문을 제공한다.

• Postgres와 MySQL은 OFFSET .. LIMIT 구문을 제공한다.

• Oracle은 ROWNUM column을 통해 유사한 기능을 수행할 수 있다.

SQL 표준 호환성

Feature ID

설명

지원 여부

F861

Top-level <result offset clause> in <query expression>

O

F862

<result offset clause> in subqueries

O

F863

Nested <result offset clause> in <query expression>

O

F864

Top-level <result offset clause> in views

O

F865

dynamic <offset row count> in <result offset clause>

X

set operator

기능

부질의 (subquery) 결과들에 대한 집합 (set) 연산을 수행한다.

구문

<set operator> ::=
      <set operator term>
    | <query expression body> UNION [ ALL | DISTINCT ] <set operator term>
    | <query expression body> EXCEPT [ ALL | DISTINCT ] <set operator term>
    | <query expression body> MINUS [ ALL | DISTINCT ] <set operator term>

<set operator term> ::=
      <query term>
    | <set operator term> INTERSECT [ ALL | DISTINCT ] <set operator term>

사용 범위 및 접근 권한

<set operator> 구문을 사용하려면 각 <set operator term>에 나타나는 <query expression>에 대한 모든 접근 권한이 있어야 한다.

구문 규칙 및 파라미터

<set operator>

<query term>

하나의 부질의 (subquery)를 기술한다.
자세한 내용은 query expression 절을 참조한다.

설명

<set operator>의 ALL과 DISTINCT의 차이

예를 들어 R1과 R2 table의 데이터가 다음과 같을 경우, 각 <set operator>의 결과는 다음과 같다.

SET 연산 결과

SET 연산 결과

연산자 우선 순위

<set operator>의 연산자 우선순위는 다음과 같다.

<set operator>의 결과 타입

<set operator> 모든 부질의의 i 번째 column은 동일한 계열의 데이터 타입이어야 하며, 결과 타입 조합 규칙에 따라 결과 타입이 결정된다.
단, LONG VARCHAR와 LONG VARBINARY 타입은 UNION ALL만 사용할 수 있다.

ORDER BY 구문

<set operator>를 ORDER BY와 함께 사용할 때 부질의 간에 column 이름이 다를 경우, 다음과 같이 사용할 수 있다.

사용 예

다음은 UNION 연산을 사용한 SELECT 구문의 예이다.

gSQL> SELECT s_nation nation FROM supplier UNION ALL SELECT c_nation FROM customer;

NATION
-------------
FRANCE
KOREA
GERMANY
UNITED STATES
CANADA
KOREA
CANADA
KOREA
GERMANY
UNITED STATES

10 rows selected.

gSQL> SELECT s_nation nation FROM supplier UNION DISTINCT SELECT c_nation FROM customer;

NATION
-------------
UNITED STATES
CANADA
KOREA
GERMANY
FRANCE

5 rows selected.

다음은 EXCEPT 연산을 사용한 SELECT 구문의 예이다.

gSQL> SELECT c_nation nation FROM customer EXCEPT ALL SELECT s_nation FROM supplier;

NATION
------
KOREA

1 row selected.

gSQL> SELECT c_nation nation FROM customer EXCEPT DISTINCT SELECT s_nation FROM supplier;

no rows selected.

다음은 INTERSECT 연산을 사용한 SELECT 구문의 예이다.

gSQL> SELECT c_nation nation FROM customer INTERSECT ALL SELECT s_nation FROM supplier;

NATION
-------------
UNITED STATES
CANADA
KOREA
GERMANY

4 rows selected.

gSQL> SELECT c_nation nation FROM customer INTERSECT DISTINCT SELECT s_nation FROM supplier;

NATION
-------------
UNITED STATES
CANADA
KOREA
GERMANY

4 rows selected.

호환성

<set operator>는 SQL 표준과 비교하여 다음과 같은 차이가 있다.

SQL 표준 호환성

Feature ID

설명

지원 여부

F302

INTERSECT table operator

O

F301

CORRESPONDING

X

T551

Optional key words for default syntax

O

F304

EXCEPT ALL table operator

O

참조

관련 내용은 query expression을 참조한다.

subquery

기능

<query expression>에서 파생되는 scalar value, row, table 등을 기술한다.

구문

<scalar subquery> ::=
    <subquery>

<row subquery> ::=
    <subquery>

<table subquery> ::=
    <subquery>

<subquery> ::=
    ( <query expression> )

사용 범위 및 접근 권한

<subquery>에 존재하는 <query expression>에 대한 접근 권한이 있어야 한다.

구문 규칙 및 파라미터

<scalar subquery>

<row subquery>

<table subquery>

설명

<scalar subquery>

<scalar subquery>는 결과값으로 한 개의 column을 갖는 한 개의 row를 반환하는 subquery이다. <scalar subquery>의 target은 하나만 존재해야 하며, 결과의 data type은 target의 data type을 따른다.

<scalar subquery>는 <select list>의 target에 단독으로 쓰일 수 있으며, 단일 column만 갖는 연산자에 쓰일 수 있다.

<row subquery>

<row subquery>는 결과값으로 두 개 이상의 column을 갖는 한 개의 row를 반환하는 subquery이다. <row subquery>의 target은 두 개 이상 존재해야 하며, 결과의 data type은 target들 각각의 data type을 따른다.

<row subquery>는 <select list>의 target에 단독으로 쓰일 수 없으며, 둘 이상의 column을 갖는 row 연산자에만 쓰일 수 있다.

<table subquery>

<table subquery>는 결과값으로 한 개 이상의 column을 갖는 한 개 이상의 row를 반환하는 subquery이다. <table subquery>의 target은 한 개 이상 존재해야 하며, 결과의 data type은 target들 각각의 data type을 따른다.

<table subquery>는 <select list>의 target에 단독으로 쓰일 수 없으며, IN, NOT IN, EXISTS, NOT EXISTS, quantify operator 등의 연산자에 쓰일 수 있다.

사용 예

다음은 <scalar subquery>를 사용한 SELECT 구문의 예이다.

gSQL> SELECT (SELECT c_name FROM dual)  FROM customer;

(SELECT C_NAME FROM DUAL)
-------------------------
Customer#1
Customer#2
Customer#3
Customer#4
Customer#5

5 rows selected.

gSQL> SELECT c_name, c_nation FROM customer WHERE c_nation = (SELECT 'CANADA' FROM dual);

C_NAME     C_NATION
---------- --------
Customer#2 CANADA

1 row selected.

다음은 <row subquery>를 사용한 SELECT 구문의 예이다.

gSQL> SELECT p_name, p_brand, p_type FROM part WHERE (p_brand, p_type) = (SELECT 'Brand#1', 'NICKEL' FROM dual);

P_NAME P_BRAND    P_TYPE
------ ---------- ------
Part#2 Brand#1    NICKEL

1 row selected.

다음은 <table subquery>를 사용한 SELECT 구문의 예이다.

gSQL> SELECT s_name, s_nation FROM supplier WHERE s_nation IN (SELECT c_nation FROM customer);

S_NAME                    S_NATION
------------------------- -------------
Supplier#2                KOREA
Supplier#3                GERMANY
Supplier#4                UNITED STATES
Supplier#5                CANADA

4 rows selected.

gSQL> SELECT * FROM (SELECT s_name, s_nation FROM supplier);

S_NAME                    S_NATION
------------------------- -------------
Supplier#1                FRANCE
Supplier#2                KOREA
Supplier#3                GERMANY
Supplier#4                UNITED STATES
Supplier#5                CANADA

5 rows selected.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

F471

Scalar subquery values

O

F641

Row and table constructors

X

T501

Enhanced EXISTS predicate

O

E061-11

Subqueries in IN predicate

O

E061-12

Subqueries in quantified comparison predicate

O

E061-12

Correlated subqueries

O

참조

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

hint clause

기능

Query를 수행할 때 사용할 hint를 기술한다.

구문

<hint clause> ::=
    /*+ <hint element> [ comment ] [ [ , ] <hint element> [ comment ] ] */

<hint element> ::=
      <access path hints>
    | <join order hints>
    | <join operation hints>
    | <query transformation hints>
    | <other hints>

<access_path_hints> ::=
      FULL( table_name )
    | INDEX( table_name [ , ] [ index_name [ [ , ] index_name ] ] )
    | NO_INDEX( table_name [ , ] [ index_name [ [ , ] index_name ] ] )
    | INDEX_ASC( table_name [ , ] [ index_name [ [ , ] index_name ] ] )
    | INDEX_DESC( table_name [ , ] [ index_name [ [ , ] index_name ] ] )
    | INDEX_COMBINE( table_name [ , ] [ index_name [ [ , ] index_name ] ] )
    | ROWID( table_name )

<join order hints> ::=
      ORDERED
    | ORDERING( table_name [ LEFT | RIGHT ] [ , table_name [ LEFT | RIGHT ] ]
    | LEADING( table_name [ [ , ] table_name ] )

<join operation hints> ::=
      USE_HASH( table_name [ [ , ] table_name ] )
    | NO_USE_HASH( table_name [ [ , ] table_name ] )
    | USE_MERGE( table_name [ [ , ] table_name ] )
    | NO_USE_MERGE( table_name [ [ , ] table_name ] )
    | USE_NL( table_name [ [ , ] table_name ] )
    | NO_USE_NL( table_name [ [ , ] table_name ] )
    | USE_INL( table_name [ [ , ] table_name ] )
    | NO_USE_INL( table_name [ [ , ] table_name ] )

<query transformation hints> ::=
      UNNEST
    | NO_UNNEST
    | NL_SJ
    | NL_ISJ
    | MERGE_SJ
    | HASH_SJ
    | HASH_ISJ
    | HASH_AJ
    | TRANSITIVE_CLOSURE
    | NO_TRANSITIVE_CLOSURE
    | MERGE( view_name ) 
    | NO_MERGE( view_name ) 
    | NO_QUERY_TRANSFORMATION

<other hints> ::=
      PUSH_SUBQ
    | NO_PUSH_SUBQ

사용 범위 및 접근 권한

<hint clause> 구문을 수행하려면 사용자에게 query를 수행할 수 있는 권한이 필요하다.

구문 규칙 및 파라미터

<hint clause> 사용의 기본 구문 규칙은 다음과 같다.

<access_path_hints>

FULL

Optimizer로 하여금 기술한 table에 대하여 table full scan 하도록 지시한다. 이 hint가 기술된 경우, optimizer는 해당 table에 대하여 index scan을 이용한 최적화나 rowid scan을 이용한 최적화, index combine을 이용하는 최적화 등을 고려하지 않는다.

FULL hint를 기술할 때 table name을 반드시 기술해야 하는데 table name은 하나만 기술할 수 있다. 또한 기술된 table name은 <from clause>에 반드시 존재해야 한다.

다음은 T1 table에 대하여 table full scan 하도록 하는 hint를 적용하는 예이다.

SELECT /*+ FULL(T1) */ I1
  FROM T1;
SELECT /*+ FULL(T1_ALIAS) */ I1
  FROM T1 T1_ALIAS;
INDEX

Optimizer로 하여금 기술한 table에 대하여 index scan 하도록 지시한다. 이 hint가 기술된 경우, optimizer는 해당 table에 대하여 table scan을 이용한 최적화나 다른 index에 의한 index scan을 이용한 최적화, rowid scan을 이용한 최적화, index combine을 이용한 최적화 등을 고려하지 않는다.

INDEX hint를 기술할 때는 table name이 <from clause>에 존재해야 하며, index name도 해당 table에 존재하는 index의 이름이어야 한다.

Index name은 하나 이상 기술하거나 생략할 수도 있다. Index name을 생략한 경우에는 해당 table에 속한 모든 index들을 대상으로 한다.

만약 index name을 둘 이상 나열하거나 index가 둘 이상인 table에 대하여 index name을 생략한 경우에는 optimizer가 해당 index들의 index scan cost를 계산하여 최적의 index scan 방법을 선택한다.

다음은 T1 table을 index scan 하도록 hint를 적용한 예이다.

SELECT /*+ INDEX(T1, T1_PK_INDEX) */ I1
  FROM T1;
SELECT /*+ INDEX(T1, T1_PK_INDEX T1_UNIQUE_INDEX) */ I1
  FROM T1;
SELECT /*+ INDEX(T1) */ I1
  FROM T1;
NO_INDEX

Optimizer로 하여금 기술한 table에서 index name에 해당하는 index들을 index scan 하지 않도록 지시한다. 이 hint가 기술되면 optimizer는 해당 table에 대하여 기술된 index들에 대해 index scan을 이용하여 최적화하는 것을 고려하지 않는다.

NO_INDEX hint를 기술할 때 table name은 <from clause>에 존재해야 하며, index name도 해당 table에 존재하는 index의 이름이어야 한다.

Index name은 하나 이상 기술하거나 생략할 수도 있으며, index name을 생략한 경우에는 optimizer가 해당 table에 대한 index scan을 고려하지 않는다.

NO_INDEX hint에 기술되지 않은 index들이 존재할 경우, optimizer가 해당 index들의 index scan cost를 계산하고, table scan cost와 rowid scan cost들까지 고려하여 최적의 scan 방법을 선택한다.

다음은 T1 table에 대하여 NO_INDEX hint를 적용한 예이다.

SELECT /*+ NO_INDEX(T1, T1_PK_INDEX) */ I1
  FROM T1;
SELECT /*+ NO_INDEX(T1, T1_PK_INDEX T1_UNIQUE_INDEX) */ I1
  FROM T1;
SELECT /*+ NO_INDEX(T1) */ I1
  FROM T1;
INDEX_ASC

Optimizer로 하여금 기술한 table에서 ascending index scan 하도록 지시한다. 이 hint가 기술되면 optimizer는 해당 table에 대하여 table scan을 이용한 최적화나 다른 index에 의한 index scan을 이용한 최적화, rowid scan을 이용한 최적화, index combine을 이용한 최적화 등을 고려하지 않는다.

만약 선택된 index scan의 index가 ascending order로 구성되어 있다면 ascending order로, index가 descending order로 구성되어 있다면 descending order로 index를 scan한다.

INDEX_ASC hint에 대한 구문 규칙은 INDEX hint와 동일하다.

INDEX_DESC

Optimizer로 하여금 기술한 table에서 descending index scan 하도록 지시한다. 이 hint가 기술되면 optimizer는 해당 table에 대하여 table scan을 이용한 최적화나 다른 index에 의한 index scan을 이용한 최적화, rowid scan을 이용한 최적화, index combine을 이용한 최적화 등을 고려하지 않는다.

만약 선택된 index scan의 index가 ascending order로 구성되어 있다면 descending order로, index가 descending order로 구성되어 있다면 ascending order로 index를 scan한다.

INDEX_DESC hint에 대한 구문 규칙은 INDEX hint와 동일하다.

INDEX_COMBINE

Optimizer로 하여금 기술한 table에 대해 or 구문을 분리하여 각각 index scan을 수행한 후 결과들을 합치도록 지시한다. 이 hint가 기술되면 index combine을 이용한 최적화를 우선적으로 고려하며, 만약 index combine이 가능하지 않을 경우, table scan이나 index scan, rowid scan 등에 대한 cost를 계산하여 최적의 scan 방법을 선택한다.

INDEX_COMBINE hint를 기술할 때 table name이 <from clause>에 존재해야 하며, index name도 해당 table에 존재하는 index의 이름이어야 한다.

Index name은 하나 이상 기술할 수 있고 생략도 가능하다. Index name을 생략할 경우에는 해당 table에 속한 모든 index들을 대상으로 한다.

INDEX_COMBINE hint를 수행하려면 해당 table을 scan하기 위한 조건에 or 구문이 반드시 존재해야 한다. 만약 or 구문이 존재하지 않으면 optimizer가 해당 hint를 무시하며, 이 경우 table scan, index scan, rowid scan에 대한 cost를 계산하여 최적의 scan 방법을 선택한다.

Index name을 둘 이상 나열하거나 index가 둘 이상인 table에 대하여 index name을 생략할 경우 optimizer가 각 or 구문에 대하여 해당 index들의 index scan cost를 계산하여 최적의 index scan을 선택한다. 따라서 or 구문으로 분리된 조건들에 의해 각각 다른 index를 사용하는 index scan을 선택할 수 있다.

다음은 T1 table을 index combine 하도록 hint를 적용한 예이다.

SELECT /*+ INDEX_COMBINE(T1, T1_PK_INDEX) */ I1
  FROM T1
 WHERE I1 = 1
    OR I1 = 2;
SELECT /*+ INDEX_COMBINE(T1, T1_PK_INDEX T1_UNIQUE_INDEX) */ I1
  FROM T1
 WHERE I1 = 1
    OR I2 = 2;
SELECT /*+ INDEX_COMBINE(T1) */ I1
  FROM T1
 WHERE I1 = 1
    OR I2 = 2;
SELECT /*+ INDEX_COMBINE(T1, T1_PK_INDEX) */ I1
  FROM T1
 WHERE I1 = 1;
ROWID

Optimizer로 하여금 기술한 table에 대하여 rowid scan 하도록 지시한다. 이 hint가 기술되면 rowid scan을 이용한 최적화를 우선적으로 고려하며, 만약 rowid scan이 가능하지 않을 경우, table scan이나 index scan, index combine 등에 대한 cost를 계산하여 최적의 scan 방법을 선택한다.

ROWID hint를 기술할 때 table name을 반드시 기술해야 하는데 table name은 하나만 기술할 수 있다. 또한 기술된 table name은 반드시 <from clause>에 존재해야 한다.

ROWID hint를 수행하려면 해당 table을 scan하기 위한 조건에 ROWID를 이용한 equal 조건이 반드시 존재해야 한다. 만약 존재하지 않으면 optimizer가 해당 hint를 무시하며, 이 경우 table scan과 index scan, index combine에 대한 cost를 계산하여 최적의 scan 방법을 선택한다.

다음은 T1 table을 rowid scan 하도록 hint를 적용한 예이다.

SELECT /*+ ROWID(T1) */ I1
  FROM T1
 WHERE ROWID = 'AAAAAAAAADXAACAAAGAlAAA';
SELECT /*+ ROWID(T1_ALIAS) */ I1
  FROM T1 T1_ALIAS
 WHERE ROWID = 'AAAAAAAAADXAACAAAGAlAAA';
SELECT /*+ ROWID(T1) */ I1
  FROM T1
 WHERE I1 = 1;

<join_order_hints>

ORDERED

Optimizer로 하여금 <from clause>에 기술한 순서대로 table들을 join 하도록 지시한다. 이 hint는 <from clause>에 ','로 구분된 table들을 기술하거나 inner join으로 table들을 기술하는 경우에만 적용할 수 있다.

다음은 T1, T2 table에 대한 join에 ORDERED hint를 적용한 예이다.

SELECT /*+ ORDERED */ *
  FROM T1, T2
 WHERE T1.I1 = T2.I1;
SELECT /*+ ORDERED */ *
  FROM T1 INNER JOIN T2 ON T1.I1 = T2.I1;
SELECT /*+ ORDERED */ *
  FROM T1 LEFT OUTER JOIN T2 ON T1.I1 = T2.I1;
ORDERING

Optimizer로 하여금 이 hint에 기술된 table들을 순서대로 join 하도록 지시한다. 이 hint는 <from clause>에 ','로 구분된 table들을 기술하거나 inner join으로 table들을 기술하는 경우에만 적용할 수 있다.

ORDERING hint는 각 table에 위치 지정 옵션을 기술할 수 있는데 첫 번째와 두 번째 table에 대해서는 기술할 수 없고 세 번째 table부터 기술할 수 있다. 첫 번째와 두 번째 table의 위치는 ORDERING hint에 기술된 순서에 따라 결정된다. 위치 지정 옵션에는 LEFT와 RIGHT가 있는데 LEFT는 해당 table을 join의 left node (outer node)에 위치하도록 하며, RIGHT는 해당 table을 join의 right node (inner node)로 위치하도록 한다.

만약 table에 위치 지정 옵션을 기술한 경우, 해당 table은 기술된 위치에 고정된 채로 join을 수행한다. Table에 위치 지정 옵션을 기술하지 않은 경우, optimizer가 해당 table을 left node (outer node)에 배치하는 경우와 right node (inner node)에 배치하는 경우에 대해 각각의 cost를 계산하여 최적의 join 순서를 선택한다.

다음은 T1, T2, T3 table들의 join에 대하여 ORDERING hint를 적용한 예이다.

SELECT /*+ ORDERING(T2, T3, T1) */ *
  FROM T1, T2, T3
 WHERE T1.I1 = T2.I1
   AND T2.I2 = T3.I2;
SELECT /*+ ORDERING(T2, T3, T1) */ *
  FROM (T1 INNER JOIN T2 ON T1.I1 = T2.I1) INNER JOIN T3 ON T2.I2 = T3.I2;
SELECT /*+ ORDERING(T2, T3, T1 LEFT) */ *
  FROM T1, T2, T3
 WHERE T1.I1 = T2.I1
   AND T2.I2 = T3.I2;
SELECT /*+ ORDERING(T1, T2) */ *
  FROM T1 LEFT OUTER JOIN T2 ON T1.I1 = T2.I1;
SELECT /*+ ORDERING(T2 RIGHT, T3, T1) */ *
  FROM T1, T2, T3
 WHERE T1.I1 = T2.I1
   AND T2.I2 = T3.I2;
LEADING

Optimizer로 하여금 이 hint에 기술된 table들을 순서대로 join 하도록 지시한다. 이 hint는 <from clause>에 ','로 구분된 table들을 기술하거나 inner join으로 table들을 기술하는 경우에만 적용할 수 있다.

LEADING hint는 ORDERING hint와 달리 위치를 지정할 수 없기 때문에 join에 참여하는 table 순서만 지정할 수 있다. 따라서 첫 번째와 두 번째 table은 순서에 따라 각각 left node (outer node)와 right node (inner node)에 배치되며, 세 번째 table부터는 optimizer가 해당 table을 left node (outer node)에 배치하는 경우와 right node (inner node)에 배치하는 경우의 cost를 계산하여 둘 중 더 좋은 위치에 배치한다.

다음은 T1, T2, T3 table들의 join에 대하여 LEADING hint를 적용한 예이다.

SELECT /*+ LEADING(T2, T3, T1) */ *
  FROM T1, T2, T3
 WHERE T1.I1 = T2.I1
   AND T2.I2 = T3.I2;
SELECT /*+ LEADING(T2, T3, T1) */ *
  FROM (T1 INNER JOIN T2 ON T1.I1 = T2.I1) INNER JOIN T3 ON T2.I2 = T3.I2;
SELECT /*+ LEADING(T1, T2) */ *
  FROM T1 LEFT OUTER JOIN T2 ON T1.I1 = T2.I1;

<join operation_hints>

USE_HASH

Join을 수행할 때 이 hint에 기술한 table이 포함될 경우, optimizer로 하여금 hash join 기법으로 join 하도록 한다. 이 hint는 모든 join type에 적용할 수 있다.

USE_HASH hint에는 하나 이상의 table을 기술해야 하며, 동일한 table을 둘 이상 기술할 수 없다. 이 hint에 기술된 table은 USE_MERGE, USE_NL, USE_INL 등의 hint에 기술되면 안된다. 기술하는 경우 "hint_error" property가 on이면 validation error로 처리되며, off이면 먼저 기술된 hint가 적용된다. 또한 join에 참여하는 두 table에 대하여 각각 다른 join operation hint가 기술되면 left node (outer node)에 기술된 hint가 우선 적용된다.

USE_HASH hint에 기술된 table이 join에 참여하는 경우 join 조건에 hash join이 가능한 조건 (equi-join이어야 하고 비교 가능한 column이어야 함)이 존재해야 한다. 만약 hash join이 가능한 조건이 존재하지 않을 경우, optimizer가 해당 hint를 무시하고 cost 계산을 통해 최적의 join operation을 선택한다.

다음은 T1, T2 table들의 join에 대하여 USE_HASH hint를 적용한 예이다.

SELECT /*+ USE_HASH(T1) */ *
  FROM T1, T2
 WHERE T1.I1 = T2.I1;
SELECT /*+ ORDERED USE_HASH(T1) USE_MERGE(T2) */ *
  FROM T1, T2
 WHERE T1.I1 = T2.I1;
SELECT /*+ USE_HASH(T1, T2) */ *
  FROM T1, T2
 WHERE T1.I1 < T2.I1;
NO_USE_HASH

Join을 수행할 때 이 hint에 기술한 table이 포함될 경우, optimizer로 하여금 hash join 기법을 제외한 나머지 기법 중 하나를 선택하여 join 하도록 한다. 이 hint는 모든 join type에 적용할 수 있다.

NO_USE_HASH hint에는 하나 이상의 table을 기술해야 하며, 동일한 table을 둘 이상 기술할 수 없다. 이 hint에 기술된 table은 USE_HASH hint를 제외한 다른 join operation hint에 기술할 수 있다. 이 hint에 기술된 table이 USE_HASH hint에 기술되고 "hint_error" property가 on인 경우 validation error로 처리되며, off인 경우 먼저 기술된 hint가 적용된다. 또한 join에 참여하는 두 table에 각각 다른 join operation hint가 기술되면 left node (outer node)에 기술된 hint가 우선 적용된다.

NO_USE_HASH hint에 기술된 table이 join에 참여하는 경우, optimizer가 hash join을 제외한 나머지 join operation 기법들에 대한 cost를 계산하여 그 중 최적의 join operation을 선택한다.

다음은 T1, T2 table들의 join에 대하여 NO_USE_HASH hint를 적용한 예이다.

SELECT /*+ NO_USE_HASH(T1) */ *
  FROM T1, T2
 WHERE T1.I1 = T2.I1;
SELECT /*+ NO_USE_HASH(T1) USE_MERGE(T2) */ *
  FROM T1, T2
 WHERE T1.I1 = T2.I1;
USE_MERGE

Join을 수행할 때 이 hint에 기술한 table이 포함될 경우, optimizer로 하여금 merge join 기법으로 join 하도록 한다. 이 hint는 모든 join type에 적용할 수 있다.

USE_MERGE hint에는 하나 이상의 table을 기술해야 하며, 동일한 table을 둘 이상 기술할 수 없다. 이 hint에 기술된 table은 USE_HASH, USE_NL, USE_INL 등의 hint에 기술되면 안된다. 기술하는 경우 "hint_error" property가 on이면 validation error로 처리되며, off이면 먼저 기술된 hint가 적용된다. 또한 join에 참여하는 두 table에 각각 다른 join operation hint가 기술되면 left node (outer node)에 기술된 hint가 우선 적용된다.

USE_MERGE hint에 기술된 table이 join에 참여하는 경우, join 조건에 merge join이 가능한 조건 (equi-join이어야 하고 비교 가능한 column이어야 함)이 존재해야 하며, 만약 merge join이 가능한 조건이 존재하지 않을 경우, optimizer가 해당 hint를 무시하고 cost를 계산하여 최적의 join operation을 선택한다.

다음은 T1, T2 table들의 join에 대하여 USE_MERGE hint를 적용한 예이다.

SELECT /*+ USE_MERGE(T1) */ *
  FROM T1, T2
 WHERE T1.I1 = T2.I1;
SELECT /*+ ORDERED USE_MERGE(T1) USE_HASH(T2) */ *
  FROM T1, T2
 WHERE T1.I1 = T2.I1;
SELECT /*+ USE_MERGE(T1, T2) */ *
  FROM T1, T2
 WHERE T1.I1 < T2.I1;
NO_USE_MERGE

Join을 수행할 때 이 hint에 기술한 table이 포함될 경우, optimizer로 하여금 merge join 기법을 제외한 나머지 기법 중 하나를 선택하여 join 하도록 한다. 이 hint는 모든 join type에 적용할 수 있다.

NO_USE_MERGE hint에는 하나 이상의 table을 기술해야 하며, 동일한 table을 둘 이상 기술할 수 없다. 이 hint에 기술된 table은 USE_MERGE hint를 제외한 다른 join operation hint에 기술할 수 있다. 이 hint에 기술된 table이 USE_MERGE hint에 기술된 경우 "hint_error" property가 on이면 validation error로 처리되며, off이면 먼저 기술된 hint가 적용된다. 또한 join에 참여하는 두 table에 각각 다른 join operation hint가 기술되면 left node (outer node)에 기술된 hint가 우선 적용된다.

NO_USE_MERGE hint에 기술된 table이 join에 참여하는 경우, optimizer가 merge join을 제외한 나머지 join operation 기법들의 cost를 계산하여 최적의 join operation을 선택한다.

다음은 T1, T2 table들의 join에 대하여 NO_USE_MERGE hint를 적용한 예이다.

SELECT /*+ NO_USE_MERGE(T1) */ *
  FROM T1, T2
 WHERE T1.I1 = T2.I1;
SELECT /*+ NO_USE_MERGE(T1) USE_HASH(T2) */ *
  FROM T1, T2
 WHERE T1.I1 = T2.I1;
USE_NL

Join을 수행할 때 이 hint에 기술한 table이 포함되면 optimizer로 하여금 nested loops join 기법으로 join하도록 한다. 이 hint는 모든 join type에 적용할 수 있다.

USE_NL hint에는 하나 이상의 table을 기술해야 하며, 동일한 table을 둘 이상 기술할 수 없다. 이 hint에 기술된 table이 USE_HASH, USE_MERGE, USE_INL 등의 hint에 기술되면 안되며, 기술된 경우 "hint_error" property가 on이면 validation error로 처리되며, off이면 먼저 기술된 hint가 적용된다. 또한 join에 참여하는 두 table에 각각 다른 join operation hint가 기술되면 left node (outer node)에 기술된 hint가 우선 적용된다.

Nested loops join은 hash join이나 merge join과 다르게 어떠한 제약도 없이 join할 수 있는 기법이다.

다음은 T1, T2 table들의 join에 대하여 USE_NL hint를 적용한 예이다.

SELECT /*+ USE_NL(T1) */ *
  FROM T1, T2
 WHERE T1.I1 = T2.I1;
SELECT /*+ ORDERED USE_NL(T1) USE_HASH(T2) */ *
  FROM T1, T2
 WHERE T1.I1 = T2.I1;
NO_USE_NL

Join을 수행할 때 이 hint에 기술한 table이 포함될 경우, optimizer로 하여금 nested loops join 기법을 제외한 나머지 기법 중 하나를 선택하여 join 하도록 한다. 이 hint는 모든 join type에 적용할 수 있다.

NO_USE_NL hint에는 하나 이상의 table을 기술해야 하며, 동일한 table을 둘 이상 기술할 수 없다. 이 hint에 기술된 table은 USE_NL hint를 제외한 다른 join operation hint에도 기술할 수 있다. 이 hint에 기술된 table이 USE_NL hint에 기술된 경우, "hint_error" property가 on이면 validation error로 처리되며, off이면 먼저 기술된 hint가 적용된다. 또한 join에 참여하는 두 table에 각각 다른 join operation hint가 기술되면 left node (outer node)에 기술된 hint가 우선 적용된다.

NO_USE_NL hint에 기술된 table이 join에 참여하는 경우 optimizer가 nested loops join을 제외한 나머지 join operation 기법들의 cost를 계산하여 최적의 join operation을 선택한다. 단, 제약때문에 다른 join operation 기법들을 사용할 수 없는 경우, optimizer가 이 hint를 무시하고 nested loops join을 이용한 기법을 선택한다.

다음은 T1, T2 table들의 join에 대하여 NO_USE_NL hint를 적용한 예이다.

SELECT /*+ NO_USE_NL(T1) */ *
  FROM T1, T2
 WHERE T1.I1 = T2.I1;
SELECT /*+ NO_USE_NL(T1) USE_HASH(T2) */ *
  FROM T1, T2
 WHERE T1.I1 = T2.I1;
SELECT /*+ NO_USE_NL(T1) */ *
  FROM T1, T2
 WHERE T1.I1 < T2.I1;
USE_INL

Join을 수행할 때 이 hint에 기술한 table이 포함될 경우, optimizer로 하여금 sort instant를 이용한 nested loops join 기법으로 join 하도록 한다. 이 hint는 <from clause>에 ','로 구분된 table들을 기술하거나 inner join으로 table들을 기술하는 경우에만 적용할 수 있다.

USE_INL hint에는 하나 이상의 table을 기술해야 하며, 동일한 table을 둘 이상 기술할 수 없다. 이 hint에 기술된 table은 USE_HASH, USE_MERGE, USE_NL 등의 hint에 기술되면 안되며, 기술하는 경우 "hint_error" property가 on이면 validation error로 처리되며, off이면 먼저 기술된 hint가 적용된다. 또한 join에 참여하는 두 table에 각각 다른 join operation hint가 기술되면 left node (outer node)에 기술된 hint가 우선 적용된다.

Sort instant를 이용한 nested loops join은 sort key가 right node (inner node)의 table에 대한 조인 조건을 만족하는 expression들인 sort instant를 생성하여 join하는 방법이다. 이 때 sort key는 key compare가 가능한 type이어야 한다. 조인 조건에 해당하는 expression들이 모두 key compare가 불가능한 type인 경우, 이 기법은 적용할 수 없다. 이 경우, 다른 join operation 기법들의 cost를 계산하여 최적의 기법을 적용한다.

다음은 T1, T2 table들의 join에 대하여 USE_INL hint를 적용한 예이다.

SELECT /*+ USE_INL(T1) */ *
  FROM T1, T2
 WHERE T1.I1 = T2.I1;
SELECT /*+ ORDERED USE_INL(T1) USE_HASH(T2) */ *
  FROM T1, T2
 WHERE T1.I1 = T2.I1;
NO_USE_INL

Join을 수행할 때 이 hint에 기술한 table이 포함될 경우, optimizer로 하여금 sort instant를 이용한 nested loops join 기법을 제외한 나머지 기법 중 하나를 선택하여 join 하도록 한다. 이 hint는 모든 join type에 적용할 수 있다.

NO_USE_INL hint에는 하나 이상의 table을 기술해야 하며, 동일한 table을 둘 이상 기술할 수 없다. 이 hint에 기술된 table은 USE_INL hint를 제외한 다른 join operation hint에 기술할 수 있다. 이 hint에 기술된 table이 USE_INL hint에 기술된 경우 "hint_error" property가 on이면 validation error로 처리되며, off이면 먼저 기술된 hint가 적용된다. 또한 join에 참여하는 두 table에 각각 다른 join operation hint가 기술되면 left node (outer node)에 기술된 hint가 우선 적용된다.

NO_USE_INL hint에 기술된 table이 join에 참여하는 경우, optimizer가 sort instant를 이용한 nested loops join을 제외한 나머지 join operation 기법들의 cost를 계산하여 최적의 join operation을 선택한다.

다음은 T1, T2 table들의 join에 대하여 NO_USE_INL hint를 적용한 예이다.

SELECT /*+ NO_USE_INL(T1) */ *
  FROM T1, T2
 WHERE T1.I1 = T2.I1;
SELECT /*+ NO_USE_INL(T1) USE_HASH(T2) */ *
  FROM T1, T2
 WHERE T1.I1 = T2.I1;

<query_transformation_hints>

UNNEST

Optimizer로 하여금 subquery에 대하여 동일한 결과를 보장하는 join 구문으로 변경하도록 한다. 이는 subquery를 별도로 수행하지 않고 상위 레벨 query와의 join을 이용하여 처리함으로써 subquery가 반복적으로 수행되는 것을 방지한다.

UNNEST hint는 subquery의 <hint clause>에만 기술할 수 있으며 해당 subquery에만 적용될 뿐 하위 subquery들에는 적용되지 않는다. 만약 다수의 subquery가 존재할 때 이를 모두 unnest하고 싶은 경우에는 해당 subquery 모두에 UNNEST hint를 기술하여야 하며, subquery 내부에 존재하는 subquery에 대하여 unnest하고 싶은 경우에는 해당 subquery에 UNNEST hint를 기술하여야 한다.

UNNEST hint가 NO_QUERY_TRANSFORMATION hint와 함께 기술된 경우, NO_QUERY_TRANSFORMATION hint 때문에 UNNEST hint가 무시된다.

UNNEST hint는 NO_UNNEST hint와 동시에 사용할 수 없다. 동시에 사용하는 경우 "hint_error" property를 on으로 설정하면 validation error로 처리되며, off로 설정하면 먼저 기술한 hint가 적용된다.

다음은 UNNEST hint를 이용하여 subquery의 unnesting을 적용한 예이다.

SELECT *
  FROM T1
 WHERE I1 IN ( SELECT /*+ UNNEST */ I1
                 FROM T2 );
SELECT *
  FROM T1
 WHERE I1 IN ( SELECT /*+ UNNEST NO_QUERY_TRANSFORMATION */ I1
                 FROM T2 );
NO_UNNEST

Optimizer로 하여금 subquery를 unnesting을 하지 않고 filter로 처리하도록 한다. 이는 필요할 때마다 매번 subquery를 수행한다.

NO_UNNEST hint는 subquery의 <hint clause>에만 기술할 수 있으며, 해당 subquery에만 적용될 뿐 하위 subquery들에는 적용되지 않는다. 만약 다수의 subquery가 존재할 때 이를 모두 unnest하고 싶지 않은 경우에는 해당 subquery 모두에 NO_UNNEST hint를 기술하여야 하며, subquery 내부에 존재하는 subquery에 대하여 unnest하고 싶지 않은 경우에는 해당 subquery에 NO_UNNEST hint를 기술하여야 한다.

NO_UNNEST hint가 NO_QUERY_TRANSFORMATION hint와 함께 기술된 경우 NO_QUERY_TRANSFORMATION hint 때문에 NO_UNNEST hint가 무시된다.

NO_UNNEST hint는 UNNEST hint와 동시에 사용할 수 없다. 동시에 사용하는 경우 "hint_error" property를 on으로 설정하면 validation error로 처리되며, off로 설정하면 먼저 기술한 hint가 적용된다.

다음은 NO_UNNEST hint를 이용하여 subquery의 no unnesting을 적용한 예이다.

SELECT *
  FROM T1
 WHERE I1 IN ( SELECT /*+ NO_UNNEST */ I1
                 FROM T2 );
NL_SJ

Optimizer로 하여금 subquery를 nested loops semi join으로 처리하도록 한다. 이는 subquery를 동일한 결과를 갖는 semi join 형태로 풀어낸다.

NL_SJ는 EXISTS, IN, ANY quantify 연산자에 사용할 수 있으며, NOT EXISTS, NOT IN, ALL quantify 연산자에는 사용할 수 없다.

NL_SJ hint는 해당 subquery를 semi join 형태로 풀어내기 때문에 anti-semi join 형태로만 풀릴 수 있는 subquery에 기술한 경우 optimizer가 이 hint를 무시한다.

다음은 NL_SJ hint를 이용하여 subquery를 join 형태로 풀어낸 예이다.

SELECT *
  FROM T1
 WHERE I1 IN ( SELECT /*+ NL_SJ */ I1
                 FROM T2 );
SELECT *
  FROM T1
 WHERE EXISTS ( SELECT /*+ NL_SJ */ I1
                  FROM T2
                 WHERE T1.I1 = T2.I1 );
SELECT *
  FROM T1
 WHERE I1 < ANY ( SELECT /*+ NL_SJ */ I1
                    FROM T2 );
SELECT *
  FROM T1
 WHERE I1 NOT IN ( SELECT /*+ NL_SJ */ I1
                     FROM T2 );
NL_ISJ

Optimizer로 하여금 subquery를 nested loops inverted semi join으로 처리하도록 한다. 이는 subquery를 동일한 결과를 갖는 inverted semi join 형태로 풀어낸다.

Inverted semi join은 right node (inner node)에 semi join을 위한 key를 unique sort key로 갖는 sort instant를 생성하여 역으로 left node (outer node)에서 해당 key와 일치하는 레코드를 찾는 semi join 방법이다.

NL_ISJ hint는 right node (inner node)가 semi join을 위한 key와 많이 중복되고, left node (outer node)에서 해당 key로 index scan을 할 수 있는 경우에 유용하다. Optimizer는 semi join을 위한 key를 left node (outer node)에서 index scan 할 수 없는 경우에 hint를 무시한다. 또한, semi join을 위한 key를 key compare 할 수 없는 경우에도 이 hint를 무시한다.

NL_ISJ는 EXISTS, IN, = ANY quantify 연산자에 사용할 수 있고 NOT EXISTS, NOT IN, ALL quantify 연산자 또는 = ANY를 제외한 ANY quantify 연산자에는 사용할 수 없다.

NL_ISJ hint는 해당 subquery를 semi join 형태로 풀어내기 때문에 anti-semi join 형태로만 풀릴 수 있는 subquery에 기술한 경우, optimizer가 이 hint를 무시한다.

다음은 NL_ISJ hint를 이용하여 subquery를 join 형태로 풀어낸 예이다.

SELECT *
  FROM T1
 WHERE I1 IN ( SELECT /*+ NL_ISJ */ I1
                 FROM T2 );
SELECT *
  FROM T1
 WHERE EXISTS ( SELECT /*+ NL_ISJ */ I1
                  FROM T2
                 WHERE T1.I1 = T2.I1 );
SELECT *
  FROM T1
 WHERE I1 = ANY ( SELECT /*+ NL_ISJ */ I1
                    FROM T2 );
SELECT *
  FROM T1
 WHERE I1 NOT IN ( SELECT /*+ NL_ISJ */ I1
                     FROM T2 );
MERGE_SJ

Optimizer로 하여금 subquery를 merge semi join으로 처리하도록 한다. 이는 subquery를 동일한 결과를 갖는 semi join 형태로 풀어낸다.

MERGE_SJ는 EXISTS, IN, = ANY quantify 연산자에 사용할 수 있고 NOT EXISTS, NOT IN, ALL quantify 연산자, = ANY를 제외한 ANY quantify 연산자에는 사용할 수 없다.

MERGE_SJ hint는 해당 subquery를 semi join 형태로 풀어내기 때문에 anti-semi join 형태로만 풀릴 수 있는 subquery에 기술한 경우, optimizer가 이 hint를 무시한다. 또한, merge semi join에 사용할 key를 key compare 할 수 없는 경우에도 optimizer가 이 hint를 무시한다.

다음은 MERGE_SJ hint를 이용하여 subquery를 join 형태로 풀어낸 예이다.

SELECT *
  FROM T1
 WHERE I1 IN ( SELECT /*+ MERGE_SJ */ I1
                 FROM T2 );
SELECT *
  FROM T1
 WHERE EXISTS ( SELECT /*+ MERGE_SJ */ I1
                  FROM T2
                 WHERE T1.I1 = T2.I1 );
SELECT *
  FROM T1
 WHERE I1 = ANY ( SELECT /*+ MERGE_SJ */ I1
                    FROM T2 );
SELECT *
  FROM T1
 WHERE I1 NOT IN ( SELECT /*+ MERGE_SJ */ I1
                     FROM T2 );
HASH_SJ

Optimizer로 하여금 subquery를 hash semi join으로 처리하도록 한다. 이는 subquery를 동일한 결과를 갖는 semi join 형태로 풀어낸다.

HASH_SJ는 EXISTS, IN, = ANY quantify 연산자에 사용할 수 있고 NOT EXISTS, NOT IN, ALL quantify 연산자, = ANY를 제외한 ANY quantify 연산자에는 사용할 수 없다.

HASH_SJ hint는 해당 subquery를 semi join 형태로 풀어내기 때문에 anti-semi join 형태로만 풀릴 수 있는 subquery에 기술한 경우 optimizer가 이 hint를 무시한다. 또한, hash semi join에 사용할 key를 key compare 할 수 없는 경우에도 optimizer가 이 hint를 무시한다.

다음은 HASH_SJ hint를 이용하여 subquery를 join 형태로 풀어낸 예이다.

SELECT *
  FROM T1
 WHERE I1 IN ( SELECT /*+ HASH_SJ */ I1
                 FROM T2 );
SELECT *
  FROM T1
 WHERE EXISTS ( SELECT /*+ HASH_SJ */ I1
                  FROM T2
                 WHERE T1.I1 = T2.I1 );
SELECT *
  FROM T1
 WHERE I1 = ANY ( SELECT /*+ HASH_SJ */ I1
                    FROM T2 );
SELECT *
  FROM T1
 WHERE I1 NOT IN ( SELECT /*+ HASH_SJ */ I1
                     FROM T2 );
HASH_ISJ

Optimizer로 하여금 subquery를 hash inverted semi join으로 처리하도록 한다. 이는 subquery를 동일한 결과를 갖는 inverted semi join 형태로 풀어낸다.

HASH_ISJ hint는 left node (outer node)의 row 개수가 적고, right node (inner node)의 row 개수가 많은 경우에 유용하다. Optimizer는 semi join을 위한 key를 key compare 할 수 없는 경우에 이 hint를 무시한다.

HASH_ISJ는 EXISTS, IN, = ANY quantify 연산자에 사용할 수 있고 NOT EXISTS, NOT IN, ALL quantify 연산자 및 = ANY를 제외한 ANY quantify 연산자에는 사용할 수 없다.

HASH_ISJ hint는 해당 subquery를 semi join 형태로 풀어내기 때문에 anti-semi join 형태로만 풀릴 수 있는 subquery에 기술한 경우 optimizer가 이 hint를 무시한다. 또한, hash semi join에 사용할 key를 key compare 할 수 없는 경우에도 optimizer가 이 hint를 무시한다.

다음은 HASH_ISJ hint를 이용하여 subquery를 join 형태로 풀어낸 예이다.

SELECT *
  FROM T1
 WHERE I1 IN ( SELECT /*+ HASH_ISJ */ I1
                 FROM T2 );
SELECT *
  FROM T1
 WHERE EXISTS ( SELECT /*+ HASH_ISJ */ I1
                  FROM T2
                 WHERE T1.I1 = T2.I1 );
SELECT *
  FROM T1
 WHERE I1 = ANY ( SELECT /*+ HASH_ISJ */ I1
                    FROM T2 );
SELECT *
  FROM T1
 WHERE I1 NOT IN ( SELECT /*+ HASH_ISJ */ I1
                     FROM T2 );
HASH_AJ

Optimizer로 하여금 subquery를 hash anti-semi join으로 처리하도록 한다. 이는 subquery를 동일한 결과를 갖는 anti-semi join 형태로 풀어낸다.

HASH_AJ는 NOT EXISTS, NOT IN, != ALL quantify 연산자에 사용할 수 있고 EXISTS, IN, ANY quantify 연산자, != ALL quantify 연산자를 제외한 ALL quantify 연산자에는 사용할 수 없다.

HASH_AJ hint는 해당 subquery를 anti-semi join 형태로 풀어내기 때문에 semi join 형태로만 풀릴 수 있는 subquery에 기술한 경우 optimizer가 이 hint를 무시한다. 또한, hash semi join에 사용할 key를 key compare 할 수 없는 경우에도 optimizer가 이 hint를 무시한다.

다음은 HASH_AJ hint를 이용하여 subquery를 join 형태로 풀어낸 예이다.

SELECT *
  FROM T1
 WHERE I1 NOT IN ( SELECT /*+ HASH_AJ */ I1
                     FROM T2 );
SELECT *
  FROM T1
 WHERE NOT EXISTS ( SELECT /*+ HASH_AJ */ I1
                      FROM T2
                     WHERE T1.I1 = T2.I1 );
SELECT *
  FROM T1
 WHERE I1 != ALL ( SELECT /*+ HASH_AJ */ I1
                     FROM T2 );
SELECT *
  FROM T1
 WHERE I1 IN ( SELECT /*+ HASH_AJ */ I1
                 FROM T2 );
TRANSITIVE_CLOSURE

A=B 이고 B = C 이면, A=C 이다. 이와 같은 관계를 join predicate에 적용한다.

SELECT *
  FROM T1, T2, T3
 WHERE T1.i1 = T2.i1 AND T2.i1 = T3.i1;
위 예제에서 join ordering이 ((t1 ⋈ t2) ⋈ t3)일 경우, 'T2.i1 = T3.i1'과 'T1.i1 = T3.i1' 중 선택도가 높은 predicate 하나만 선택된다. Join ordering이 ((t1 ⋈ t3) ⋈ t2)일 경우, 'T1.i1 = T2.i1'과 'T2.i1 = T3.i1' 중 선택도가 높은 predicate 하나만 선택된다.
NO_TRANSITIVE_CLOSURE

Join transitive closure를 join predicate에 적용하지 않는다.

SELECT *
  FROM T1, T2, T3
 WHERE T1.i1 = T2.i1 AND T2.i1 = T3.i1;

Join transitive closure가 적용되지 않으므로 'T1.i1 = T3.i1'인 predicate이 없다. 따라서 ((t1 ⋈ t3) ⋈ t2) 과 같은 join ordering이 발생하지 않는다.

MERGE

기술한 view가 simple view merging이 가능하면 이를 적용하도록 optimizer에 지시한다. 이 hint는 기술한 view를 포함하는 상위 query block에 명시해야 한다.

MERGE hint는 <join order hints>, <join operation hints>, <other hints>, TRANSITIVE_CLOSURE/NO_TRANSITIVE hint, NO MERGE hint와 함께 쓰이면 적용 방법이 모호해진다.

따라서 이들 hint들과 MERGE hint가 함께 쓰였을 경우, "hint_error" property가 on 이면 validation error로 처리되며, off 이면 먼저 기술한 hint가 적용된다.

다음은 MERGE hint를 이용하여 simple view merging을 적용한 예이다.

SELECT /*+ MERGE(v1) */ *
  FROM ( SELECT * FROM t1 ) v1;
SELECT /*+ MERGE(v1) MERGE(v2) NO_MERGE(v3) */ *
  FROM ( SELECT i1 FROM t1 ) v1, 
       ( SELECT i1 FROM t2 ) v2,     
       ( SELECT i1 FROM t3 ) v3
 WHERE v1.i1 = v2.i1 AND v2.i1 = v3.i1;
SELECT /*+ ORDERING( t1, t2, v1 RIGHT ) MERGE(v1) */ *
  FROM t1, 
       t2,
       ( SELECT * FROM t3, t4 WHERE t3.i1 = t4.i1 ) v1
 WHERE t1.i1 = t2.i1 AND t2.i1 = v1.i1;
→
SELECT /*+ USE_HASH(v1) MERGE(v1) */ *
  FROM t1, 
       t2,
       ( SELECT * FROM t3, t4 WHERE t3.i1 = t4.i1 ) v1
 WHERE t1.i1 = t2.i1 AND t2.i1 = v1.i1;
SELECT /*+ PUSH_PRED MERGE(v1) */ *
  FROM ( SELECT /*+ NO_PUSH_PRED */ * FROM t1 WHERE t1.i1 = 1 ) v1
 WHERE v1.i1 = 1;
SELECT /*+ TRANSITIVE_CLOSURE MERGE(v1) */ *
  FROM ( SELECT /*+ NO_TRANSITIVE_CLOSURE */ * 
           FROM t1, t2, t3
          WHERE t1.i1 = t2.i1 AND t2.i1 = t3.i1 ) v1;
NO_MERGE

기술한 view를 simple view merging 할 수 있더라도 optimizer로 하여금 이를 적용하지 않도록 한다. 이 hint는 기술한 view를 포함하는 상위 query block에 명시해야 한다.

NO_MERGE hint가 <join order hints>, <join operation hints>, <other hints>, TRANSITIVE_CLOSURE/ NO_TRANSITIVE hint, MERGE hint와 함께 쓰일 경우 적용 방법이 모호해진다.

따라서 이들 hint와 NO_MERGE hint가 함께 쓰였을 경우, "hint_error" property가 on 이면 validation error로 처리되고 off 이면 먼저 기술한 hint가 적용된다.

다음은 NO_MERGE hint를 이용하여 simple view merging을 적용하지 않도록 하는 예이다.

SELECT /*+ NO_MERGE(v1) */ *
  FROM ( SELECT * FROM t1 ) v1;
SELECT /*+ MERGE(v1) MERGE(v2) NO_MERGE(v3) */ *
  FROM ( SELECT i1 FROM t1 ) v1, 
       ( SELECT i1 FROM t2 ) v2,     
       ( SELECT i1 FROM t3 ) v3
 WHERE v1.i1 = v2.i1 AND v2.i1 = v3.i1;
NO_QUERY_TRANSFORMATION

Optimizer가 query를 변경하지 않도록 한다. 이 hint를 기술하면 heuristic optimizer나 cost based optimizer 등에서 최적의 성능을 위해 optimizer가 query를 변형하는 과정들이 전혀 수행되지 않는다.

NO_QUERY_TRANSFORMATION hint는 최상위 레벨의 query나 subquery에 기술할 수 있으며, 기술한 query 뿐만 아니라 그 하위의 subquery 모두에 대하여 적용된다

다음은 NO_QUERY_TRANSFORMATION을 이용하여 query를 변형하지 못하도록 한 예이다.

SELECT *
  FROM T1
 WHERE I1 IN ( SELECT /*+ NO_QUERY_TRANSFORMATION */ I1
                 FROM T2 );
SELECT /*+ NO_QUERY_TRANSFORMATION */ *
  FROM T1
 WHERE I1 IN ( SELECT I1
                 FROM T2 );
SELECT /*+ NO_QUERY_TRANSFORMATION */ *
  FROM T1
 WHERE I1 IN ( SELECT /*+ UNNEST */ I1
                 FROM T2 );

<other_hints>

PUSH_PRED

Optimizer로 하여금 single table에 적용 가능한 filter들을 push하도록 한다. 이 hint는 해당 select 구문의 적용 가능한 filter를 single table에 push하여 선행 처리하도록 한다. 해당 힌트는 select로 시작되는 SubQuery들에도 각각 기술할 수 있으며, 각 질의 block 내에서만 적용되고, 하위 SubQuery로 확산되지 않는다.

각 SubQuery들에는 독립적으로 이 힌트를 기술할 수 있으며, 기술하지 않으면 default 값이 적용된다. Default 값은 PUSH_PRED이다.

다음은 PUSH_PRED hint를 이용하여 subquery를 push하는 예이다.

SELECT /*+ PUSH_PRED */ *
  FROM T1, T2
 WHERE T1.I1 = T2.I1
   AND T1.I1 = 1;
NO_PUSH_PRED

Optimizer로 하여금 single table에 적용 가능한 filter들을 push하지 못하도록 한다. 이 hint는 해당 select 구문의 적용 가능한 filter를 single table에 push하여 선행 처리되는 것을 막는다. 해당 힌트는 select로 시작되는 SubQuery들에도 각각 기술할 수 있으며, 각 질의 block 내에서만 적용되고, 하위 SubQuery로 확산되지 않는다.

각 SubQuery들에는 독립적으로 이 힌트를 기술할 수 있으며, 기술하지 않으면 default 값이 적용된다. Default 값은 PUSH_PRED이다.

이 hint를 기술했을 때 from절에 join이 존재할 경우, 해당 필터를 처리할 수 있는 가장 하위 join에서 처리된다. 즉, 해당 filter를 처리할 수 있는 single table에서 선행 처리 되는 것을 방지한다. 또한, 이 hint를 기술했을 때 from절에 view가 존재할 경우, 해당 view의 하위로 filter가 push되지 않는다.

다음은 NO_PUSH_PRED hint를 이용하여 filter를 push하는 예이다.

SELECT /*+ NO_PUSH_PRED */ *
  FROM T1, T2
 WHERE T1.I1 = T2.I1
   AND T1.I1 = 1;
SELECT /*+ NO_PUSH_PRED */ *
  FROM (SELECT I1 FROM T1) AS A
 WHERE A.I1 = 1;
PUSH_SUBQ

Optimizer로 하여금 subquery의 적용 가능한 최하위 노드까지 push하도록 한다. 이 hint는 subquery 상위 레벨의 query가 join으로 구성되어 있을 때 해당 join node 구조의 최상위 node부터 최하위 노드까지 탐색하여 해당 subquery를 처리할 수 있는 node를 찾아서 push 가능한 가장 하위 node에서 subquery를 처리하도록 한다.

PUSH_SUBQ hint는 subquery에만 기술할 수 있으며, 다수의 subquery가 존재할 경우, PUSH_SUBQ hint를 subquery마다 각각 기술해야 한다.

PUSH_SUBQ hint를 기술하지 않으면 optimizer가 cost를 계산하여 가장 cost가 좋은 node에 subquery를 push한다.

다음은 PUSH_SUBQ hint를 이용하여 subquery를 push하는 예이다.

SELECT *
  FROM T1, T2
 WHERE T1.I1 = T2.I1
   AND T1.I1 IN ( SELECT /*+ PUSH_SUBQ */ I1
                    FROM T3 );
SELECT *
  FROM T1, T2
 WHERE T1.I1 = T2.I1
   AND T1.I1 IN ( SELECT /*+ PUSH_SUBQ */ I1
                    FROM T3
                   WHERE T3.I2 = T1.I2
                     AND T3.I3 = T2.I3 );
NO_PUSH_SUBQ

Optimizer로 하여금 subquery를 하위 노드로 push하지 못하도록 한다. 이 hint는 subquery의 상위 레벨 query가 join으로 구성되어 있을 때 해당 join node 구조의 최상위 node에서 subquery를 처리하도록 한다.

NO_PUSH_SUBQ hint는 subquery에만 기술할 수 있으며, 다수의 subquery가 존재할 경우, NO_PUSH_SUBQ hint를 subquery마다 각각 기술해야 한다.

NO_PUSH_SUBQ hint를 기술하지 않으면 optimizer가 cost를 계산하여 가장 cost가 좋은 node에 subquery를 push한다.

다음은 NO_PUSH_SUBQ hint를 이용하여 subquery를 push하는 예이다.

SELECT *
  FROM T1, T2
 WHERE T1.I1 = T2.I1
   AND T1.I1 IN ( SELECT /*+ NO_PUSH_SUBQ */ I1
                    FROM T3 );
USE_GROUP_HASH

Group by 절이 있는 경우에 grouping 하기 위해 optimizer로 하여금 hash instant를 사용하도록 한다.

USE_GROUP_HASH hint는 group by 절이 있는 구문에만 기술할 수 있으며, 다수의 subquery가 존재할 경우 subquery마다 각각 기술해야 한다.

USE_GROUP_HASH hint를 사용하지 않고 grouping을 위한 group key들이 하위 노드로부터 정렬된 상태일 때는 group node를 사용하는 방법을 고려해야 한다.

다음은 USE_GROUP_HASH hint를 이용하는 예이다.

SELECT /*+ USE_GROUP_HASH */ *
  FROM T1
 GROUP BY I1;
USE_DISTINCT_HASH

Distinct 절이 있는 경우에 distinct를 수행하기 위해 optimizer로 하여금 hash instant를 사용하도록 한다.

USE_DISTINCT_HASH hint는 group by 절이 있는 구문에만 기술할 수 있으며, 다수의 subquery가 존재할경우 subquery마다 각각 기술해야 한다.

USE_DISTINCT_HASH hint를 사용하지 않고 distinct를 위한 distinct key들이 하위 노드로부터 정렬된 상태일 때는 group node를 사용하는 방법을 고려해야 한다.

다음은 USE_DISTINCT_HASH hint를 이용하는 예이다.

SELECT /*+ USE_DISTINCT_HASH */ I1, I2
  FROM T1;

설명

Hint는 사용자가 GOLDILOCKS optimizer에게 SQL 구문을 수행하는 방법을 직접 지시하기 위하여 사용하는 comment이다. GOLDILOCKS optimizer가 실행 계획을 정확히 판단할 수 없는 경우에 사용자가 hint를 사용하여 직접 실행 계획을 선택한다.

GOLDILOCKS optimizer가 실행 계획을 결정할 때는 사용자가 기술한 hint를 최우선으로 선택하게 되며, 만약 사용자가 기술한 hint를 사용할 수 없을 경우 GOLDILOCKS optimizer가 판단해서 결정한다.

사용자가 hint를 사용하면 GOLDILOCKS optimizer가 가능한 사용자의 hint대로 동작하기 때문에 사용자가 GOLDILOCKS optimizer의 SQL구문 실행 계획이 잘못되었다고 판단하는 경우에만 사용할 것을 권장한다.

특히, 동일한 SQL 구문을 반복해서 사용할 때 hint를 사용하면 GOLDILOCKS optimizer는 사용자가 기술한 hint대로 수행한다. 이 경우, 해당 SQL 구문에 포함된 TABLE이나 VIEW의 데이터가 변경되어 다른 실행 계획의 성능 저하를 가져올 수 있으므로 주의한다.

GOLDILOCKS에서 hint는 SELECT, INSERT SELECT, DELETE, UPDATE 등의 구문에 사용할 수 있다. Hint는 각 구문의 키워드 다음 위치에 /*+ 키워드와 */ 키워드를 양 옆에 사용하여 그 사이에 기술한다.

사용자가 잘못된 hint를 기술하거나 동일한 실행 계획에 영향을 미치는 hint를 둘 이상 기술하여 hint가 서로 충돌하는 경우에는 해당 hint를 무시하거나 먼저 기술된 hint를 우선 적용한다. Hint가 잘못 기술되었는지 알고 싶다면 ALTER 구문을 이용하여 HINT_ERROR property를 on으로 설정하고 이용하면 된다.

사용 예

다음은 INSERT SELECT, DELETE, UPDATE, SELECT 구문에서 <hint clause>를 사용한 예이다.

gSQL> INSERT INTO T1 SELECT /*+ INDEX(T1, T1_IDX) */ * FROM T1;

1 row created.
gSQL> SELECT /*+ INDEX(T1, T1_IDX) */ * FROM T1;

I1
--
 1
 1

2 rows selected.
gSQL> UPDATE /*+ INDEX(T1, T1_IDX) */ T1 SET I1 = 2;

2 rows updated.
gSQL> DELETE /*+ INDEX(T1, T1_IDX) */ T1 WHERE I1 = 2;

2 rows deleted.

다음은 ALTER 구문을 이용하여 HINT_ERROR property를 on으로 변경한 후에 hint를 잘못 사용한 예이다.

gSQL> ALTER SESSION SET HINT_ERROR = ON;

Session altered.

gSQL> SELECT /*+ INDEX(T2, T1_IDX) */ * FROM T1;

ERR-42000(16058): not applicable hint :
SELECT /*+ INDEX(T2, T1_IDX) */ * FROM T1
           *
ERROR at line 1:

호환성

SQL 표준에서는 hint를 정의하지 않고 있으며, Oracle 등의 타 벤더에서는 각각 독립적인 형태로 hint를 지원하고 있다.

GOLDILOCKS에서 제공하는 hint는 대부분 Oracle에서 제공하는 hint와 호환되며, GOLDILOCKS에서 제공하는 hint와 동일한 Oracle hint 구문은 Oracle에서도 동일하게 동작한다. 단, INDEX_COMBINE hint는 Oracle과 다른 의미이며 ORDERING hint는 Oracle에서 제공하지 않는다.

참조

관련 내용은 query specification을 참조한다.

SELECT .. FOR UPDATE

기능

SELECT 구문의 결과 집합을 갱신할지 여부를 설정한다.

구문

<select for update statement> ::=
    <query expression>  <updatability clause>
    ;

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

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

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

<query expression>

SELECT 구문에 INTO 절이 없어야 한다.

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

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

SELECT 구문에 대한 자세한 내용은 query expression을 참조한다.

<updatability clause>

결과 집합에 대한 row를 변경할지 여부를 지정한다.

FOR UPDATE OF …

질의를 수행할 때 lock 획득과 관련된 column들을 나열한다.

<lock wait mode>

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

설명

SELECT 구문은 transaction의 종료 여부와 관계없이 row에 대한 fetch를 지속할 수 있는 반면에, SELECT .. FOR UPDATE 구문은 row들에 대한 lock을 획득하기 때문에 transaction이 종료되면 fetch 할 수 없다.

Cursor holdability


• WITH HOLD

° Transaction 종료 여부와 관계없이 fetch를 지속할 수 있다.

° Fetch across commit 이라고도 한다.


• WITHOUT HOLD

° Transaction이 종료되면 fetch 할 수 없다.

사용 예

다음은 FOR UPDATE 구문을 사용하여 row에 대한 lock을 획득하는 예이다.

gSQL> SELECT id, data FROM t1 WHERE id = 3 FOR UPDATE;

ID DATA  
-- ------
 3 data_3

1 row selected.

다음과 같이 join과 ORDER BY 구문을 사용하더라도 updatable query이면 FOR UPDATE 구문을 사용할 수 있다.

gSQL> SELECT t1.id, t1.name, t2.addr 
        FROM t1, t2
       WHERE t1.id = t2.id
       ORDER BY 1
         FOR UPDATE;

ID NAME    ADDR         
-- ------- -------------
 1 someone somewhere    
 2 anyone  anywhere     
 3 unknown N/A          
 4 leekmo  leekmo's home
 5 mkkim   seoul        

5 rows selected.

다음과 같이 updatable query가 아닌 경우에는 FOR UPDATE 구문을 사용할 수 없다.

gSQL> SELECT id, COUNT(*)
        FROM t1
       GROUP BY id
         FOR UPDATE;

ERR-42000(16112): query expression is not updatable

호환성

SQL 표준에서는 <select for update statement>를 정의하지 않고 있는데, 이는 DECLARE cursor_name 구문을 사용하여 정의할 수 있다.

SELECT .. INTO

기능

질의를 통해 row 하나를 검색하고, 검색한 row의 값을 호스트 변수로 얻어온다.

구문

<select statement: single row> ::=
    SELECT [ <hint clause> ] [ <set quantifier> ] <select list>
        INTO <select target list>
        <table expression>
    ;

<select target list> ::=
    variable_name [, ...]

사용 범위 및 접근 권한

<select statement: single row> 구문을 수행하려면 사용자가 구문에 사용된 모든 테이블에 대해 다음 권한 중 하나를 가져야 한다.

구문 규칙 및 파라미터

<hint clause>

질의를 수행하기 위한 힌트를 기술한다.
자세한 내용은 SELECT 구문의 hint clause를 참조한다.

<set quantifier>

질의 결과에서 중복을 제거할지 여부를 기술한다.
자세한 내용은 query specification 절을 참조한다.

<select list>

질의 결과로부터 검색할 column을 기술한다.
자세한 내용은 select list 절을 참조한다.

INTO <select target list>

INTO 절에 기술된 변수의 개수는 <select list>에 기술된 expression의 개수와 동일해야 한다.

<table expression>

검색 조건 등 질의 내용을 기술한다.
자세한 내용은 query specification 절을 참조한다.

설명

검색할 row가 한 건 이하여야 한다.
두 건 이상의 row가 검색될 경우, 에러가 발생한다.

SELECT 구문들의 차이점

사용 예

다음은 interactive SQL (gsql)을 사용하여 host 변수에 값을 얻어오는 예이다.

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

gSQL> SELECT id, data INTO :v_id, :v_data FROM t1 WHERE id = 3;

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

1 row selected.

SELECT .. INTO .. FOR UPDATE

기능

질의를 통해 row 하나를 검색하여 갱신을 수행할지 여부를 설정한 후, 검색한 row의 값을 호스트 변수에 얻어온다.

구문

<select for update statement: single row> ::=
    SELECT [ <hint clause> ] [ <set quantifier> ] <select list>
        INTO <select target list>
        <table expression>  <updatability clause>
    ;

<select target list> ::=
    variable_name [, ...]

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

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

사용 범위 및 접근 권한

<select statement: single row> 구문을 수행하려면 사용자에게 구문에 사용된 모든 테이블에 대한 다음 권한 중 하나가 있어야 한다.

FOR UPDATE 구문을 사용할 경우, lock 대상이 되는 테이블에 대해 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

<select for update statement: single row>

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

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

<updatability clause>

결과 집합에 대해 row를 변경할지 여부를 지정한다.

FOR UPDATE OF …

질의를 수행할 때 lock 획득과 관련된 column을 나열한다.

<lock wait mode>

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

<hint clause>

질의를 수행하기 위한 힌트를 기술한다.
자세한 내용은 SELECT 구문의 hint clause 절을 참조한다.

<set quantifier>

질의 결과에서 중복을 제거할지 여부를 기술한다.
자세한 내용은 query specification 절을 참조한다.

<select list>

질의 결과로부터 검색할 column을 기술한다.
자세한 내용은 select list 절을 참조한다.

INTO <select target list>

INTO 절에 기술된 변수의 개수는 <select list>에 기술된 expression의 개수와 동일해야 한다.

<table expression>

검색 조건 등의 질의 내용을 기술한다.
자세한 내용은 query specification 절을 참조한다.

설명

검색할 row가 한 건 이하여야 한다.
두 건 이상의 row가 검색될 경우, 에러가 발생한다.

SELECT 구문은 transaction의 종료 여부와 관계없이 row에 대한 fetch를 지속할 수 있는 반면에, SELECT .. FOR UPDATE 구문은 row들에 대한 lock을 획득하기 때문에 transaction이 종료되면 fetch 할 수 없다.

Cursor holdability



SELECT 구문들의 차이점

사용 예

다음은 FOR UPDATE 구문을 사용하여 row에 lock을 획득하고, interactive SQL (gsql)을 사용하여 host 변수에 값을 얻어오는 예이다.

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

gSQL> SELECT id, data INTO :v_id, :v_data FROM t1 WHERE id = 3 FOR UPDATE;

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

1 row selected.

다음과 같이 join과 ORDER BY 구문을 사용하더라도 updatable query이면 FOR UPDATE 구문을 사용할 수 있다.

gSQL> \var v_id   INTEGER
gSQL> \var v_name VARCHAR(128)
gSQL> \var v_addr VARCHAR(128)


gSQL> SELECT t1.id, t1.name, t2.addr 
        INTO :v_id, :v_name, :v_addr
        FROM t1, t2
       WHERE t1.id = t2.id
       ORDER BY 1
       LIMIT 1
         FOR UPDATE;

ID NAME    ADDR         
-- ------- -------------
 1 someone somewhere    

1 row selected.

다음과 같이 updatable query가 아닌 경우에는 FOR UPDATE 구문을 사용할 수 없다.

gSQL> \var v_id    INTEGER
gSQL> \var v_count INTEGER

gSQL> SELECT id, COUNT(*)
        INTO :v_id, :v_count
        FROM t1
       GROUP BY id
         FOR UPDATE;

ERR-42000(16112): query expression is not updatable

참조

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

SET CONSTRAINTS

기능

트랜잭션 내에서 지연 가능한 제약 조건들의 검사 시점을 IMMEDIATE 또는 DEFERRED로 설정한다.

구문

<set constraints mode statement> ::=
    SET { CONSTRAINT | CONSTRAINTS } <constraint name list> { DEFERRED | IMMEDIATE }
    ;

<constraint name list> ::=
      ALL
    | <constraint name> [, ...]

사용 범위 및 접근 권한

SET CONSTRAINTS를 수행하기 위해 별도의 접근 권한이 필요한 것은 아니다.

Cluster system에서 지원하지 않는다.

구문 규칙 및 파라미터

CONSTRAINT | CONSTRAINTS

CONSTRAINT와 CONSTRAINTS는 동일한 의미의 키워드인데 SQL 표준은 CONSTRAINTS 이다.

<constraint name list>

제약 조건 이름 목록을 기술하거나, ALL 키워드를 사용하여 지연 가능한 제약 조건을 모두 명시할 수 있다.
<constraint name>을 기술할 경우, 제약 조건은 지연 가능해야 한다.
ALL은 지연 가능한 모든 제약 조건을 의미한다.

DEFERRED | IMMEDIATE

명시된 지연 가능한 제약 조건들의 검사 시점을 설정한다.

트랜잭션이 진행 중이면, 검사 시점은 현재 트랜잭션에 설정되며, 트랜잭션이 진행 중이 아닌 경우에는 다음 트랜잭션에 설정된다.
트랜잭션이 종료되면 다음 트랜잭션에 영향을 미치지 않는다.

설명

지연 가능한 제약 조건

지연 가능한 (DEFERRABLE) 제약 조건은 검사 시점을 변경할 수 있다.
다음은 지연 가능한 제약 조건을 가진 테이블을 생성하고, 데이터를 추가하는 예이다.
gSQL> CREATE TABLE t1 
( 
    id   INTEGER, 
    name VARCHAR(128) CONSTRAINT t1_uk UNIQUE 
                      DEFERRABLE INITIALLY IMMEDIATE
);

Table created.

gSQL> COMMIT;

Commit complete.

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

1 row created.

gSQL> INSERT INTO t1 VALUES ( 2, 'mkkim' );

1 row created.

gSQL> COMMIT;

Commit complete.

위의 예에서 name column에 지연 가능한 UNIQUE 제약 조건을 생성하였으며, 초기 검사 시점이 INITIALLY IMMEDIATE로 설정되어 DML을 수행할 때마다 제약 조건을 검사한다.

이 때, 다음과 같이 두 row의 name 값을 서로 교체하려고 하면 검사 시점이 IMMEDIATE라서 모두 제약 조건을 위반하게 된다.

gSQL> UPDATE t1 SET name = 'mkkim' WHERE id = 1;

ERR-23000(16057): unique constraint (PUBLIC.T1_UK) violated

gSQL> UPDATE t1 SET name = 'leekmo' WHERE id = 2;

ERR-23000(16057): unique constraint (PUBLIC.T1_UK) violated

다음과 같이 검사 시점을 DEFERRED로 변경하면 COMMIT 시점에 제약 조건을 검사하므로 위의 예와 동일한 변경 작업이 모두 성공한다.

gSQL> SET CONSTRAINTS t1_uk DEFERRED;

Constraints set.

gSQL> UPDATE t1 SET name = 'mkkim' WHERE id = 1;

1 row updated.

gSQL> UPDATE t1 SET name = 'leekmo' WHERE id = 2;

1 row updated.

gSQL> COMMIT;

Commit complete.

검사 시점을 DEFERRED로 설정하면 COMMIT 시점에 제약 조건을 검사하므로 제약 조건을 위반한 상태에서 트랜잭션을 COMMIT 할 경우 다음과 같이 트랜잭션은 실패하고 ROLLBACK 된다.

gSQL> SET CONSTRAINTS t1_uk DEFERRED;

Constraints set.

gSQL> INSERT INTO t1 VALUES ( 3, 'leekmo' );

1 row created.

gSQL> COMMIT;

ERR-40002(16291): transaction rollback: integrity constraint violation : PUBLIC.T1_UK(1)

지연 제약 조건을 위반한 트랜잭션

트랜잭션이 DEFFERED로 설정된 제약 조건을 위반한 상태에서 다음 구문들을 수행할 경우 다음과 같은 에러가 발생한다.

COMMIT 할 경우 원치 않는 ROLLBACK이 발생할 수 있으므로, SET CONSTRAINTS ALL IMMEDIATE 구문을 수행하여 트랜잭션이 제약 조건을 위반한 상태인지 확인해야 한다.

gSQL> SET CONSTRAINTS t1_uk DEFERRED;

Constraints set.

gSQL> INSERT INTO t1 VALUES ( 3, 'leekmo' );

1 row created.

gSQL> SET CONSTRAINTS ALL IMMEDIATE;

ERR-23000(16038): integrity constraint violation : PUBLIC.T1_UK(1)

gSQL> SELECT * FROM t1 ORDER BY id;

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

3 rows selected.

gSQL> UPDATE t1 SET name = 'xcom73' WHERE id = 3;

1 row updated.

gSQL> SET CONSTRAINTS ALL IMMEDIATE;

Constraints set.

gSQL> COMMIT;

Commit complete.

트랜잭션 제어 언어

SET CONSTRAINTS 구문은 SAVEPOINT savepoint_specifier 구문과 같이 트랜잭션 진행 중에 사용하는 트랜잭션 제어 언어이다.
SET CONSTRAINTS 구문에는 COMMIT, ROLLBACK, ROLLBACK TO SAVEPOINT 구문 등의 트랜잭션 제어가 적용된다.

다음은 여러 개의 지연 가능한 제약 조건을 가진 테이블의 예이다.

CREATE TABLE t1
(
   id1 INTEGER CONSTRAINT t1_uk1 UNIQUE DEFERRABLE INITIALLY IMMEDIATE,
   id2 INTEGER CONSTRAINT t1_uk2 UNIQUE DEFERRABLE INITIALLY IMMEDIATE,
   id3 INTEGER CONSTRAINT t1_uk3 UNIQUE DEFERRABLE INITIALLY IMMEDIATE
);

다음과 같이 트랜잭션이 진행되는 중에 <set constraints mode statement> 구문을 수행할 경우, 각 시점에 따라 지연 가능한 제약 조건들의 검사 시점이 변경된다.

INSERT INTO t1 VALUES ( 1, 1, 1 );

1 row created.

COMMIT;

Commit complete.
SAVEPOINT sp1;

Savepoint created.
SET CONSTRAINTS t1_uk1 DEFERRED;

Constraints set.
SAVEPOINT sp2;

Savepoint created.
SET CONSTRAINTS t1_uk2 DEFERRED;

Constraints set.
SAVEPOINT sp3;

Savepoint created.
SET CONSTRAINTS ALL DEFERRED;

Constraints set.
SAVEPOINT sp4;

Savepoint created.
SET CONSTRAINTS ALL IMMEDIATE;

Constraints set.

다음과 같이 ROLLBACK TO SAVEPOINT 구문을 사용하여 트랜잭션을 부분 철회할 경우 SET CONSTRAINTS 구문도 함께 부분 철회되어 검사 시점이 변경된다.

INSERT INTO t1 VALUES ( 1, 2, 2 );

ERR-23000(16057): unique constraint (PUBLIC.T1_UK1) violated
INSERT INTO t1 VALUES ( 3, 1, 3 );

ERR-23000(16057): unique constraint (PUBLIC.T1_UK2) violated
INSERT INTO t1 VALUES ( 4, 4, 1 );

ERR-23000(16057): unique constraint (PUBLIC.T1_UK3) violated
ROLLBACK TO SAVEPOINT sp4;

Rollback complete.
INSERT INTO t1 VALUES ( 1, 2, 2 );

1 row created.
INSERT INTO t1 VALUES ( 3, 1, 3 );

1 row created.
INSERT INTO t1 VALUES ( 4, 4, 1 );

1 row created.
ROLLBACK TO SAVEPOINT sp3;

Rollback complete.
INSERT INTO t1 VALUES ( 1, 2, 2 );

1 row created.
INSERT INTO t1 VALUES ( 3, 1, 3 );

1 row created.
INSERT INTO t1 VALUES ( 4, 4, 1 );

ERR-23000(16057): unique constraint (PUBLIC.T1_UK3) violated
ROLLBACK TO SAVEPOINT sp2;

Rollback complete.
INSERT INTO t1 VALUES ( 1, 2, 2 );

1 row created.
INSERT INTO t1 VALUES ( 3, 1, 3 );

ERR-23000(16057): unique constraint (PUBLIC.T1_UK2) violated
INSERT INTO t1 VALUES ( 4, 4, 1 );

ERR-23000(16057): unique constraint (PUBLIC.T1_UK3) violated
ROLLBACK TO SAVEPOINT sp1;

Rollback complete.
INSERT INTO t1 VALUES ( 1, 2, 2 );

ERR-23000(16057): unique constraint (PUBLIC.T1_UK1) violated
INSERT INTO t1 VALUES ( 3, 1, 3 );

ERR-23000(16057): unique constraint (PUBLIC.T1_UK2) violated
INSERT INTO t1 VALUES ( 4, 4, 1 );

ERR-23000(16057): unique constraint (PUBLIC.T1_UK3) violated
SELECT * FROM t1;

ID1 ID2 ID3
--- --- ---
  1   1   1

1 row selected.

트랜잭션을 COMMIT 하거나 ROLLBACK 할 경우, SET CONSTRAINTS 구문의 영향은 종료되며, 모든 지연 가능한 제약 조건들은 제약 조건의 특성으로 설정한 INITIALLY IMMEDIATE 또는 INITIALLY DEFERRED 값을 따른다.

사용 예

다음은 제약 조건 이름을 기술하여 검사 시점을 변경하는 예이다.

gSQL> SET CONSTRAINTS t1_uk1 DEFERRED;

Constraints set.

다음은 모든 지연 가능한 제약 조건의 검사 시점을 변경하는 예이다.

gSQL> SET CONSTRAINTS ALL DEFERRED;

Constraints set.

호환성

SQL 표준에서는 CONSTRAINT 키워드 절을 정의하지 않고 있다.

SQL 표준 호환성

Feature ID

설명

지원 여부

F721

Deferrable constraints

O

참조

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

SET SESSION AUTHORIZATION user_identifier

기능

Session user와 current user를 변경한다.

구문

<set session user identifier statement> ::=
    SET SESSION AUTHORIZATION user_identifier
    ;

사용 범위 및 접근 권한

<set session user identifier statement> 구문을 수행하려면 logon 사용자에게 ACCESS CONTROL ON DATABASE 권한이 있어야 한다.

사용자 정보는 다음과 같은 세 가지 형태로 관리된다.

구문 규칙 및 파라미터

user_identifier

변경할 사용자의 이름이다.

설명

SET SESSION AUTHORIZATION 구문을 수행한 이후의 모든 구문은 session user를 기준으로 수행되므로, session user에 대한 권한을 검사하고 객체를 생성할 때의 소유자 역시 session user가 된다.

사용 예

다음은 ACCESS CONTROL ON DATABASE 권한을 가진 test 사용자가 session user를 u1 사용자로 변경한 예이다.

gSQL> SET SESSION AUTHORIZATION u1;

Session set.

gSQL> SELECT LOGON_USER(), SESSION_USER(), CURRENT_USER FROM dual;

LOGON_USER() SESSION_USER() CURRENT_USER
------------ -------------- ------------
TEST         U1             U1          

1 row selected.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

F321

User authorization

O

SET SESSION CHARACTERISTICS AS transaction_mode

기능

세션의 트랜잭션 속성을 설정한다.

구문

<set session characteristics statement> ::=
    SET SESSION CHARACTERISTICS AS TRANSACTION <transaction_mode>
    ;

<transaction_mode> ::=
    { <transaction_access_mode> | ISOLATION LEVEL < isolation_level > }

<transaction_access_mode> ::=
    READ { ONLY | WRITE }

< isolation_level > ::=
    { READ COMMITTED | SERIALIZABLE }

구문 규칙 및 파라미터

<transaction_access_mode>

다음 트랜잭션의 ACCESS MODE 이다.

<isolation_level>

다음 트랜잭션의 ISOLATION LEVEL 이다.

설명

SET SESSION CHARACTERISTICS은 세션의 트랜잭션 속성을 설정한다. 즉, session 내에서 생성되는 모든 transaction의 속성이 이를 따른다.

참고로 SET TRANSACTION transaction_mode 구문의 경우, 이후에 수행되는 하나의 transaction 속성만 변경한다.

사용 예

다음은 session 내에서 생성될 모든 transaction을 READ ONLY로 설정하는 예이다.

gSQL> SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY;

Session set.

다음은 session 내에서 생성될 모든 transaction의 isolation level을 READ COMMITTED로 설정하는 예이다.

gSQL> SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ COMMITTED;

Session set.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

F761

Session management

O

참조

관련 내용은 SET TRANSACTION transaction_mode를 참조한다.

SET TIME ZONE

기능

세션의 TIMEZONE을 설정한다.

구문

<set local time zone statement> ::=
    SET TIME ZONE <set time zone value>
    ;

<set time zone value> ::= 
    { '[+|-]hh:mm' | LOCAL }

구문 규칙 및 파라미터

<set time zone value>

설정할 TIMEZONE 값이다.

설명

Session의 time zone을 변경하면 함수 CURRENT_TIME, CURRENT_TIMESTAMP 등의 결과값에 영향을 미친다.

사용 예

다음은 session의 time zone을 '+09:00' 으로 변경하는 예이다.

gSQL> SET TIME ZONE '+09:00';

Session set.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

F411

Time zone specification

O

SET TRANSACTION transaction_mode

기능

다음 트랜잭션의 속성을 설정한다.

구문

<set transaction statement> ::=
    SET TRANSACTION <transaction_mode>
    ;

<transaction_mode> ::=
    { <transaction_access_mode> | ISOLATION LEVEL < isolation_level > }

<transaction_access_mode> ::=
    READ { ONLY | WRITE }

< isolation_level > ::=
    { READ COMMITTED | SERIALIZABLE }

구문 규칙 및 파라미터

<transaction_access_mode>

다음 트랜잭션의 ACCESS MODE 이다.

<isolation_level>

다음 트랜잭션의 ISOLATION LEVEL 이다.

설명

SET TRANSACTION은 다음 트랜잭션의 속성을 설정하며, 다음 트랜잭션이 종료되면 트랜잭션 속성은 기본값으로 복원된다.

사용 예

다음에 수행될 transaction을 읽기 전용으로 설정한 예이다.

gSQL> SET TRANSACTION READ ONLY;

Transaction set.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

T251

SET TRANSACTION statement: LOCAL option

X

참조

관련 내용은 SET SESSION CHARACTERISTICS AS transaction_mode를 참조한다.

TRUNCATE TABLE

기능

테이블의 모든 row들을 제거한다.

구문

<truncate table statement> ::= 
    TRUNCATE TABLE table_name 
        [ RESTART IDENTITY | CONTINUE IDENTITY ] 
        [ DROP STORAGE | DROP ALL STORAGE ] 
    ;

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

table_name

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

[ RESTART IDENTITY | CONTINUE IDENTITY ]

[ DROP STORAGE | DROP ALL STORAGE ]

설명

TRUNCATE TABLE과 같은 Data Definition Language (DDL) 구문도 트랜잭션이 COMMIT 되기 전이라면 ROLLBACK 할 수 있다.

사용 예

다음은 TRUNCATE TABLE 구문을 수행하는 예이다.

gSQL> TRUNCATE TABLE t1;

Table truncated.

다음은 TRUNCATE TABLE을 수행할 때 identity column 값을 재시작하는 예이다.

TRUNCATE TABLE t1 RESTART IDENTITY;

Table truncated.

호환성

SQL 표준에서는 [ DROP STORAGE | DROP ALL STORAGE ] 절을 정의하지 않고 있다.

SQL 표준 호환성

Feature ID

설명

지원 여부

F200

TRUNCATE TABLE statement

O

F202

TRUNCATE TABLE: identity column restart option

O

UPDATE

기능

테이블의 row들을 갱신한다.

구문

<update statement: searched> ::=
    UPDATE table_name [ [ AS ] alias_name ]
        SET <set clause> [, ...]
        [ WHERE <search condition> ]
        [ <result offset clause> ]
        [ <fetch limit clause> ]
    ;

<set clause> ::=
      column_name = { <value expression> | DEFAULT }
    | ( column_name [, ...] ) = ( { <value expression> | DEFAULT } [, ...] )
    | ( column_name [, ...] ) = ( <query expression> )


<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 }

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

table_name

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

[ AS alias_name ]

table_name의 alias 이다.

<set clause>

갱신할 column과 할당할 값을 정의하며, <set clause>의 column 개수와 값의 개수는 동일해야 한다.

다음과 같은 방법으로 정의할 수 있다.

UPDATE table_name 
   SET column1 = value1, column2 = value2, column3 = value3
UPDATE table_name 
   SET ( column1, column2, column3 ) = ( value1, value2, value3 )
UPDATE table_name 
   SET column1 = ( SELECT max(value1) FROM other_table_name )

<query expression>은 row 하나를 생성하는 질의여야 한다.

Column 값으로 DEFAULT를 사용할 경우, CREATE TABLE을 수행할 때 정의한 기본값 (<default clause> 참조)을 사용하며, 정의되지 않은 경우에는 NULL 값이 할당된다.

WHERE <search condition>

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

<result offset clause>

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

<fetch limit clause>

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

설명

UPDATE 관련 구문들의 차이점

사용 예

다음은 조건에 부합하는 다수의 row를 갱신하는 예이다.

gSQL> UPDATE lineitem
         SET l_shipdate = CURRENT_DATE
       WHERE l_returnflag = 'R';

5 rows updated.

다음은 여러 column의 값을 갱신하는 예이다.

gSQL> UPDATE lineitem
         SET l_shipdate   = CURRENT_DATE
           , l_returnflag = 'A'
       WHERE l_returnflag = 'R';

5 rows updated.

다음은 여러 column을 괄호로 묶어 갱신하는 예이다.

gSQL> UPDATE lineitem
         SET ( l_shipdate  , l_returnflag )
           = ( CURRENT_DATE, 'A' )
       WHERE l_returnflag = 'R';

5 rows updated.

다음은 subquery를 사용하여 column의 값을 갱신하는 예이다.

gSQL> UPDATE lineitem
         SET l_discount = ( SELECT MAX(l_discount) + 0.01 FROM lineitem )
       WHERE l_returnflag = 'R';

5 rows updated.

다음은 OFFSET과 FETCH 절을 사용하여 조건에 부합하는 row들 중 일부만 갱신하는 예이다.

gSQL> UPDATE lineitem
         SET l_discount = l_discount + 0.01
       WHERE l_returnflag = 'R'
      OFFSET 3
      FETCH 2;

2 rows updated.

호환성

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

SQL 표준 호환성

Feature ID

설명

지원 여부

F781

Self-referencing operations

X

T111

Updatable joins, unions, and columns

X

UPDATE name RETURNING

기능

테이블의 row들을 갱신하고, 갱신 전의 row들이나 갱신 후의 row들을 검색한다.

구문

<update statement: searched> ::=
    UPDATE table_name [ [ AS ] alias_name ]
        SET <set clause> [, ...]
        [ WHERE <search condition> ]
        [ <result offset clause> ]
        [ <fetch limit clause> ]
        <returning clause>

<set clause> ::=
      column_name = { <value expression> | DEFAULT }
    | ( column_name [, ...] ) = ( { <value expression> | DEFAULT } [, ...] )
    | ( column_name [, ...] ) = ( <query expression> )


<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 } [ NEW | OLD ] { * | { <value expression> [ [AS] alias_name] } [, ...] }

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

table_name

Row를 갱신할 대상 테이블의 이름이다.

[ AS alias_name ]

table_name의 alias이다.

<set clause>

갱신할 column과 할당할 값을 정의하며, <set clause>의 column 개수와 값의 개수는 동일해야 한다.
자세한 내용은 UPDATE 구문을 참조한다.

WHERE <search condition>

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

<result offset clause>

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

<fetch limit clause>

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

<returning clause>

갱신된 row들을 결과 집합으로 하고, 이들 중에서 검색할 column을 기술한다.

설명

자세한 내용은 UPDATE 관련 구문들의 차이점을 참조한다.

사용 예

다음은 RETURNING 절을 사용하여 갱신된 row들의 값을 얻는 예이다.

gSQL> UPDATE lineitem 
         SET l_discount = l_discount + 0.01
       WHERE l_returnflag = 'R'
   RETURNING l_orderkey, l_linenumber, l_discount;

L_ORDERKEY L_LINENUMBER L_DISCOUNT
---------- ------------ ----------
         8            1        .07
         9            2        .11
        12            5        .05
        15            1        .03
        16            2        .08

5 rows updated.

다음은 RETURNING OLD 절을 사용하여 갱신된 row들의 갱신 전 값을 얻는 예이다.

gSQL> UPDATE lineitem 
         SET l_discount = l_discount + 0.01
       WHERE l_returnflag = 'R'
   RETURNING OLD l_orderkey, l_linenumber, l_discount;

L_ORDERKEY L_LINENUMBER L_DISCOUNT
---------- ------------ ----------
         8            1        .06
         9            2         .1
        12            5        .04
        15            1        .02
        16            2        .07

5 rows updated.

호환성

SQL 표준에는 <update returning query statement> 구문이 존재하지 않는다.

UPDATE name RETURNING .. INTO

기능

테이블 row 한 개를 갱신하고, 갱신한 row의 값을 호스트 변수에 얻어온다.

구문

<update statement: searched> ::=
    UPDATE table_name [ [ AS ] alias_name ]
        SET <set clause> [, ...]
        [ WHERE <search condition> ]
        [ <result offset clause> ]
        [ <fetch limit clause> ]
        <returning into clause>
    ;


<set clause> ::=
      column_name = { <value expression> | DEFAULT }
    | ( column_name [, ...] ) = ( { <value expression> | DEFAULT } [, ...] )
    | ( column_name [, ...] ) = ( <query expression> )


<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 } [ NEW | OLD ] { * | { <value expression> [ [AS] alias_name] } [, ...] } INTO variable_name [, ...]

사용 범위 및 접근 권한

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

구문 규칙 및 파라미터

table_name

Row를 갱신할 대상 테이블의 이름이다.

[ AS alias_name ]

table_name의 alias이다.

<set clause>

갱신할 column과 할당할 값을 정의하며, <set clause>의 column 개수와 값의 개수는 동일해야 한다.
자세한 내용은 UPDATE 구문을 참조한다.

WHERE <search condition>

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

<result offset clause>

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

<fetch limit clause>

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

RETURNING .. AS ..

갱신된 row들을 결과 집합으로 하고, 이들 중에서 검색할 column을 기술한다.
자세한 내용은 UPDATE name RETURNING 구문의 <returning clause>를 참조한다.

INTO variable_name [, ...]

INTO 절에 기술된 변수의 개수는 RETURNING 절에 기술된 expression의 개수와 동일해야 한다.
갱신할 row가 한 건 이하여야 한다.
Row가 두 건 이상 갱신될 경우, 에러가 발생한다.

설명

자세한 내용은 UPDATE 관련 구문들의 차이점을 참조한다.

사용 예

다음은 갱신한 row의 column 값을 host 변수에 얻어오는 예이다.

gSQL> \VAR v_discount NUMBER

gSQL> UPDATE lineitem 
         SET l_discount = l_discount + 0.01
       WHERE l_orderkey = 12 AND l_linenumber = 5
   RETURNING l_discount INTO :v_discount;

V_DISCOUNT
----------
       .05

1 row updated.

호환성

SQL 표준에는 <update returning into statement> 구문이 존재하지 않는다.

UPDATE name WHERE CURRENT OF cursor_name

기능

커서가 가리키는 row 하나를 갱신한다.

구문

<update statement: positioned> ::=
    UPDATE table_name [ [ AS ] alias_name ]
        SET <set clause> [, ...]
        WHERE CURRENT OF cursor_name
    ;

사용 범위 및 접근 권한

<update statement: positioned> 구문을 수행하려면 사용자가 다음 조건을 만족해야 한다.

구문 규칙 및 파라미터

table_name

Row를 갱신할 대상 테이블의 이름이다.

[ AS alias_name ]

table_name의 alias 이다.

<set clause>

갱신할 column과 할당할 값을 정의하며, <set clause>의 column 개수와 값의 개수는 동일해야 한다.
자세한 내용은 UPDATE 구문을 참조한다.

cursor_name

cursor_name에 해당하는 커서는 다음 조건들을 만족해야 한다.

설명

자세한 내용은 UPDATE 관련 구문들의 차이점을 참조한다.

사용 예

다음은 interactive SQL (gsql)에서 cursor를 사용하여 <update statement: positioned> 구문을 수행하는 예이다.

gSQL> \VAR v_discount NUMBER
gSQL> DECLARE update_cursor CURSOR FOR 
        SELECT l_discount
          FROM lineitem
         WHERE l_orderkey = 8 AND l_linenumber = 1
           FOR UPDATE;

Cursor declared.
gSQL> OPEN update_cursor;

Cursor is open.
gSQL> FETCH update_cursor INTO :v_discount;

V_DISCOUNT
----------
       .06

1 row fetched.
gSQL> UPDATE lineitem 
         SET l_discount = l_discount + 0.01 
       WHERE CURRENT OF update_cursor;

1 row updated.
gSQL> CLOSE update_cursor;

Cursor closed.

gSQL> COMMIT;

Commit complete.

다음은 embedded SQL 프로그램에서 cursor를 사용하여 <update statement: positioned> 구문을 수행하는 예이다.

{
    ...
    EXEC SQL BEGIN DECLARE SECTION;
        ...    
        double v_discount;  
        ...   
    EXEC SQL END DECLARE SECTION;
    ...
    EXEC SQL DECLARE update_cursor CURSOR FOR
              SELECT l_discount
                FROM lineitem
               WHERE l_orderkey = 8 AND l_linenumber = 1
                 FOR UPDATE;
    ...
    EXEC SQL OPEN update_cursor;
    ...
    EXEC SQL FETCH NEXT update_cursor INTO :v_discount;
    ...
    EXEC SQL UPDATE lineitem 
                SET l_discount = l_discount + 0.01 
              WHERE CURRENT OF update_cursor;
    ...
    EXEC SQL CLOSE update_cursor;
    ...
    EXEC SQL COMMIT WORK;
    ...
}

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

F831

Full cursor update

O

B031

Basic dynamic SQL

O

참조

관련 내용은 CLOSE cursor_name을 참조한다.