시스템 카탈로그

시스템 카탈로그 가상 클래스(virtual class)를 사용하면 다양한 스키마 정보를 SQL 문을 이용하여 쉽게 얻어낼 수 있다. 예를 들어 다음과 같은 스키마 정보들을 카탈로그 가상 클래스를 이용하여 얻을 수 있다.

-- 클래스 'db_user'를 참조하는 클래스들
SELECT class_name
FROM db_attribute
WHERE domain_class_name = 'db_user';

-- 현재 사용자가 접근 가능한 클래스 개수
SELECT COUNT(*)
FROM db_class;

-- 클래스 'db_user'의 속성
SELECT attr_name, data_type
FROM db_attribute
WHERE class_name = 'db_user';

시스템 카탈로그 클래스

카탈로그 가상 클래스를 정의하기 위해 우선 카탈로그 클래스를 정의한다. 아래 그림은 추가되는 카탈로그 클래스들과 그 관계를 나타낸다. 화살표는 참조 관계이며, '_'로 시작하는 클래스는 카탈로그 클래스이다.

../_images/image9.png

추가한 카탈로그 클래스들은 데이터베이스 안의 모든 클래스, 속성(attribute), 메서드 등에 대한 정보를 표현한다. 카탈로그 클래스들은 클래스 합성 계층(class composition hierarchy)으로 구성되어 있는데, 상호 참조가 가능하도록 카탈로그 클래스 인스턴스들의 OID를 가지도록 구성되어 있다.

_db_class

클래스에 대한 정보를 표현하며 class_name에 대한 인덱스가 생성되어 있다.

속성명 데이터 타입 설명
class_of object 클래스 객체로서 시스템 내부에 저장된 클래스에 대한 메타 정보 객체를 의미한다.
class_name VARCHAR(255) 클래스명
class_type INTEGER 클래스이면 0, 가상 클래스이면 1
is_system_class INTEGER 사용자가 정의한 클래스이면 0, 시스템 클래스이면 1
owner db_user 클래스 소유자
inst_attr_count INTEGER 인스턴스 속성의 개수
class_attr_count INTEGER 클래스 속성의 개수
shared_attr_count INTEGER 공유 속성의 개수
inst_meth_count INTEGER 인스턴스 메서드의 개수
class_meth_count INTEGER 클래스 메서드의 개수
sub_classes SEQUENCE OF _db_class 한 단계 하위 클래스
super_classes SEQUENCE OF _db_class 한 단계 상위 클래스
inst_attrs SEQUENCE OF _db_attribute 인스턴스 속성
class_attrs SEQUENCE OF _db_attribute 클래스 속성
shared_attrs SEQUENCE OF _db_attribute 공유 속성
inst_meths SEQUENCE OF _db_method 인스턴스 메서드
class_meths SEQUENCE OF _db_method 클래스 메서드
meth_files SEQUENCE OF _db_methfile 메서드에 대한 함수가 위치한 파일 경로
query_specs SEQUENCE OF _db_queryspec 가상 클래스인 경우 그 SQL 정의문
indexes SEQUENCE OF _db_index 클래스에 생성된 인덱스

다음 예제에서는 사용자 PUBLIC 이 소유하고 있는 클래스의 모든 하위 클래스를 검색한다(결과로 보이는 하위 클래스 female_eventADD SUPERCLASS 절 의 예제를 참조한다).

SELECT class_name, SEQUENCE(SELECT class_name FROM _db_class s WHERE s IN c.sub_classes)
 FROM _db_class c
 WHERE c.owner.name = 'PUBLIC' AND c.sub_classes IS NOT NULL;
  class_name            sequence((select class_name from _db_class s where s in c.sub_classes))
============================================
  'event'               {'female_event'}

Note

시스템 카탈로그 클래스에 대한 모든 예제는 csql 프로그램에서 작성되었는데, 여기에서는 --no-auto-commit (auto-commit 모드 비활성화), -u (사용자 dba를 명시) 옵션을 사용하였다.

% csql --no-auto-commit -u dba demodb

_db_attribute

속성에 대한 정보를 표현하며 class_of, attr_name에 대한 인덱스가 생성되어 있다.

속성명 데이터 타입 설명
class_of _db_class 속성이 속한 클래스.
attr_name VARCHAR (255) 속성명.
attr_type INTEGER 속성이 정의된 타입. 인스턴스 속성이면 0, 클래스 속성이면 1, 공유 속성이면 2이다.
from_class_of _db_class 상속받은 속성이면 그 속성이 정의되어 있는 상위 클래스가 설정되며, 상속받지 않은 것이면 NULL 이다
from_attr_name VARCHAR(255) 상속받은 속성이며 이름 충돌(name conflict)이 발생하여 이를 해결하기 위해 그 속성명이 바뀐 경우, 상위 클래스에 정의된 원래 이름이 설정된다. 그 이외에는 모두 NULL 이 설정된다.
def_order INTEGER 속성이 클래스에 정의된 순서로 0부터 시작한다. 상속받은 속성이면 그 상위 클래스에서 정의된 순서를 따른다. 예를 들어, 클래스 y가 클래스 x로부터 속성 a를 상속받고 a는 x에서 첫 번째로 정의되었을 때 def_order는 0이 된다.
data_type INTEGER 속성의 데이터 타입. 아래의 'CUBRID가 지원하는 데이터 타입' 표에서 명시하는 value 중 하나이다.
default_value VARCHAR (255) 기본값. 데이터 타입에 관계없이 모두 문자열로 저장된다. 기본값이 없으면 NULL , 기본값이 NULL 이면 'NULL'로 표현된다. 데이터 타입이 객체 타입이면 'volume id | page id | slot id', 집합 타입이면 '{element 1, element 2, ...}'로 표현된다.
domains SEQUENCE OF _db_domain 데이터 타입에 대한 도메인 정보.
is_nullable INTEGER not null 제약이 설정되어 있으면 0, 그렇지 않으면 1이 설정된다.

CUBRID가 지원하는 데이터 타입

의미 의미
1 INTEGER 18 SHORT
2 FLOAT 20 OID
3 DOUBLE 22 NUMERIC
4 STRING 23 BIT
5 OBJECT 24 VARBIT
6 SET 25 CHAR
7 MULTISET 26 NCHAR
8 SEQUENCE 27 VARNCHAR
9 ELO 31 BIGINT
10 TIME 32 DATETIME
11 TIMESTAMP 33 BLOB
12 DATE 34 CLOB
13 MONETARY 35 ENUM

CUBRID가 지원하는 문자셋

의미
0 US English - ASCII encoding
3 Latin 1 - ISO 8859 encoding
4 KSC 5601 1990 - EUC encoding

다음 예제에서는 사용자 PUBLIC 이 소유하고 있는 클래스 중에서 사용자 클래스(from_class_of.is_system_class = 0)인 것을 검색한다.

SELECT class_of.class_name, attr_name
FROM _db_attribute
WHERE class_of.owner.name = 'PUBLIC' AND FROM _class_of.is_system_class = 0
ORDER BY 1, def_order;

class_of.class_name   attr_name
============================================
  'female_event'        'code'
  'female_event'        'sports'
  'female_event'        'name'
  'female_event'        'gender'
  'female_event'        'players'

_db_domain

도메인에 대한 정보이며 object_of에 대한 인덱스가 생성되어 있다.

속성명 데이터 타입 설명
object_of object 도메인을 참조하는 속성, 메서드 인자 또는 도메인
data_type INTEGER 도메인의 데이터 타입( _db_attribute 의 'CUBRID가 지원하는 데이터 타입' 표의 '값' 중 하나)
prec INTEGER 데이터 타입에 대한 전체 자릿수(precision). 전체 자릿수가 명시되지 않은 경우 0이 설정됨
scale INTEGER 데이터 타입에 대한 소수점 이하의 자릿수(scale). 소수점 이하의 자릿수가 명시되지 않은 경우 0이 설정됨
class_of _db_class 데이터 타입이 객체 타입인 경우 그 도메인 클래스. 객체 타입이 아닌 경우 NULL 이 설정됨.
code_set INTEGER 문자열 타입인 경우, 문자셋( _db_attribute 의 'CUBRID가 지원하는 문자셋' 표의 '값' 중 하나). 문자 스트링 타입이 아닌 경우 0.
set_domains SEQUENCE OF _db_domain 컬렉션 타입인 경우, 그 집합을 구성하는 원소의 데이터 타입에 대한 도메인 정보. 컬렉션 타입이 아닌 경우 NULL 이 설정됨

_db_method

메서드에 대한 정보이며 class_of, meth_name에 대한 인덱스가 생성되어 있다.

속성명 데이터 타입 설명
class_of _db_class 메서드가 속한 클래스
meth_type INTEGER 메서드가 클래스에 정의된 타입. 인스턴스 메서드이면 0, 클래스 메서드이면 1
from_class_of _db_class 메서드가 상속된 것이면 그 메서드가 정의되어 있는 상위 클래스가 설정되며 그렇지 않으면 NULL
from_meth_name VARCHAR(255) 상속받은 메서드이며 이름 충돌이 발생하여 이를 해결하기 위해 그 메서드명이 바뀐 경우, 상위 클래스에 정의된 원래 이름이 설정됨. 그 이외에는 모두 NULL
meth_name VARCHAR(255) 메서드 이름
signatures SEQUENCE OF _db_meth_sig 메서드 호출시 수행하는 C 함수에 대한 구성 정보

