프린트 하기

내맘대로긍정이 알려주는

Oracle 23ai 신기능
무료 세미나 발표자료

다운로드 trending_flat

OS 환경 : Oracle Linux 8.4 (64bit)

 

DB 환경 : Oracle Database 23.4.0.24.05 ai Free

 

방법 : 오라클 23ai 신기능 테이블 주석 기능(Annonation)

오라클 23ai 버전부터 테이블 컬럼에 Annotation(주석) 기능을 사용할 수 있음
이 기능은 db 내에서 테이블, 컬럼, 인덱스 등 다양한 데이터베이스 오브젝트에 메타데이터나 설명을 추가할 수 있는 기능임

 

좀더 자세히 설명하자면
Annotation 은 개발자가 데이터베이스 스키마 오브젝트에 사용 속성을 중앙에서 등록할 수 있는 경량 선언적 도구임
Annotation 은 dictionary table 에 저장되고, 관련 애플리케이션에서 데이터를 표준화하는 데 사용할 수 있음
데이터베이스에서 해석되지는 않으며, 테이블, 컬럼, 인덱스 등의 메타데이터로 저장됨, 이를 통해 애플리케이션 로직을 맞춤 설정하거나 사용자 인터페이스를 렌더링할 때 추가 속성 메타데이터로 사용할 수 있음

 

 

Annotation 은 데이터베이스 내에서 애플리케이션 메타데이터를 정의하고 중앙에서 저장하는 메커니즘임
이를 통해 애플리케이션, 모듈, 마이크로서비스 간에 메타데이터 정보를 공유할 수 있음. 새로운 스키마 오브젝트를 생성하거나(CREATE 문), 기존 오브젝트를 수정할 때(ALTER 문) Annotation을 추가할 수 있음
데이터 모델에 메타데이터로 Annotation을 추가하면 데이터 무결성, 일관성, 그리고 데이터 모델 문서화 측면에서 이점을 제공함
애플리케이션은 다른 애플리케이션이나 사용자가 검색할 수 있는 사용자 정의 메타데이터를 데이터베이스 오브젝트와 테이블 컬럼에 저장할 수 있음
데이터를 메타데이터와 함께 저장함으로써 데이터 일관성을 유지하고, 데이터를 사용하는 모든 사용자나 애플리케이션에서 쉽게 접근할 수 있음

 

 

각각의 Annotation 은 이름과 선택적 값을 가짐.
이름과 값은 자유 형식 텍스트으로 사용가능함, 예를 들어 "Display_Label 'Employee Salary'"와 같은 이름-값 쌍을 만들 수 있음
또는 이름만 가진 Annotation 도 가능하며, "UI_Hidden"과 같은 값이 필요 없는 경우 이름만으로도 지정 가능함

 

 

Annotation의 추가 세부 사항
- CREATE DDL 문을 사용할 때 스키마 오브젝트에 Annotation 이름을 지정하면 자동으로 Annotation이 생성됨
- Annotation은 하나의 스키마 오브젝트에 여러 개를 추가할 수 있어, 기존의 Annotation을 덮어쓰지 않고 새로운 Annotation을 계속해서 더해나갈 수 있음(누적)
- 하나의 DDL 문을 사용하여 여러 Annotation을 한 번에 추가하거나 제거할 수 있음
- Annotation 은 추가된 데이터베이스 오브젝트의 하위 요소로 표시되며, 새로운 오브젝트 타입을 생성하지 않음
- Annotation을 지원하는 스키마 오브젝트에 대해 소유권 또는 수정 권한이 있으면 Annotation을 추가할 수 있음 Annotation 이름은 스키마 자격을 요구하지 않음
- SQL 쿼리를 통해 사전 뷰에서 모든 Annotation을 이름, 값과 함께 조회하고, 스키마 오브젝트와의 연관성을 확인할 수 있음

 

 

기존에 존재하던 기능인 Comment 와의 주요 차이점
- Comment 는 테이블, 컬럼 등의 특정 스키마 오브젝트에 메타데이터를 추가하는 주석 메커니즘임, 인덱스나 트리거 등에는 사용할 수 없음
- Comment 는 이름이 없고, 하나의 자유 형식 값을 가짐, 새로운 comment 를 추가하면 이전 comment 를 덮어씀
- Annotation 은 더 광범위하게 사용 가능하고, 여러 개의 주석을 한 번에 추가할 수 있음

 

 

