Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

[DocWiki 번역] 자동-증가 필드 (FireDAC)


Recommended Posts

Docwiki에 있는 "Auto-Incremental Fields (FireDAC)"를 번역한 글 (번역일: 2022년 3월 12일)

위로 가기: Editing Data (FireDAC)

목차


일반 사항 (Generalities)

FireDAC에서는 새 데이터를 추가할 때 자동-증가 필드를 반영하고, 이 컬럼의 새 값을 다시 받아올 수 있다. 즉시 업데이트를 할 때 뿐만 아니라 캐시된 업데이트를 할 때에도 작동한다. 자동-증가 필드는 위 두가지 방법 즉, "특별한 IDENTITY (또는 이와 유사한) 필드 데이터 타입 사용" 또는 "제너레이터 (또는 시퀀스)와 테이블 트리거 사용" 중 DBMS에 맞는 것을 사용하게 된다. 

DBMS 지동-증가 컬럼 구현 인식
Advantage Database AUTOINC 데이터 타입 자동-증가 데이터 타입일 때 자동 인식
Firebird
  • 제너레이터와 BEFORE INSERT 트리거
  • Firebird 3.0: 기본적으로 IDENTITY로 생성됨
자동 인식과 수동 지정 (아래 참조)
InterBase 제너레이터와 BEFORE INSERT 트리거 자동 인식과 수동 지정 (아래 참조)
IBM DB2 IDENTITY 데이터 타입처럼 생성됨 자동-증가 데이터 타입일 때 자동 인식
Informix SERIAL 데이터 타입 자동-증가 데이터 타입일 때 자동 인식
MS Access COUNTER 데이터 타입 자동-증가 데이터 타입일 때 자동 인식
MS SQL Server IDENTITY 데이터 타입 자동-증가 데이터 타입일 때 자동 인식
MySQL

AUTO_INCREMENT 데이터 타입

자동-증가 데이터 타입일 때 자동 인식
Oracle
  • 시퀀스와 BEFORE INSERT FOR EACH ROW 트리거
  • 오라클 12c와 그 이상:
    IDENTITY 데이터 타입처럼 생성됨
  • 수동 명시 (아래 참조)
  • 자동-증가 데이터 타입일 때 자동 인식
PostgreSQL SERIAL 데이터 타입 자동-증가 데이터 타입일 때 자동 인식
SQL Anywhere IDENTITY 데이터 타입 자동-증가 데이터 타입일 때 자동 인식
SQLite

INTEGER PRIMARY KEY AUTOINCREMENT 

데이터 타입
자동-증가 데이터 타입일 때 자동 인식
Sybase Adaptive Server Enterprise IDENTITY 데이터 타입 자동-증가 데이터 타입일 때 자동 인식
Teradata Database IDENTITY 데이터 타입처럼 생성됨 ExtendedMetadata가 True이면, 자동-증가 데이터 타입일 때 자동 인식

 

자동 인식 (Automatic Recognition)

FireDAC은 자동-증가 데이터 타입 컬럼을 스스로 인식하여, 해당 필드를 dtIntXxx, [caAutoInc, caReadOnly, caAllowNull]로 정의한다. 그 결과 TField는 아래와 같이 설정된다.

FireDAC은 파이어버드 (Firebird) 자동-증가 컬럼의 제한된 세트를 인식하여 해당 필드를 dtIntXxx, [caAutoInc, caAllowNull]로 정의한다. 이에 해당되는 상황은 다음과 같다.

  • extended metadata가 켜져있다;
  • 테이블에 BEFORE INSERT 트리거가 있다;
  • 트리거가 단일 컬럼과 단일 제너레이터에 의존한다. 이 경우 해당  컬럼은 자동-증가로 인식된다.


수동 명시 (Manual Specifying)

