Kori 3월 12일, 2022에 포스트됨 공유하기 3월 12일, 2022에 포스트됨 Docwiki에 있는 "Auto-Incremental Fields (FireDAC)"를 번역한 글 (번역일: 2022년 3월 12일) 위로 가기: Editing Data (FireDAC) 목차 일반 사항 (Generalities) 자동 인식 (Automatic Recognition) 수동 명시 (Manual Specifying) 클라이언트 자동-증가 (Client Auto-incrementing) 클라이언트 시퀀스 채우기 (Client Sequence Filling) 범용 설정 (Universal Setup) 마스터-디테일 다루기 (Master-Detail Handling) 기타 자료 예제 일반 사항 (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는 아래와 같이 설정된다. TField.DataType = ftAutoInc (TFDAutoIncField) dtInt32 또는 dtUInt32 일때; 그외는 ftXxxx 숫자 데이터 타입; TField.Required = False; TField.ReadOnly = True; TField.ProviderFlags = [pfInWhere], 또는 이 컬럼이 프러이머리 키에 해당할 경우에는 [pfInWhere, pfInKey]. 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는 프로퍼티들을 사용하여 클라이언트 측 자동-증가를 조정할 수 있다. ClientAutoIncrement: 켜거나 끈다; AutoIncrementSeed: 최초 값을 명시한다; AutoIncrementStep: 증가 단위를 명시한다. 클라이언트 시퀀스 채우기 (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에서든 모두 작동한다. 네이티브 자동-증가 컬럼 뿐만 아니라, 시퀀스와 트리거를 이용할 때에도 작동한다. UpdateOptions.FetchGeneratorsPoint = gpNone 이면, "클라이언트에서 시퀀스 채우기"는 비활성화(disabled)된다. TField.ProviderFlags의 값이 pfInUpdate 이면, 그 컬럼은 INSERT / UPDATE 절에서 빠진다. FetchOptions.Items가 fiMeta로 지정되어 있으면, 해당 컬럼은 자동-증가로 인식된다. 오라클, 파이어버드, 인터베이스에서는 자동-증가 컬럼을 수작업으로 명시해야 할 필요가 있다. 자동-증가 데이터 타입을 제공하는 데이터베이스를 사용한다면 별다른 설정을 하지 않아도 된다. 하지만 두 경우 모두, 이 설정은 명시한 그대로 작동한다. 마스터-디테일 다루기 (Master-Detail Handling) 마스터 데이터셋과 디테일 데이터셋이 마스터 데이터셋에 있는 자동-증가 컬럼에 의해 연결되어 있고, 캐시된 업데이트가 켜져있다면, 중앙집중식 캐시된 업데이트 모드를 사용하라. 그래야 마스터의 변경이 디테일 데이터셋에도 전파된다. 기타 자료 [DocWiki 번역] 고유 식별 필드 (FireDAC) Update Command Generation [DocWiki 번역] 캐시된 업데이트 (FireDAC) 예제 FireDAC Autoinc Fields 예제 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
Recommended Posts
이 토의에 참여하세요
지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.