Annotation 사용 가능한 오브젝트 종류
- 테이블과 테이블 컬럼
- 뷰와 뷰 컬럼
- Materialized 뷰와 Materialized 뷰 컬럼
- 인덱스
- 도메인 및 multi-column 도메인 컬럼

 

 

Annotation 구문

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
annotations
         ::= 'ANNOTATIONS' '(' annotations_list ')'
 
annotations_list
         ::= ( 'ADD' ('IF NOT EXISTS' | 'OR REPLACE' )? | 'DROP' 'IF EXISTS'? | REPLACE)?
 annotation ( ',' ( 'ADD' ('IF NOT EXISTS' | 'OR REPLACE' )? | 'DROP' 'IF EXISTS'? | REPLACE)?
 annotation )*
 
annotation
         ::= annotation_name annotation_value?
 
annotation_name
         ::= identifier
 
annotation_value
         ::= character_string_literal

구문 설명
는 최대 4000자까지 표현할 수 있는 문자열 리터럴임
는 식별자이며 다음과 같은 요구 사항을 가짐
- 식별자는 최대 1024자까지 가능함
- 식별자가 예약된 단어인 경우 주석 이름을 큰따옴표로 묶어 제공해야 함
- 큰따옴표가 있는 식별자에는 공백 문자가 포함될 수 있음
- white characters(공백, 탭 등)만 포함된 식별자는 허용되지 않음

 

 

사용 예제
1. annonation 추가
2. annonation 수정
3. annonation 제거

 

 