오라클에서 또는 파이어버드/인터베이스에서 자동 모드를 사용하지 않는 경우 또는 기타 컬럼들의 경우, 프로그래머가 직접 자동 증가 모드를 지정할 수 있다. 아래 방법 중 중 하나를 사용하면 된다.

  • UpdateOptions.AutoIncFields에 자동-증가 컬럼 이름 목록을 지정한다. 해당 컬럼의 데이터 타입이 dtInt32 / dtUInt32 이라면 TFDAutoIncField 필드가 생성된다.
  • 개발 화면에서 또는 실행 중에 TFDAutoIncField 필드를 생성한다. 이 컬럼의 필드 타입은 반드시 ftAutoInc / ftInteger / ftLongWord 이어야 한다. 그 외의 데이터 타입으로 된 필드이라면 데이터 타입 맵핑을 활용하여 TargetDataType = dtInt32으로 맵핑한다.
  • TField.AutoGenerateValue를 arAutoInc로 지정한다. 그러면 해당 필드는 자동 증가하게 된다. 이 방법은 TFDAutoIncField를 만들 지 않으며, 어떠한 필드 타입에서도 사용할 수 있다. 이때는 해당 필드에 추가로 ProviderFlags, Required, ReadOnly 등의 프로퍼티를 설정해야 할 필요가 있다.

위 방법 모두 그 결과는 결국 TField.AutoGenerateValue = arAutoInc 이다.

 

클라이언트 자동-증가 (Client Auto-incrementing)

기본적으로, FireDAC은 자동-증가 컬럼을 클라이언트에서 자동-증가 시킨다. 데이터셋의 Insert / Append 메소드가 처음 호출되면, 해당 자동-증가 컬럼에 -1 값이 들어간다. 그 후 메소드가 호출 마다 그 값은 -1 (음수) 씩 늘어난다. 클라이언트에서 할당된 값과 DBMS에서 할당된 값을 구별하기 위해서 이렇게 구현되었다.

UpdateOptions.RefreshMode <> rmManual 인 경우, 새 레코드가 포스트(Post)되고 나면, 해당 자동-증가 컬럼에 실제로 양수 값이 들어간다.

TFDAutoIncField는 프로퍼티들을 사용하여 클라이언트 측 자동-증가를 조정할 수 있다.

 

클라이언트 시퀀스 채우기 (Client Sequence Filling)

시퀀스(sequence) 또는 제너레이터(generator / synonym)를 지원하는 DBMS에서는, FireDAC이 클라이언트에 있는 시퀀스에서 자동-증가 컬럼을 채운다. 클라이언트 측에서 자동 증가하는 방법 중 하나이다.

자동-증가 컬럼의 TField.ProviderFlags 프로퍼티 안에는 반드시 pfInUpdate가 있어야 하고 아래에 있는 UpdateOptions.FetchGeneratorsPoint 값 중 하나가 있어야 한다. 

  • gpImmediate--제너레이터에서 다음 값으로 이동이 발생하는 곳은 TDataSet.Insert / Append 메소드 안이다. 그 값은 이미 TDataSet.OnNewRecord 이벤트 핸들러에서 접근할 수 있는 상태이다. TDataSet.Cancel 메소드가 호출되면, 이 값은 없어진다.
  • gpDeferred--제너레이터에서 다음 값으로 이동이 발생하는 곳은 TDataSet.Post 메소드 안이다.

UpdateOptions.GeneratorName 또는 TFDAutoIncField.GeneratorName에 해당 제너레이터 이름을 지정한다. 이 제너레이터는 다음 후속값을 받아올 때 사용된다.

 

범용 설정 (Universal Setup)

자동-증가 컬럼과 관련하여 아래 설정은 어느 DBMS에서든 모두 작동한다. 네이티브 자동-증가 컬럼 뿐만 아니라, 시퀀스와 트리거를 이용할 때에도 작동한다.

오라클, 파이어버드, 인터베이스에서는 자동-증가 컬럼을 수작업으로 명시해야 할 필요가 있다. 자동-증가 데이터 타입을 제공하는 데이터베이스를 사용한다면 별다른 설정을 하지 않아도 된다. 하지만 두 경우 모두, 이 설정은 명시한 그대로 작동한다.

 

마스터-디테일 다루기 (Master-Detail Handling)

마스터 데이터셋과 디테일 데이터셋이 마스터 데이터셋에 있는 자동-증가 컬럼에 의해 연결되어 있고, 캐시된 업데이트가 켜져있다면, 중앙집중식 캐시된 업데이트 모드를 사용하라. 그래야 마스터의 변경이 디테일 데이터셋에도 전파된다.

 

기타 자료

예제

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.