다음 예제에서는 사용자 DBA 가 소유하고 있는 클래스 중에서 클래스 메서드가 있는 것(c.class_meth_count > 0)의 클래스 메서드를 검색한다.

SELECT class_name, SEQUENCE(SELECT meth_name
                            FROM _db_method m
                            WHERE m in c.class_meths)
FROM _db_class c
WHERE c.owner.name = 'DBA' AND c.class_meth_count > 0
ORDER BY 1;

  class_name            sequence((select meth_name from _db_method m where m in c.class_meths))
============================================
  'db_serial'           {'change_serial_owner'}
  'db_authorizations'   {'add_user', 'drop_user', 'find_user', 'print_authorizations', 'info', 'change_owner', 'change_trigg
r_owner', 'get_owner'}
  'db_authorization'    {'check_authorization'}
  'db_user'             {'add_user', 'drop_user', 'find_user', 'login'}
  'db_root'             {'add_user', 'drop_user', 'find_user', 'print_authorizations', 'info', 'change_owner', 'change_trigg
r_owner', 'get_owner', 'change_sp_owner'}

_db_meth_sig

메서드에 대한 C 함수의 구성 정보이며 meth_of에 대한 인덱스가 생성되어 있다.

속성명 데이터 타입 설명
meth_of _db_method 함수 정보에 대한 메서드
arg_count INTEGER 함수의 입력인자 개수
func_name VARCHAR(255) 함수명
return_value SEQUENCE OF _db_meth_arg 함수의 리턴 값
arguments SEQUENCE OF _db_meth_arg 함수의 입력인자

_db_meth_arg

메서드 인자에 대한 정보이며 meth_sig_of에 대한 인덱스가 생성되어 있다.

속성명 데이터 타입 설명
meth_sig_of _db_meth_sig 인자가 속한 함수 정보
data_type INTEGER 인자의 데이터 타입( _db_attribute 의 'CUBRID가 지원하는 데이터 타입' 표의 '값' 중 하나)
index_of INTEGER 함수정의에 인자가 나열된 순서. 리턴 값이면 0, 입력인자이면 1부터 시작함.
domains SEQUENCE OF _db_domain 인자의 도메인

_db_meth_file

메서드에 대한 함수가 정의된 파일 정보이며 class_of에 대한 인덱스가 생성되어 있다.

속성명 데이터 타입 설명
class_of _db_class 메서드 파일 정보가 속한 클래스
from_class_of _db_class 파일 정보가 상속된 것이면 그 파일 정보가 정의되어 있는 상위 클래스가 설정되며, 그렇지 않으면 NULL
path_name VARCHAR(255) 메서드가 위치한 파일의 경로

_db_query_spec

가상 클래스의 SQL 정의문이며 class_of에 대한 인덱스가 생성되어 있다.

속성명 데이터 타입 설명
class_of _db_class 가상 클래스에 대한 클래스 정보
spec VARCHAR(4096) 가상 클래스에 대한 SQL 정의문

_db_index

인덱스에 대한 정보이며 class_of에 대한 인덱스가 생성되어 있다.

속성명 데이터 타입 설명
class_of _db_class 인덱스가 속한 클래스
index_name VARCHAR(255) 인덱스명
is_unique INTEGER 고유 인덱스(unique index)이면 1, 그렇지 않으면 0
key_count INTEGER 키를 구성하는 속성의 개수
key_attrs SEQUENCE OF _db_index_key 키를 구성하는 속성들
is_reverse INTEGER 역 인덱스(reverse index)이면 1, 그렇지 않으면 0
is_primary_key INTEGER 기본 키이면 1, 그렇지 않으면 0
is_foreign_key INTEGER 외래 키이면 1, 그렇지 않으면 0
filter_expression VARCHAR(255) 필터링된 인덱스의 조건
have_function INTEGER 함수 기반 인덱스이면 1, 그렇지 않으면 0

다음 예제에서는 클래스에 속하는 인덱스명을 검색한다.

SELECT class_of.class_name, index_name
FROM _db_index
ORDER BY 1;

  class_of.class_name   index_name
============================================
  '_db_attribute'       'i__db_attribute_class_of_attr_name'
  '_db_auth'            'i__db_auth_grantee'
  '_db_class'           'i__db_class_class_name'
  '_db_domain'          'i__db_domain_object_of'
  '_db_index'           'i__db_index_class_of'
  '_db_index_key'       'i__db_index_key_index_of'
  '_db_meth_arg'        'i__db_meth_arg_meth_sig_of'
  '_db_meth_file'       'i__db_meth_file_class_of'
  '_db_meth_sig'        'i__db_meth_sig_meth_of'
  '_db_method'          'i__db_method_class_of_meth_name'
  '_db_partition'       'i__db_partition_class_of_pname'
  '_db_query_spec'      'i__db_query_spec_class_of'
  '_db_stored_procedure'  'u__db_stored_procedure_sp_name'
  '_db_stored_procedure_args'  'i__db_stored_procedure_args_sp_name'
  'athlete'             'pk_athlete_code'
  'db_serial'           'pk_db_serial_name'
  'db_user'             'i_db_user_name'
  'event'               'pk_event_code'
  'game'                'pk_game_host_year_event_code_athlete_code'
  'game'                'fk_game_event_code'
  'game'                'fk_game_athlete_code'
  'history'             'pk_history_event_code_athlete'
  'nation'              'pk_nation_code'
  'olympic'             'pk_olympic_host_year'
  'participant'         'pk_participant_host_year_nation_code'
  'participant'         'fk_participant_host_year'
  'participant'         'fk_participant_nation_code'
  'record'              'pk_record_host_year_event_code_athlete_code_medal'
  'stadium'             'pk_stadium_code'

_db_index_key

인덱스에 대한 키 정보이며 index_of에 대한 인덱스가 생성되어 있다.

속성명 데이터 타입 설명
index_of _db_index 키 속성이 속하는 인덱스
key_attr_name VARCHAR(255) 키를 구성하는 속성명
key_order INTEGER 키에서 속성이 위치한 순서로 0부터 시작함
asc_desc INTEGER 속성 값의 순서가 내림차순이면 1, 그렇지 않으면 0
key_prefix_length INTEGER 키로 사용할 prefix의 길이
func VARCHAR(255) 함수 기반 인덱스의 함수 표현식

다음 예제에서는 클래스에 속하는 인덱스명을 검색한다.

SELECT class_of.class_name, SEQUENCE(SELECT key_attr_name
                                     FROM _db_index_key k
                                     WHERE k in i.key_attrs)
FROM _db_index i
WHERE key_count >= 2;

  class_of.class_name   sequence((select key_attr_name from _db_index_key k where k in
i.key_attrs))
============================================
  '_db_partition'       {'class_of', 'pname'}
  '_db_method'          {'class_of', 'meth_name'}
  '_db_attribute'       {'class_of', 'attr_name'}
  'participant'         {'host_year', 'nation_code'}
  'game'                {'host_year', 'event_code', 'athlete_code'}
  'record'              {'host_year', 'event_code', 'athlete_code', 'medal'}
  'history'             {'event_code', 'athlete'}

_db_auth

클래스에 대한 사용자 권한 정보를 나타내며, grantee에 인덱스가 생성되어 있다.

속성명 데이터 타입 설명
grantor db_user 권한 부여자
grantee db_user 권한 받은자
class_of _db_class 권한부여 대상인 클래스 객체
auth_type VARCHAR(7) 부여된 권한 타입 이름
is_grantable INTEGER 권한 받은 클래스에 대해 다른 사용자에게 권한을 부여할 수 있으면 1, 아니면 0

CUBRID가 지원하는 권한 타입은 다음과 같다.

  • SELECT
  • INSERT
  • UPDATE
  • DELETE
  • ALTER
  • INDEX
  • EXECUTE

다음 예제에서는 클래스 db_trig 에 정의되어 있는 권한 정보를 검색한다.

SELECT grantor.name, grantee.name, auth_type
FROM _db_auth
WHERE class_of.class_name = 'db_trig';

  grantor.name          grantee.name          auth_type
==================================================================
  'DBA'                 'PUBLIC'              'SELECT'

_db_data_type

CUBRID가 지원하는 데이터 타입(_db_attribute 의 'CUBRID가 지원하는 데이터 타입' 표 참조)을 나타낸다.

속성명 데이터 타입 설명
type_id INTEGER 데이터 타입 식별자. 'CUBRID가 지원하는 데이터 타입' 표의 '값'에 해당함
type_name VARCHAR(9) 데이터 타입 이름. 'CUBRID가 지원하는 데이터 타입' 표의 '의미'에 해당함

다음 예제에서는 클래스 event 의 속성과 각 타입명을 검색한다.

SELECT a.attr_name, t.type_name
FROM _db_attribute a join _db_data_type t ON a.data_type = t.type_id
WHERE class_of.class_name = 'event'
ORDER BY a.def_order;

  attr_name             type_name
============================================
  'code'                'INTEGER'
  'sports'              'STRING'
  'name'                'STRING'
  'gender'              'CHAR'
  'players'             'INTEGER'

_db_partition

분할에 대한 정보이며 class_of, pname에 대한 인덱스가 생성되어 있다.

속성명 데이터 타입 설명
class_of _db_class Parent class의 OID
pname VARCHAR(255) Parent - NULL
ptype INTEGER 0 - HASH 1 - RANGE 2 - LIST
pexpr VARCHAR(255) Parent only
pvalues SEQUENCE OF Parent - 칼럼명, Hash size RANGE - MIN/MAX value - 무한의 MIN/MAX는 NULL 로 저장 LIST - value list

_db_stored_procedure

Java 저장 함수에 대한 정보이며 sp_name에 대한 인덱스가 생성되어 있다.

속성명 데이터 타입 설명
sp_name VARCHAR(255) SP 이름
sp_type INTEGER SP 종류 (function or procedure)
return_type INTEGER 리턴 값 타입
arg_count INTEGER 매개변수 개수
args SEQUENCE OF _db_stored_procedure_args 매개변수 리스트
lang INTEGER 구현 언어(현재로서는 Java)
target VARCHAR(4096) 실행될 Java 메서드 이름
owner db_user 소유자

_db_stored_procedure_args

Java 저장 함수 인자에 대한 정보이며 sp_name에 대한 인덱스가 생성되어 있다.

속성명 데이터 타입 설명
sp_name VARCHAR(255) SP 이름
index_of INTEGER 매개변수 순서
arg_name VARCHAR(255) 매개변수 이름
data_type INTEGER 매개변수 데이터 타입
mode INTEGER 모드 (IN, OUT, INOUT)

_db_collation

콜레이션에 대한 정보이다.

속성명 데이터 타입 설명
coll_id INTEGER 콜레이션 ID
coll_name VARCHAR(32) 콜레이션 이름
charset_id INTEGER 문자셋 ID
built_in INTEGER 제품 설치 시 콜레이션 포함 여부
expansions INTEGER 확장 지원 여부 (0: 지원 안 함, 1: 지원)
contractions INTEGER 축약 지원 여부 (0: 지원 안 함, 1: 지원)
uca_strength INTEGER 가중치 세기(weight strength)
checksum VARCHAR(32) 콜레이션 파일의 체크섬

db_user

속성명 데이터 타입 설명
name VARCHAR(1073741823) 사용자명
id INTEGER 사용자 식별자
password db_password 사용자 패스워드로 사용자에게 보여지지는 않는다.
direct_groups SET OF db_user 사용자가 직접적으로 속한 그룹
groups SET OF db_user 사용자가 직,간접적으로 속한 그룹
authorization db_authorization 사용자가 가지고 있는 권한 정보
triggers SEQUENCE OF object 사용자의 action에 의해 발생하는 트리거들

메서드 이름

  • set_password ()
  • set_password_encoded ()
  • add_member ()
  • drop_member ()
  • print_authorizations ()
  • add_user ()
  • drop_user ()
  • find_user ()
  • login ()

db_authorization

속성명 데이터 타입 설명
owner db_user 사용자 정보
grants SEQUENCE OF object {사용자가 권한 받은 객체, 객체의 권한 부여자, 권한 종류}의 sequence

메서드 이름

  • check_authorization (varchar(255), integer)

db_trigger

속성명 데이터 타입 설명
owner db_user 트리거 소유자
name VARCHAR(1073741823) 트리거명
status INTEGER INACTIVE이면 1, ACTIVE이면 2. 기본값은 2
priority DOUBLE 트리거 간의 수행 순서에 대한 우선순위. 기본값은 0
event INTEGER UPDATE는 0, UPDATE STATEMENT는 1, DELETE는 2, DELETE STATEMENT는 3, INSERT는 4, INSERT STATEMENT는 5, COMMIT는 8, ROLLBACK은 9 로 설정
target_class object 트리거 대상(target)인 클래스에 대한 클래스 객체
target_attribute VARCHAR(1073741823) 트리거 대상 속성명. 대상 속성이 명시되지 않으면 NULL 을 설정
target_class_attribute INTEGER 대상 속성에 대해, 인스턴스 속성이면 0, 클래스 속성이면 1. 기본값은 0
condition_type INTEGER 조건이 있으면 1, 조건이 없으면 NULL
condition VARCHAR(1073741823) IF문에 명시된 action 발생 조건
condition_time INTEGER 조건이 있으면 BEFORE는 1, AFTER는 2, DEFERRED는 3으로 설정. 조건이 없으면 NULL
action_type INTEGER INSERT, UPDATE, DELETE, CALL 중 하나이면 1, REJECT이면 2, INVALIDATE_TRANSACTION이면 3, PRINT이면 4
action_definition VARCHAR(1073741823) triggering되는 수행문
action_time INTEGER BEFORE는 1, AFTER는 2, DEFERRED는 3으로 설정

db_ha_apply_info

applylogdb 유틸리티가 복제 로그를 반영할 때마다 그 진행 상태를 저장하기 위한 테이블이다. 이 테이블은 applylogdb 유틸리티가 커밋하는 시점마다 갱신되며, _counter 칼럼에는 수행 연산의 누적 카운트 값이 저장된다. 각 칼럼의 의미는 다음과 같다.

칼럼명 칼럼 타입 의미
db_name VARCHAR(255) 로그에 저장된 DB 이름
db_creation_time DATETIME 반영하는 로그에 대한 원본 DB의 생성 시각
copied_log_path VARCHAR(4096) 반영하는 로그 파일의 경로
committed_lsa_pageid BIGINT 마지막에 반영한 commit log lsa의 page id applylogdb가 재시작해도 last_committed_lsa 이전 로그는 재반영하지 않음
committed_lsa_offset INTEGER 마지막에 반영한 commit log lsa의 offset applylogdb가 재시작해도 last_committed_lsa 이전 로그는 재반영하지 않음
committed_rep_pageid BIGINT 마지막 반영한 복제 로그 lsa의 pageid 복제 반영 지연 여부 확인
committed_rep_offset INTEGER 마지막 반영한 복제 로그 lsa의 offset. 복제 반영 지연 여부 확인
append_lsa_page_id BIGINT 마지막 반영 당시 복제 로그 마지막 lsa의 page id 복제 반영 당시, applylogdb에서 처리 중인 복제 로그 헤더의 append_lsa를 저장 복제 로그 반영 당시의 지연 여부를 확인
append_lsa_offset INTEGER 마지막 반영 당시 복제 로그 마지막 lsa의 offset 복제 반영 당시, applylogdb에서 처리 중인 복제 로그 헤더의 append_lsa를 저장 복제 로그 반영 당시의 지연 여부를 확인
eof_lsa_page_id BIGINT 마지막 반영 당시 복제 로그 EOF lsa의 page id 복제 반영 당시, applylogdb에서 처리 중인 복제 로그 헤더의 eof_lsa를 저장 복제 로그 반영 당시의 지연 여부를 확인
eof_lsa_offset INTEGER 마지막 반영 당시 복제 로그 EOF lsa의 offset 복제 반영 당시, applylogdb에서 처리 중인 복제 로그 헤더의 eof_lsa를 저장 복제 로그 반영 당시의 지연 여부를 확인
final_lsa_pageid BIGINT applylogdb에서 마지막으로 처리한 로그 lsa의 pageid 복제 반영 지연 여부 확인
final_lsa_offset INTEGER applylogdb에서 마지막으로 처리한 로그 lsa의 offset 복제 반영 지연 여부 확인
required_page_id BIGINT log_max_archives 파라미터에 의해 삭제되지 않아야 할 가장 작은 log page id, 복제 반영 시작할 로그 페이지 번호
required_page_offset INTEGER 복제 반영 시작할 로그 페이지 offset
log_record_time DATETIME 슬레이브 DB에 커밋된 복제 로그에 포함된 timestamp, 즉 해당 로그 레코드 생성 시간
log_commit_time DATETIME 마지막 commit log의 반영 시간
last_access_time DATETIME db_ha_apply_info 카탈로그의 최종 갱신 시간
status INTEGER 반영 진행 상태(0: IDLE, 1: BUSY)
insert_counter BIGINT applylogdb가 insert한 횟수
update_counter BIGINT applylogdb가 update한 횟수
delete_counter BIGINT applylogdb가 delete한 횟수
schema_counter BIGINT applylogdb가 schema를 변경한 횟수
commit_counter BIGINT applylogdb가 commit한 횟수
fail_counter BIGINT applylogdb가 insert/update/delete/commit/schema 변경 중 실패 횟수
start_time DATETIME applylogdb 프로세스가 슬레이브 DB에 접속한 시간

시스템 카탈로그 가상 클래스

일반 사용자는 자신이 권한을 가진 클래스에 대해서만 그 클래스와 관련된 정보들을 시스템 카탈로그 가상 클래스들을 통해 볼 수 있다. 이 절에서는 각 시스템 카탈로그 가상 클래스들이 어떤 정보를 표현하는지와 가상 클래스 정의문에 대해 설명한다.

DB_CLASS

데이터베이스 내에서 현재 사용자가 접근 권한을 가진 클래스에 대한 정보를 보여준다.

속성명 데이터 타입 설명
class_name VARCHAR (255) 클래스명
owner_name VARCHAR (255) 클래스 소유자명
class_type VARCHAR (6) 클래스이면 'CLASS', 가상 클래스이면 'VCLASS'
is_system_class VARCHAR (3) 시스템 클래스이면 'YES', 아니면 'NO'
partitioned VARCHAR (3) 분할 그룹 클래스이면 'YES', 아니면 'NO'
is_reuse_oid_class VARCHAR (3) REUSE_OID 클래스이면 'YES', 아니면 'NO'

정의

CREATE VCLASS db_class (class_name, owner_name, class_type, is_system_class, partitioned, is_reuse_oid_class)
AS

SELECT c.class_name, CAST(c.owner.name AS VARCHAR(255)),
    CASE c.class_type WHEN 0 THEN 'CLASS' WHEN 1 THEN 'VCLASS' ELSE 'UNKNOW' END,
    CASE WHEN MOD(c.is_system_class, 2) = 1 THEN 'YES' ELSE 'NO' END,
    CASE WHEN c.sub_classes IS NULL THEN 'NO' ELSE NVL((SELECT 'YES' FROM _db_partition p WHERE p.class_of = c and p.pname IS NULL), 'NO') END,
    CASE WHEN MOD(c.is_system_class / 8, 2) = 1 THEN 'YES' ELSE 'NO' END
FROM _db_class c
WHERE CURRENT_USER = 'DBA' OR
    {c.owner.name} SUBSETEQ (
        SELECT SET{CURRENT_USER} + COALESCE(SUM(SET{t.g.name}), SET{})
        FROM db_user u, TABLE(groups) AS t(g)
        WHERE u.name = CURRENT_USER) OR
    {c} SUBSETEQ (
        SELECT SUM(SET{au.class_of})
        FROM _db_auth au
        WHERE {au.grantee.name} SUBSETEQ(
            SELECT SET{CURRENT_USER} + COALESCE(SUM(SET{t.g.name}), SET{})
            FROM db_user u, TABLE(groups) AS t(g)
            WHERE u.name = CURRENT_USER) AND  au.auth_type = 'SELECT');

다음 예제에서는 현재 사용자가 소유하고 있는 클래스를 검색한다.

SELECT class_name
FROM db_class
WHERE owner_name = CURRENT_USER;

  class_name
======================
  'stadium'
  'code'
  'nation'
  'event'
  'athlete'
  'participant'
  'olympic'
  'game'
  'record'
  'history'
'female_event'

다음 예제에서는 현재 사용자가 접근할 수 있는 가상 클래스를 검색한다.

SELECT class_name
FROM db_class
WHERE class_type = 'VCLASS';

  class_name
======================
  'db_stored_procedure_args'
  'db_stored_procedure'
  'db_partition'
  'db_trig'
  'db_auth'
  'db_index_key'
  'db_index'
  'db_meth_file'
  'db_meth_arg_setdomain_elm'
  'db_meth_arg'
  'db_method'
  'db_attr_setdomain_elm'
  'db_attribute'
  'db_vclass'
  'db_direct_super_class'
  'db_class'

다음 예제에서는 현재 사용자가 접근할 수 있는 시스템 클래스를 검색한다. (사용자는 PUBLIC )

SELECT class_name
FROM db_class
WHERE is_system_class = 'YES' AND class_type = 'CLASS'
ORDER BY 1;

  class_name
======================
  'db_authorization'
  'db_authorizations'
  'db_root'
  'db_serial'
  'db_user'

DB_DIRECT_SUPER_CLASS

데이터베이스 내에서 현재 사용자가 접근 권한을 가진 클래스에 대해 상위 클래스가 존재하면 그 클래스명을 보여준다.

속성명 데이터 타입 설명
class_name VARCHAR (255) 클래스명
super_class_name VARCHAR (255) 한 단계 상위 클래스명

정의

CREATE VCLASS db_direct_super_class (class_name, super_class_name)
AS
SELECT c.class_name, s.class_name
FROM _db_class c, TABLE(c.super_classes) AS t(s)
WHERE (CURRENT_USER = 'DBA' OR
        {c.owner.name} subseteq (
                SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
                from db_user u, table(groups) as t(g)
                where u.name = CURRENT_USER ) OR
        {c} subseteq (
SELECT sum(set{au.class_of})
                FROM _db_auth au
                WHERE {au.grantee.name} subseteq (
                            SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
                            from db_user u, table(groups) as t(g)
                            where u.name = CURRENT_USER ) AND
                                    au.auth_type = 'SELECT'));

다음 예제에서는 클래스 female_event 의 상위 클래스를 검색한다. (ADD SUPERCLASS 절 참조)

SELECT super_class_name
FROM db_direct_super_class
WHERE class_name = 'female_event';

  super_class_name
======================
  'event'

다음 예제에서는 현재 사용자가 소유하고 있는 클래스의 상위 클래스를 검색한다. (사용자는 PUBLIC )

SELECT c.class_name, s.super_class_name
FROM db_class c, db_direct_super_class s
WHERE c.class_name = s.class_name AND c.owner_name = user
ORDER BY 1;

  class_name            super_class_name
============================================
  'female_event'        'event'

DB_VCLASS

데이터베이스 내에서 현재 사용자가 접근 권한을 가진 가상 클래스들에 대해 그 SQL 정의문을 보여준다.

속성명 데이터 타입 설명
vclass_name VARCHAR (255) 가상 클래스명
vclass_def VARCHAR 4096) 가상 클래스의 SQL 정의문

정의

CREATE VCLASS db_vclass (vclass_name, vclass_def)
AS
SELECT q.class_of.class_name, q.spec
FROM _db_query_spec q
WHERE CURRENT_USER = 'DBA' OR
        {q.class_of.owner.name} subseteq (
                SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
                from db_user u, table(groups) as t(g)
                where u.name = CURRENT_USER ) OR
        {q.class_of} subseteq (
SELECT sum(set{au.class_of})
                FROM _db_auth au
                WHERE {au.grantee.name} subseteq (
                            SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
                            from db_user u, table(groups) as t(g)
                            where u.name = CURRENT_USER ) AND
                                    au.auth_type = 'SELECT');

다음 예제에서는 가상 클래스 db_class 의 SQL 정의문을 검색한다.

SELECT vclass_def
FROM db_vclass
WHERE vclass_name = 'db_class';

'SELECT c.class_name, CAST(c.owner.name AS VARCHAR(255)), CASE c.class_type WHEN 0 THEN 'CLASS' WHEN 1 THEN 'VCLASS' WHEN 2 THEN 'PROXY' ELSE 'UNKNOW' END, CASE WHEN MOD(c.is_system_class, 2) = 1 THEN 'YES' ELSE 'NO' END, CASE WHEN c.sub_classes IS NULL THEN 'NO' ELSE NVL((SELECT 'YES' FROM _db_partition p WHERE p.class_of = c and p.pname IS NULL), 'NO') END FROM _db_class c WHERE CURRENT_USER = 'DBA' OR {c.owner.name} SUBSETEQ (  SELECT SET{CURRENT_USER} + COALESCE(SUM(SET{t.g.name}), SET{})  FROM db_user u, TABLE(groups) AS t(g)  WHERE u.name = CURRENT_USER) OR {c} SUBSETEQ (  SELECT SUM(SET{au.class_of})  FROM _db_auth au  WHERE {au.grantee.name} SUBSETEQ (  SELECT SET{CURRENT_USER} + COALESCE(SUM(SET{t.g.name}), SET{})  FROM db_user u, TABLE(groups) AS t(g)  WHERE u.name = CURRENT_USER) AND  au.auth_type = 'SELECT')'

DB_ATTRIBUTE

데이터베이스 내에서 현재 사용자가 접근 권한을 가진 클래스에 대해 그 속성 정보를 보여준다.

속성명 데이터 타입 설명
attr_name VARCHAR (255) 속성명
class_name VARCHAR (255) 속성이 속한 클래스명
attr_type VARCHAR (8) 인스턴스 속성이면 'INSTANCE', 클래스 속성이면 'CLASS', 공유 속성이면 'SHARED'
def_order INTEGER 클래스에서 속성이 정의된 순서로 0부터 시작함. 상속받은 속성이면 그 상위 클래스에서 정의된 순서임.
from_class_name VARCHAR (255) 상속받은 속성이면 그 속성이 정의되어 있는 상위 클래스명이 설정되며, 그렇지 않으면 NULL
from_attr_name VARCHAR (255) 상속받은 속성이며, 이름 충돌이 발생하여 이를 해결하기 위해 그 속성명이 바뀐 경우, 상위 클래스에 정의된 원래 이름임. 그 이외에는 모두 NULL
data_type VARCHAR (9) 속성의 데이터 타입( _db_attribute 의 'CUBRID가 지원하는 데이터 타입' 표의 '의미' 중 하나)
prec INTEGER 데이터 타입의 전체 자릿수. 전체 자릿수가 명시되지 않은 경우 0임
scale INTEGER 데이터 타입의 소수점 이하의 자릿수. 소수점 이하의 자릿수가 명시되지 않은 경우 0임
code_set INTEGER 문자열 타입인 경우, 문자셋( _db_attribute 의 'CUBRID가 지원하는 문자셋' 표의 '값' 중 하나). 스트링 타입이 아닌 경우 0.
domain_class_name VARCHAR (255) 데이터 타입이 객체 타입인 경우 그 도메인 클래스명. 객체 타입이 아닌 경우 NULL
default_value VARCHAR (255) 기본값으 로서 그 데이터 타입에 관계없이 모두 문자열로 저장. 기본값이 없으면 NULL , 기본값이 NULL 이면 'NULL'로 표현됨. 데이터 타입이 객체 타입이면 'volume id | page id | slot id ', 컬렉션 타입이면 ' {element 1, element 2, ...}'로 표현됨.
is_nullable VARCHAR (3) not null 제약이 설정되어 있으면 'NO', 그렇지 않으면 'YES'

정의

CREATE VCLASS db_attribute (
attr_name, class_name, attr_type, def_order, from_class_name, from_attr_name, data_type, prec, scale, code_set, domain_class_name, default_value, is_nullable)
AS
SELECT a.attr_name, c.class_name,
       CASE WHEN a.attr_type = 0 THEN 'INSTANCE'
            WHEN a.attr_type = 1 THEN 'CLASS'
            ELSE 'SHARED' END,
       a.def_order, a.from_class_of.class_name, a.from_attr_name, t.type_name,
       d.prec, d.scale, d.code_set, d.class_of.class_name, a.default_value,
       CASE WHEN a.is_nullable = 0 THEN 'YES' ELSE 'NO' END
FROM _db_class c, _db_attribute a, _db_domain d, _db_data_type t
WHERE a.class_of = c AND d.object_of = a AND d.data_type = t.type_id AND
        (CURRENT_USER = 'DBA' OR
        {c.owner.name} subseteq (
                SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
                from db_user u, table(groups) as t(g)
                where u.name = CURRENT_USER ) OR
        {c} subseteq (
SELECT sum(set{au.class_of})
                FROM _db_auth au
                WHERE {au.grantee.name} subseteq (
                            SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
                            from db_user u, table(groups) as t(g)
                            where u.name = CURRENT_USER ) AND
                                    au.auth_type = 'SELECT'));

다음 예제에서는 클래스 event 의 속성과 각 데이터 타입을 검색한다.

SELECT attr_name, data_type, domain_class_name
FROM db_attribute
WHERE class_name = 'event'
ORDER BY def_order;

  attr_name             data_type             domain_class_name
==================================================================
  'code'                'INTEGER'             NULL
  'sports'              'STRING'              NULL
  'name'                'STRING'              NULL
  'gender'              'CHAR'                NULL
  'players'             'INTEGER'             NULL

다음 예제에서는 클래스 female_event 와 그 상위 클래스의 속성을 검색한다.

SELECT attr_name, from_class_name
FROM db_attribute
WHERE class_name = 'female_event'
ORDER BY def_order;

  attr_name             from_class_name
============================================
  'code'                'event'
  'sports'              'event'
  'name'                'event'
  'gender'              'event'
  'players'             'event'

다음 예제에서는 현재 사용자가 소유하고 있는 클래스 중에서 속성명이 name 과 유사한 클래스를 검색한다. (사용자는 PUBLIC)

SELECT a.class_name, a.attr_name
FROM db_class c join db_attribute a ON c.class_name = a.class_name
WHERE c.owner_name = CURRENT_USER AND attr_name like '%name%'
ORDER BY 1;

  class_name            attr_name
============================================
  'athlete'             'name'
  'code'                'f_name'
  'code'                's_name'
  'event'               'name'
  'female_event'        'name'
  'nation'              'name'
  'stadium'             'name'

DB_ATTR_SETDOMAIN_ELM

데이터베이스 내에서 현재 사용자가 접근 권한을 가진 클래스의 속성 중에서 그 데이터 타입이 컬렉션 타입(SET, MULTISET, SEQUENCE)인 경우, 그 컬렉션의 원소에 대한 데이터 타입을 보여준다.

속성명 데이터 타입 설명
attr_name VARCHAR(255) 속성명
class_name VARCHAR (255) 속성이 속한 클래스명
attr_type VARCHAR (8) 인스턴스 속성이면 'INSTANCE', 클래스 속성이면 'CLASS', 공유 속성이면 'SHARED'
data_type VARCHAR (9) 원소의 데이터 타입
Prec INTEGER 원소의 데이터 타입에 대한 전체 자릿수
scale INTEGER 원소의 데이터 타입에 대한 소수점 이하의 자릿수
code_set INTEGER 원소의 데이터 타입이 문자 타입인 경우 그 문자집합
domain_class_name VARCHAR (255) 원소의 데이터 타입이 객체 타입인 경우 그 도메인 클래스명

정의

CREATE VCLASS db_attr_setdomain_elm (
attr_name, class_name, attr_type,data_type, prec, scale, code_set, domain_class_name)
AS
SELECT a.attr_name, c.class_name,
       CASE WHEN a.attr_type = 0 THEN 'INSTANCE'
            WHEN a.attr_type = 1 THEN 'CLASS'
            ELSE 'SHARED' END,
       et.type_name, e.prec, e.scale, e.code_set, e.class_of.class_name
FROM _db_class c, _db_attribute a, _db_domain d,
      TABLE(d.set_domains) AS t(e), _db_data_type et
WHERE a.class_of = c AND d.object_of = a AND e.data_type = et.type_id AND
        (CURRENT_USER = 'DBA' OR
        {c.owner.name} subseteq (
                SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
                from db_user u, table(groups) as t(g)
                where u.name = CURRENT_USER ) OR
        {c} subseteq (
SELECT sum(set{au.class_of})
                FROM _db_auth au
                WHERE {au.grantee.name} subseteq (
                            SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
                            from db_user u, table(groups) as t(g)
                            where u.name = CURRENT_USER ) AND
                                    au.auth_type = 'SELECT'));

가령 클래스 D의 속성 set_attr 이 SET(A, B, C) 타입이면 다음 세 개의 레코드들이 존재하게 된다.

Attr_name Class_name Attr_type Data_type Prec Scale Code_set Domain_class_name
'set_attr' 'D' 'INSTANCE' 'SET' 0 0 0 'A'
'set_attr' 'D' 'INSTANCE' 'SET' 0 0 0 'B'
'set_attr' 'D' 'INSTANCE' 'SET' 0 0 0 'C'

다음 예제에서는 클래스 city 의 컬렉션 타입의 각 원소의 속성과 데이터 타입을 검색한다. (포함 연산자 에 정의한 city 테이블을 생성)

SELECT attr_name, attr_type, data_type, domain_class_name
FROM db_attr_setdomain_elm
WHERE class_name = 'city';

  attr_name             attr_type             data_type             domain_class_name
==============================================================================

'sports'              'INSTANCE'            'STRING'              NULL

DB_METHOD

데이터베이스 내에서 현재 사용자가 접근 권한을 가진 클래스에 대해 그 메서드 정보를 보여준다.

속성명 데이터 타입 설명
meth_name VARCHAR (255) 메서드명
class_name VARCHAR (255) 메서드가 속한 클래스명
meth_type VARCHAR (8) 인스턴스 메서드이면 'INSTANCE', 클래스 메서드이면 'CLASS'
from_class_name VARCHAR (255) 상속받은 메서드이면 그 메서드가 정의되어 있는 상위 클래스명이 설정되며 그렇지 않으면 NULL
from_meth_name VARCHAR (255) 상속받은 메서드이며, 이름 충돌이 발생하여 이를 해결하기 위해 그 메서드명이 바뀐 경우, 상위 클래스에 정의된 원래 이름이 설정됨. 그 이외에는 모두 NULL
func_name VARCHAR (255) 메서드에 대한 C 함수명

정의

CREATE VCLASS db_method (
meth_name, class_name, meth_type, from_class_name, from_meth_name, func_name)
AS

SELECT m.meth_name, m.class_of.class_name,
       CASE WHEN m.meth_type = 0 THEN 'INSTANCE' ELSE 'CLASS' END,
       m.from_class_of.class_name, m.from_meth_name, s.func_name
FROM _db_method m, _db_meth_sig s
WHERE s.meth_of = m AND
        (CURRENT_USER = 'DBA' OR
        {m.class_of.owner.name} subseteq (
                SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
                from db_user u, table(groups) as t(g)
                where u.name = CURRENT_USER ) OR
        {m.class_of} subseteq (
SELECT sum(set{au.class_of})
                FROM _db_auth au
                WHERE {au.grantee.name} subseteq (
                            SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
                            from db_user u, table(groups) as t(g)
                            where u.name = CURRENT_USER ) AND
                                    au.auth_type = 'SELECT'));

다음 예제에서는 클래스 db_user 의 메서드를 검색한다.

SELECT meth_name, meth_type, func_name
FROM db_method
WHERE class_name = 'db_user'
ORDER BY meth_type, meth_name;

  meth_name             meth_type             func_name
==================================================================
  'add_user'            'CLASS'               'au_add_user_method'
  'drop_user'           'CLASS'               'au_drop_user_method'
  'find_user'           'CLASS'               'au_find_user_method'
  'login'               'CLASS'               'au_login_method'
  'add_member'          'INSTANCE'            'au_add_member_method'
  'drop_member'         'INSTANCE'            'au_drop_member_method'
  'print_authorizations'  'INSTANCE'            'au_describe_user_method'
  'set_password'        'INSTANCE'            'au_set_password_method'
  'set_password_encoded'  'INSTANCE'            'au_set_password_encoded_method'
  'set_password_encoded_sha1'  'INSTANCE'            'au_set_password_encoded_sha1_method'

DB_METH_ARG

데이터베이스 내에서 현재 사용자가 접근 권한을 가진 클래스의 메서드에 대해 그 입출력 인자 정보를 보여준다.

속성명 데이터 타입 설명
meth_name VARCHAR (255) 메서드명
class_name VARCHAR (255) 메서드가 속한 클래스명
meth_type VARCHAR (8) 인스턴스 메서드이면 'INSTANCE', 클래스 메서드이면 'CLASS'
index_of INTEGER 인자가 함수 정의에 나열된 순서. 리턴 값이면 0, 입력인자이면 1부터 시작함
data_type VARCHAR (9) 인자의 데이터 타입
prec INTEGER 인자의 전체 자릿수
scale INTEGER 인자의 소수점 이하의 자릿수
code_set INTEGER 인자의 데이터 타입이 문자 타입인 경우 그 문자집합
domain_class_name VARCHAR (255) 인자의 데이터 타입이 객체 타입인 경우 도메인 클래스명

정의

CREATE VCLASS db_meth_arg (
meth_name, class_name, meth_type,
index_of, data_type, prec, scale, code_set, domain_class_name)
AS
SELECT s.meth_of.meth_name, s.meth_of.class_of.class_name,
       CASE WHEN s.meth_of.meth_type = 0 THEN 'INSTANCE' ELSE 'CLASS' END,
       a.index_of, t.type_name, d.prec, d.scale, d.code_set,
       d.class_of.class_name
FROM _db_meth_sig s, _db_meth_arg a, _db_domain d, _db_data_type t
WHERE a.meth_sig_of = s AND d.object_of = a AND d.data_type = t.type_id AND
        (CURRENT_USER = 'DBA' OR
        {s.meth_of.class_of.owner.name} subseteq (
                SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
                from db_user u, table(groups) as t(g)
                where u.name = CURRENT_USER ) OR
        {s.meth_of.class_of} subseteq (
SELECT sum(set{au.class_of})
                FROM _db_auth au
                WHERE {au.grantee.name} subseteq (
                            SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
                            from db_user u, table(groups) as t(g)
                            where u.name = CURRENT_USER ) AND
                                    au.auth_type = 'SELECT'));

다음 예제에서는 클래스 db_user 의 메서드 입력 인자를 검색한다.

SELECT meth_name, data_type, prec
FROM db_meth_arg
WHERE class_name = 'db_user';

  meth_name             data_type                    prec
=========================================================
  'append_data'         'STRING'               1073741823

DB_METH_ARG_SETDOMAIN_ELM

데이터베이스 내에서 현재 사용자가 접근 권한을 가진 클래스의 메서드에 대해 그 입/출력 인자의 데이터 타입이 집합 타입이면 그 집합의 원소에 대한 데이터 타입을 보여준다.

속성명 데이터 타입 설명
meth_name VARCHAR(255) 메서드명
class_name VARCHAR(255) 메서드가 속한 클래스명
meth_type VARCHAR (8) 인스턴스 메서드이면 'INSTANCE', 클래스 메서드이면 'CLASS'
index_of INTEGER 인자가 함수 정의에 나열된 순서. 리턴 값이면 0, 입력인자이면 1부터 시작함
data_type VARCHAR(9) 원소의 데이터 타입
prec INTEGER 원소의 전체 자릿수
scale INTEGER 원소의 소수점 이하의 자릿수
code_set INTEGER 원소의 데이터 타입이 문자 타입인 경우 그 문자집합
domain_class_name VARCHAR(255) 원소의 데이터 타입이 객체 타입인 경우 도메인 클래스명.

정의

CREATE VCLASS db_meth_arg_setdomain_elm(
meth_name, class_name, meth_type,
index_of, data_type, prec, scale, code_set, domain_class_name)
AS
SELECT s.meth_of.meth_name, s.meth_of.class_of.class_name,
       CASE WHEN s.meth_of.meth_type = 0 THEN 'INSTANCE' ELSE 'CLASS' END,
       a.index_of, et.type_name, e.prec, e.scale, e.code_set,
       e.class_of.class_name
FROM _db_meth_sig s, _db_meth_arg a, _db_domain d,
      TABLE(d.set_domains) AS t(e), _db_data_type et
WHERE a.meth_sig_of = s AND d.object_of = a AND e.data_type = et.type_id AND
        (CURRENT_USER = 'DBA' OR
        {s.meth_of.class_of.owner.name} subseteq (
                SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
                from db_user u, table(groups) as t(g)
                where u.name = CURRENT_USER ) OR
        {s.meth_of.class_of} subseteq (
SELECT sum(set{au.class_of})
                FROM _db_auth au
                WHERE {au.grantee.name} subseteq (
                            SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
                            from db_user u, table(groups) as t(g)
                            where u.name = CURRENT_USER ) AND
                                    au.auth_type = 'SELECT'));

DB_METH_FILE

데이터베이스 내에서 현재 사용자가 접근 권한을 가진 클래스에 대해 그 메서드가 정의된 파일 정보를 보여준다.

속성명 데이터 타입 설명
class_name VARCHAR(255) 메서드 파일이 속한 클래스명
path_name VARCHAR(255) C 함수가 정의된 파일의 경로
from_class_name VARCHAR(255) 상속받은 메서드이면 그 메서드 파일이 정의되어 있는 상위 클래스명이 설정. 그렇지 않으면 NULL

정의

CREATE VCLASS db_meth_file (class_name, path_name, from_class_name)
AS
SELECT f.class_of.class_name, f.path_name, f.from_class_of.class_name
FROM _db_meth_file f
WHERE (CURRENT_USER = 'DBA' OR
        {f.class_of.owner.name} subseteq (
                SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
                from db_user u, table(groups) as t(g)
                where u.name = CURRENT_USER ) OR
        {f.class_of} subseteq (
SELECT sum(set{au.class_of})
                FROM _db_auth au
                WHERE {au.grantee.name} subseteq (
                            SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
                            from db_user u, table(groups) as t(g)
                            where u.name = CURRENT_USER ) AND
                                    au.auth_type = 'SELECT'));

DB_INDEX

데이터베이스 내에서 현재 사용자가 접근 권한을 가진 클래스에 대해 생성된 인덱스에 대한 정보를 보여준다.

속성명 데이터 타입 설명
index_name VARCHAR(255) 인덱스명
is_unique VARCHAR(3) 고유 인덱스이면 'YES', 그렇지 않으면 'NO'
is_reverse VARCHAR(3) 역 인덱스(reverse indexd)이면 'YES', 그렇지 않으면 'NO'
class_name VARCHAR(255) 인덱스가 속한 클래스명
key_count INTEGER 키를 구성하는 속성의 개수
is_primary_key VARCHAR(3) 기본 키이면 'YES', 그렇지 않으면 'NO'
is_foreign_key VARCHAR(3) 외래 키이면 'YES', 그렇지 않으면 'NO'
filter_expression VARCHAR(255) 필터링된 인덱스의 조건
have_function VARCHAR(3) 함수 기반 인덱스이면 'YES', 그렇지 않으면 'NO'

정의

CREATE VCLASS db_index (index_name, is_unique, is_reverse, class_name, key_count, is_primary_key, is_foreign_key, filter_expression, have_function)
AS
SELECT i.index_name, CASE WHEN i.is_unique = 0 THEN 'NO' ELSE 'YES' END,
CASE WHEN i.is_reverse = 0 THEN 'NO' ELSE 'YES' END, i.class_of.class_name,
i.key_count,
CASE WHEN i.is_primary_key = 0 THEN 'NO' ELSE 'YES' END, CASE WHEN i.is_foreign_key = 0 THEN 'NO' ELSE 'YES' END, i.filter_expression,
CASE WHEN i.have_function = 0 THEN 'NO' ELSE 'YES' END
FROM _db_index i
WHERE (CURRENT_USER = 'DBA' OR
        {i.class_of.owner.name} subseteq (
                SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
                from db_user u, table(groups) as t(g)
                where u.name = CURRENT_USER ) OR
        {i.class_of} subseteq (
SELECT sum(set{au.class_of})
                FROM _db_auth au
                WHERE {au.grantee.name} subseteq (
                            SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
                            from db_user u, table(groups) as t(g)
                            where u.name = CURRENT_USER ) AND
                                    au.auth_type = 'SELECT'));

다음 예제에서는 클래스의 인덱스 정보를 검색한다.

SELECT class_name, index_name, is_unique
FROM db_index
ORDER BY 1;

  class_name            index_name            is_unique
==================================================================
  'athlete'             'pk_athlete_code'     'YES'
  'city'                'pk_city_city_name'   'YES'
  'db_serial'           'pk_db_serial_name'   'YES'
  'db_user'             'i_db_user_name'      'NO'
  'event'               'pk_event_code'       'YES'
  'female_event'        'pk_event_code'       'YES'
  'game'                'pk_game_host_year_event_code_athlete_code'  'YES'
  'game'                'fk_game_event_code'  'NO'
  'game'                'fk_game_athlete_code'  'NO'
  'history'             'pk_history_event_code_athlete'  'YES'
  'nation'              'pk_nation_code'      'YES'
  'olympic'             'pk_olympic_host_year'  'YES'
  'participant'         'pk_participant_host_year_nation_code'  'YES'
  'participant'         'fk_participant_host_year'  'NO'
  'participant'         'fk_participant_nation_code'  'NO'
  'record'              'pk_record_host_year_event_code_athlete_code_medal'  'YES'
  'stadium'             'pk_stadium_code'     'YES'
...

DB_INDEX_KEY

데이터베이스 내에서 현재 사용자가 접근 권한을 가진 클래스에 대해 생성된 인덱스에 대한 키 정보를 보여준다.

속성명 데이터 타입 설명
index_name VARCHAR(255) 인덱스명
class_name VARCHAR(255) 인덱스가 속한 클래스명
key_attr_name VARCHAR(255) 키를 구성하는 속성의 이름
key_order INTEGER 키에서 속성이 위치한 순서. 0부터 시작함
asc_desc VARCHAR(4) 속성 값의 순서가 내림차순이면 'DESC', 그렇지 않으면 'ASC'
key_prefix_length INTEGER 키로 사용할 prefix의 길이
func VARCHAR(255) 함수 기반 인덱스의 함수 표현식

정의

CREATE VCLASS db_index_key (index_name, class_name, key_attr_name, key_order, key_prefix_length, func)
AS
SELECT k.index_of.index_name, k.index_of.class_of.class_name, k.key_attr_name, k.key_order
CASE k.asc_desc
WHEN 0 THEN 'ASC'
WHEN 1 THEN 'DESC' ELSE 'UNKN' END,
k.key_prefix_length, k.func
FROM _db_index_key k
WHERE (CURRENT_USER = 'DBA' OR
    {k.index_of.class_of.owner.name}
    subseteq (
        SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
        from db_user u, table(groups) as t(g)
        where u.name = CURRENT_USER ) OR {k.index_of.class_of}
        subseteq (
            SELECT sum(set{au.class_of})
            FROM _db_auth au
            WHERE {au.grantee.name} subseteq (
                SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
                from db_user u, table(groups) as t(g)
                where u.name = CURRENT_USER ) AND
            au.auth_type = 'SELECT'));

다음 예제에서는 클래스의 인덱스 키 정보를 검색한다.

SELECT class_name, key_attr_name, index_name
FROM db_index_key
ORDER BY class_name, key_order;

  'athlete'             'code'                'pk_athlete_code'
  'city'                'city_name'           'pk_city_city_name'
  'db_serial'           'name'                'pk_db_serial_name'
  'db_user'             'name'                'i_db_user_name'
  'event'               'code'                'pk_event_code'
  'female_event'        'code'                'pk_event_code'
  'game'                'host_year'           'pk_game_host_year_event_code_athlete_code'
  'game'                'event_code'          'fk_game_event_code'
  'game'                'athlete_code'        'fk_game_athlete_code'
 ...

DB_AUTH

데이터베이스 내에서 현재 사용자가 권한을 가지는 클래스에 대한 권한 정보를 보여준다.

속성명 데이터 타입 설명
grantor_name VARCHAR(255) 권한을 부여한 사용자명
grantee_name VARCHAR(255) 권한을 받은 사용자명
class_name VARCHAR(255) 권한부여 대상인 클래스명
auth_type VARCHAR(7) 부여된 권한 타입명
is_grantable VARCHAR(3) 권한 받은 클래스에 대해 다른 사용자에게 권한을 부여할 수 있으면 'YES', 아니면 'NO'

정의

CREATE VCLASS db_auth (grantor_name, grantee_name, class_name, auth_type, is_grantable )
AS
SELECT CAST(a.grantor.name AS VARCHAR(255)),
        CAST(a.grantee.name AS VARCHAR(255)),
        a.class_of.class_name, a.auth_type,
        CASE WHEN a.is_grantable = 0 THEN 'NO' ELSE 'YES' END
FROM _db_auth a
WHERE (CURRENT_USER = 'DBA' OR
        {a.class_of.owner.name} subseteq (
                SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
                from db_user u, table(groups) as t(g)
                where u.name = CURRENT_USER ) OR
        {a.class_of} subseteq (
SELECT sum(set{au.class_of})
                FROM _db_auth au
                WHERE {au.grantee.name} subseteq (
                            SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
                            from db_user u, table(groups) as t(g)
                            where u.name = CURRENT_USER ) AND
                                    au.auth_type = 'SELECT'));

다음 예제에서는 이름이 db_a 로 시작되는 클래스의 권한 정보를 검색한다.

SELECT class_name, auth_type, grantor_name
FROM db_auth
WHERE class_name like 'db_a%'
ORDER BY 1;

  class_name            auth_type             grantor_name
==================================================================
  'db_attr_setdomain_elm'  'SELECT'             'DBA'
  'db_attribute'           'SELECT'             'DBA'
  'db_auth'                'SELECT'             'DBA'
  'db_authorization'       'EXECUTE'            'DBA'
  'db_authorization'       'SELECT'             'DBA'
  'db_authorizations'      'EXECUTE'            'DBA'
  'db_authorizations'      'SELECT'             'DBA'

DB_TRIG

데이터베이스 내에서 현재 사용자가 접근 권한을 가진 클래스나 그 소속 속성을 대상(target)으로 하는 트리거 정보를 보여준다.

속성명 데이터 타입 설명
trigger_name VARCHAR(255) 트리거명
target_class_name VARCHAR(255) 대상이 되는 클래스
target_attr_name VARCHAR(255) 대상이 되는 속성으로서 트리거에 명시되지 않으면 NULL
target_attr_type VARCHAR(8) 대상이 속성으로 명시될 경우, 인스턴스 속성이면 'INSTANCE', 클래스 속성이면 'CLASS'.
action_type INTEGER INSERT, UPDATE, DELETE, CALL 중 하나이면 1, REJECT이면 2, INVALIDATE_TRANSACTION이면 3, PRINT이면 4
action_time INTEGER BEFORE는 1, AFTER는 2, DEFERRED는 3으로 설정

정의

CREATE VCLASS db_trig (
trigger_name, target_class_name, target_attr_name, target_attr_type, action_type, action_time)
AS
SELECT CAST(t.name AS VARCHAR(255)), c.class_name,
        CAST(t.target_attribute AS VARCHAR(255)),
        CASE WHEN t.target_class_attribute = 0 THEN 'INSTANCE' ELSE 'CLASS' END,
        t.action_type, t.action_time
FROM _db_class c, db_trigger t
WHERE t.target_class = c.class_of AND
        (CURRENT_USER = 'DBA' OR
        {c.owner.name} subseteq (
                SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
                from db_user u, table(groups) as t(g)
                where u.name = CURRENT_USER ) OR
        {c} subseteq (
SELECT sum(set{au.class_of})
                FROM _db_auth au
                WHERE {au.grantee.name} subseteq (
                            SELECT set{CURRENT_USER} + coalesce(sum(set{t.g.name}), set{})
                            from db_user u, table(groups) as t(g)
                            where u.name = CURRENT_USER ) AND
                                    au.auth_type = 'SELECT'));

DB_PARTITION

데이터베이스 내에서 현재 사용자가 접근 권한을 가진 분할 클래스에 대한 정보를 보여준다.

속성명 데이터 타입 설명
class_name VARCHAR(255) 클래스명
partition_name VARCHAR(255) 파티션명
partition_class_name VARCHAR(255) 파티션 클래스 명
partition_type VARCHAR(32) 파티션 타입 (HASH, RANGE, LIST)
partition_expr VARCHAR(255) 파티션 표현식
partition_values SEQUENCE OF RANGE - MIN/MAX value - 무한의 MIN/MAX는 NULL LIST - value list

정의

CREATE VCLASS db_partition
(sp_name, sp_type, return_type, arg_count, lang, target, owner)
AS
SELECT p.class_of.class_name AS class_name, p.pname AS partition_name,
            p.class_of.class_name || '__p__' || p.pname AS partition_class_name,
            CASE WHEN p.ptype = 0 THEN 'HASH'
                 WHEN p.ptype = 1 THEN 'RANGE'
            ELSE 'LIST' ENDASpartition_type,
            TRIM(SUBSTRING( pi.pexpr FROM 8 FOR (POSITION(' FROM ' IN pi.pexpr)-8))) AS
                partition_expression,
            p.pvalues AS partition_values
FROM _db_partition p,
     ( select * from _db_partition sp
where sp.class_of =  p.class_of AND sp.pname is null) pi
WHERE p.pname is not null AND
      ( CURRENT_USER = 'DBA'
        OR
        {p.class_of.owner.name} SUBSETEQ
         ( SELECT SET{CURRENT_USER} + COALESCE(SUM(SET{t.g.name}), SET{})
           FROM db_user u, TABLE(groups) AS t(g)
           WHERE u.name = CURRENT_USER
         )
        OR
        {p.class_of} SUBSETEQ
         ( SELECT SUM(SET{au.class_of})
           FROM _db_auth au
           WHERE {au.grantee.name} SUBSETEQ
                 ( SELECT SET{CURRENT_USER} + COALESCE(SUM(SET{t.g.name}), SET{})
                   FROM db_user u, TABLE(groups) AS t(g)
                   WHERE u.name = CURRENT_USER) AND
                   au.auth_type = 'SELECT'
         )
      )

다음 예제에서는 participant2 클래스의 현재 구성된 분할 정보를 조회한다.

SELECT * from db_partition where class_name = 'participant2';

  class_name            partition_name        partition_class_name         partition_type   partition_expr        partition_values
====================================================================================================================================
  'participant2'        'before_2000'         'participant2__p__before_2000'  'RANGE'       'host_year'           {NULL, 2000}
  'participant2'        'before_2008'         'participant2__p__before_2008'  'RANGE'       'host_year'           {2000, 2008}

DB_STORED_PROCEDURE

데이터베이스 내에서 현재 사용자가 접근 권한을 가진 Java 저장 함수에 대한 정보를 보여준다.

속성명 데이터 타입 설명
sp_name VARCHAR(255) SP 이름
sp_type VARCHAR(16) SP 종류 (function or procedure)
return_type VARCHAR(16) 리턴 값 타입
arg_count INTEGER 매개변수 개수
lang VARCHAR(16) 구현 언어(현재로서는 JAVA)
target VARCHAR(4096) 실행될 Java 메서드 이름
owner VARCHAR(256) 소유자

정의

CREATE VCLASS db_stored_procedure
(sp_name, sp_type, return_type, arg_count, lang, target, owner)
AS
SELECT sp.sp_name,
            CASE sp.sp_type   WHEN 1 THEN 'PROCEDURE'
            ELSE 'FUNCTION' END,
            CASE WHEN sp.return_type = 0 THEN 'void'
                 WHEN sp.return_type = 28 THEN 'CURSOR'
            ELSE ( SELECT dt.type_name
                   FROM _db_data_type dt
                   WHERE sp.return_type = dt.type_id) END,
           sp.arg_count,
           CASE sp.lang   WHEN 1 THEN 'JAVA'
           ELSE '' END, sp.target, sp.owner.name
FROM _db_stored_procedure sp

다음 예제에서는 현재 사용자가 소유하고 있는 Java 저장 함수를 조회한다.

SELECT sp_name, target from db_stored_procedure
WHERE sp_type = 'FUNCTION' AND owner = CURRENT_USER

  sp_name               target
============================================
  'hello'               'SpCubrid.HelloCubrid() return java.lang.String'
  'sp_int'              'SpCubrid.SpInt(int) return int'

DB_STORED_PROCEDURE_ARGS

데이터베이스 내에서 현재 사용자가 접근 권한을 가진 Java 저장 함수의 인자에 대한 정보를 보여준다.

속성명 데이터 타입 설명
sp_name VARCHAR(255) SP 이름
index_of INTEGER 매개변수 순서
arg_name VARCHAR(256) 매개변수 이름
data_type VARCHAR(16) 매개변수 데이터 타입
mode VARCHAR(6) 모드 (IN, OUT, INOUT)

정의

CREATE VCLASS db_stored_procedure_args (sp_name, index_of, arg_name, data_type, mode)
AS
SELECT sp.sp_name, sp.index_of, sp.arg_name,
            CASE sp.data_type   WHEN 28 THEN 'CURSOR'
            ELSE ( SELECT dt.type_name FROM _db_data_type dt
                   WHERE sp.data_type = dt.type_id) END,
            CASE WHEN sp.mode = 1 THEN 'IN' WHEN sp.mode = 2 THEN 'OUT'
            ELSE 'INOUT' END
FROM _db_stored_procedure_args sp
ORDER BY sp.sp_name, sp.index_of ;

다음 예제에서는 'phone_info' Java 저장 프로시저의 인수 정보를 순서대로 조회한다.

SELECT index_of, arg_name, data_type, mode
FROM db_stored_procedure_args
WHERE sp_name = 'phone_info'
ORDER BY index_of

     index_of  arg_name              data_type             mode
===============================================================
            0  'name'                'STRING'              'IN'
            1  'phoneno'             'STRING'              'IN'

DB_COLLATION

콜레이션에 대한 정보이다.

속성명 데이터 타입 설명
coll_id INTEGER 콜레이션 ID
coll_name VARCHAR(255) 콜레이션 이름
charset_name VARCHAR(255) 문자셋 이름
is_builtin VARCHAR(3) 설치 시 제품 내 포함 여부(Yes, No)
has_expansions VARCHAR(3) 확장 포함 여부(Yes, No)
contractions INTEGER 축약 포함 여부
uca_strength VARCHAR(255) 가중치 세기(weight strength) (Not applicable, Primary, Secondary, Tertiary, Quaternary, Identity, Unknown)

정의

CREATE VCLASS db_collation (coll_id, coll_name, charset_name, is_builtin, has_expansions, contractions)
AS
SELECT c.coll_id, c.coll_name,
CASE c.charset_id
    WHEN 3 THEN 'iso8859-1'
    WHEN 5 THEN 'utf-8'
    WHEN 4 THEN 'euckr'
    WHEN 0 THEN 'ascii'
    WHEN 1 THEN 'raw-bits'
    WHEN 2 THEN 'raw-bytes'
    WHEN -1 THEN 'NONE'
ELSE 'OTHER' END,
CASE c.built_in
    WHEN 0 THEN 'No'
    WHEN 1 THEN 'Yes'
ELSE 'ERROR' END,
CASE c.expansions
    WHEN 0 THEN 'No'
    WHEN 1 THEN 'Yes'
ELSE 'ERROR' END, c.contractions,
CASE c.uca_strength
    WHEN 0 THEN 'Not applicable'
    WHEN 1 THEN 'Primary'
    WHEN 2 THEN 'Secondary'
    WHEN 3 THEN 'Tertiary'
    WHEN 4 THEN 'Quaternary'
    WHEN 5 THEN 'Identity'
ELSE 'Unknown' END
FROM _db_collation c ORDER BY c.coll_id;

카탈로그 클래스/가상 클래스 사용 권한

카탈로그 클래스들은 dba 소유로 생성된다. 그러나, dbaSELECT 연산만 수행할 수 있을 뿐이며, UPDATE / DELETE 등의 연산을 수행할 경우에는 authorization failure 에러가 발생한다. 일반 사용자는 시스템 카탈로그 클래스에 대해서 질의를 수행할 수 없다.

카탈로그 가상 클래스는 dba 소유로 생성되지만 모든 사용자가 카탈로그 가상 클래스에 대해 SELECT 문을 수행할 수 있다. 물론 카탈로그 가상 클래스에 대한 UPDATE / DELETE 연산은 수행이 불가능하다.

카탈로그 클래스/가상 클래스에 대한 갱신은 사용자가 클래스/속성/인덱스/사용자/권한을 생성/변경/삭제하는 DDL 문을 수행할 경우 시스템에 의해 자동으로 수행된다.

카탈로그 정보의 일관성

카탈로그 정보는 카탈로그 클래스/가상 클래스의 인스턴스에 의해 표현된다. READ UNCOMMITTED INSTANCES ( TRAN_REP_CLASS_UNCOMMIT_INSTANCE 혹은 TRAN_COMMIT_CLASS_UNCOMMIT_INSTANCE ) 격리 수준에서 이러한 인스턴스를 접근할 경우 정확하지 않은(변경 중인) 값을 읽을 수도 있다. 따라서, 정확한 카탈로그 정보를 얻기 위해서는 READ COMMITTED INSTANCES 격리 수준 이상에서 카탈로그 클래스/가상 클래스에 대해 SELECT 질의를 사용해야 한다.

카탈로그에 대한 질의

클래스, 가상 클래스, 속성, 트리거, 메서드, 인덱스 이름 등과 같은 식별자(identifier)는 모두 소문자로 변경되어 시스템 카탈로그에 저장된다. 따라서 시스템 카탈로그 클래스에 대해 대상 식별자를 검색하려면 소문자를 사용해야 한다. 반면, DB 사용자 이름은 대문자로 변경되어 db_user 시스템 카탈로그 테이블에 저장된다.

CREATE TABLE Foo(name varchar(255));
SELECT class_name, partitioned FROM db_class WHERE class_name = 'Foo';

There are no results.

SELECT class_name, partitioned FROM db_class WHERE class_name = 'foo';

  class_name   partitioned
============================
  'foo'       'NO'

CREATE USER tester PASSWORD 'testpwd';
SELECT name, password FROM db_user;

  name                  password
============================================
  'DBA'                 NULL
  'PUBLIC'              NULL
  'TESTER'              db_password