사용 예제
emp 테이블이 없다면 생성
참고 : 오라클 EMP, DEPT table 생성 스크립트 ( https://positivemh.tistory.com/99 )

 

 

1. annonation 추가
emp 테이블에 annonation 을 추가
emp 테이블의 목적(Table Purpose)은 사원 관리용이고, 데이터 민감성(Data Sensitivity)은 기밀로 annonation 을 추가함

1
2
3
4
5
6
7
SQL>
ALTER TABLE emp ANNOTATIONS (
ADD "Table Purpose" 'Used by HR system for employee management',
ADD "Data Sensitivity" 'Confidential'
);
 
Table altered.

 

 

emp 테이블의 특정 컬럼에 annonation 을 추가
emp 테이블의 sal 컬럼의 목적(Display Label)은 직원 급여이고, 통화(Currency)는 USD 라는것을 주석으로 표시해줌
emp 테이블의 empno 컬럼의 목적(Display Label)은 직원 번호이고, 기본키(Primary Key)이기 때문에 Yes 로 주석을 표시해줌

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SQL>
ALTER TABLE emp MODIFY sal ANNOTATIONS (
ADD "Display Label" 'Employee Salary',
ADD "Currency" 'USD',
ADD "UI_Hidden" -- 값이 필요 없는 Annotation
);
 
Table altered.
 
SQL>
ALTER TABLE emp MODIFY empno ANNOTATIONS (
ADD "Display Label" 'Employee Number',
ADD "Primary Key" 'Yes'
);
 
Table altered.

 

 

추가한 annonation 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SQL> 
set lines 200 pages 1000
col object_name for a10
col object_type for a10
col column_name for a10
col domain_name for a10
col domain_owner for a10
col annotation_name for a20
col annotation_value for a50
select object_name, object_type, column_name, domain_name, domain_owner, annotation_name, annotation_value
from user_annotations_usage
where object_name = 'EMP'
order by column_name desc, annotation_name, annotation_value;
 
OBJECT_NAM OBJECT_TYP COLUMN_NAM DOMAIN_NAM DOMAIN_OWN ANNOTATION_NAME      ANNOTATION_VALUE
---------- ---------- ---------- ---------- ---------- -------------------- --------------------------------------------------
EMP        TABLE                                       Data Sensitivity     Confidential
EMP        TABLE                                       Table Purpose        Used by HR system for employee management
EMP        TABLE      SAL                              Currency             USD
EMP        TABLE      SAL                              Display Label        Employee Salary
EMP        TABLE      SAL                              UI_Hidden
EMP        TABLE      EMPNO                            Display Label        Employee Number
EMP        TABLE      EMPNO                            Primary Key          Yes

column_name 값이 없는 row 가 테이블에 대한 annonation 값임

 

 

2. annonation 수정
emp 테이블의 annonation 을 수정

1
2
3
4
5
6
SQL> 
ALTER TABLE emp ANNOTATIONS (
REPLACE "Data Sensitivity" 'Public'
);
 
Table altered.

 

 

emp 테이블 특정 컬럼의 annonation 을 수정

1
2
3
4
5
6
SQL>
ALTER TABLE emp MODIFY sal ANNOTATIONS (
REPLACE "Currency" 'KRW'
);
 
Table altered.

 

 

수정한 annonation 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SQL> 
set lines 200 pages 1000
col object_name for a10
col object_type for a10
col column_name for a10
col domain_name for a10
col domain_owner for a10
col annotation_name for a20
col annotation_value for a50
select object_name, object_type, column_name, domain_name, domain_owner, annotation_name, annotation_value
from user_annotations_usage
where object_name = 'EMP'
order by column_name desc, annotation_name, annotation_value;
 
OBJECT_NAM OBJECT_TYP COLUMN_NAM DOMAIN_NAM DOMAIN_OWN ANNOTATION_NAME      ANNOTATION_VALUE
---------- ---------- ---------- ---------- ---------- -------------------- --------------------------------------------------
EMP        TABLE                                       Data Sensitivity     Public <<<
EMP        TABLE                                       Table Purpose        Used by HR system for employee management
EMP        TABLE      SAL                              Currency             KRW <<<
EMP        TABLE      SAL                              Display Label        Employee Salary
EMP        TABLE      SAL                              UI_Hidden
EMP        TABLE      EMPNO                            Display Label        Employee Number
EMP        TABLE      EMPNO                            Primary Key          Yes
 
7 rows selected.

정상적으로 변경됨

 

 

3. annonation 제거
emp 테이블의 annonation 을 제거

1
2
3
4
5
6
SQL> 
ALTER TABLE emp ANNOTATIONS (
DROP "Data Sensitivity"
);
 
Table altered.

 

 

emp 테이블 특정 컬럼의 annonation 을 제거

1
2
3
4
5
6
SQL>
ALTER TABLE emp MODIFY sal ANNOTATIONS (
DROP "Currency"
);
 
Table altered.

 

 

수정한 annonation 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SQL> 
set lines 200 pages 1000
col object_name for a10
col object_type for a10
col column_name for a10
col domain_name for a10
col domain_owner for a10
col annotation_name for a20
col annotation_value for a50
select object_name, object_type, column_name, domain_name, domain_owner, annotation_name, annotation_value
from user_annotations_usage
where object_name = 'EMP'
order by column_name desc, annotation_name, annotation_value;
 
OBJECT_NAM OBJECT_TYP COLUMN_NAM DOMAIN_NAM DOMAIN_OWN ANNOTATION_NAME      ANNOTATION_VALUE
---------- ---------- ---------- ---------- ---------- -------------------- --------------------------------------------------
EMP        TABLE                                       Table Purpose        Used by HR system for employee management
EMP        TABLE      SAL                              Display Label        Employee Salary
EMP        TABLE      SAL                              UI_Hidden
EMP        TABLE      EMPNO                            Display Label        Employee Number
EMP        TABLE      EMPNO                            Primary Key          Yes

정상적으로 제거됨

 

 

결론 : user_annotations_usage 나 all_annotations_usage, dba_annotations_usage 뷰를 이용해 annotation 을 쉽게 확인할 수 있어
이 기능을 잘 활용해 메타 정보를 db 안에도 잘 넣어둔다면 추후 차세대 프로젝트나 이관을 할때 da 파트에서 더 유용하게 사용 가능할듯함
또한 기존에 만들어진 메타데이터도 스크립트를 작성하여 23ai 버전의 db 안에 넣어둔다면 굳이 메타를 정의하는 툴을 구매하지 않고 사용도 가능할듯함

 

 

참조 : 

https://positivemh.tistory.com/1163

https://apex.oracle.com/pls/apex/features/r/dbfeatures/features?feature_id=1696
https://docs.oracle.com/en/database/oracle/oracle-database/23/cncpt/application-data-usage.html#GUID-D5D5615C-BB2C-4833-A9AF-6BAF0BF9CEC0
https://docs.oracle.com/en/database/oracle/oracle-database/23/adfns/registering-application-data-usage-database.html#GUID-2DAF069E-0938-40AF-B05B-75AFE71D666C
https://apex.oracle.com/pls/apex/features/r/dbfeatures/features?feature_id=1712
https://oracle-base.com/articles/23/annotations-23
https://tuna.tistory.com/85
http://www.koreaoug.org/c23_free/12217