2016-08-25 3 views
1

최근에 Advantage Database Server를 백엔드로 사용하는 시스템 지원을 담당했습니다. 몇 가지 배경으로, 나는 수년간의 데이터베이스 경험을 가지고 있지만 지금까지 ADS를 사용해 본 적이 없으므로이 질문에 대한 순수한 질문은이 특정 DBMS에서 표준 패턴을 구현하는 방법에 관한 것입니다.Advantage Database Server에서 고유 대리 키 구현

는 이전에이 방식으로 ID 열을 관리하는 개발 된 저장 프로 시저있다 :

@ID = (SELECT ISNULL(MAX(ID), 0) FROM ExampleTable); 
@ID = @ID + 1; 

INSERT INTO Example_Table (ID, OtherStuff) 
VALUES (@ID, 'Things'); 

--Do some other stuff. 

UPDATE ExampleTable 
SET AnotherColumn = 'FOO' 
WHERE ID = @ID; 

내 문제는 내가 지금 병렬로이 저장 프로 시저를 여러 번 실행해야한다는 것입니다. 당신이 상상할 수 있듯이, 내가 이것을 할 때, 동일한 ID 값이 여러 번 부여 잡히고있다.

내가 필요한 것은 일관된 저장 프로 시저를 여러 번 실행하더라도 고유 한 값을 일관되게 만들 수있는 방법입니다. SQL 서버에서 나는 ID라는 IDENTITY 열을 만든 후 다음을 수행 할 수 :

INSERT INTO ExampleTable (OtherStuff) 
VALUES ('Things'); 

SET @ID = SCOPE_IDENTITY(); 

ADS를 비슷한 것 같다 autoinc을 가지고,하지만 난 아무것도 결정적으로 새로 값을 반환하는 방법을 말해 찾을 수 없습니다 100 % 확신 할 수있는 방식으로 생성 된 가치는 동시 사용에서 정확합니다. ADS Developer 's Guide는 실제로 autoinc 사용에 대해 경고하고 온라인 도움말 파일은 마지막으로 생성 된 autoinc ID를 검색하는 것처럼 보이는 기능을 제공합니다. (이는 내가 원한 것이 아닙니다. 마지막 문장이 아닌 이전 명령문에서 작성한 것을 원합니다. 모든 세션에서 생성됨). 도움말 파일에는 동시성과 관련된 상황에서 올바르게 작동하지 않을 수도있는 경고와 함께이 기능이 나열되어 있습니다.

어떻게 이것을 ADS에 구현할 수 있습니까? autoinc을 사용해야하나요? 내가 알지 못하는 다른 기본 제공 방식을 사용하거나 개발자 안내서에서 제시 한대로해야 할 필요가있는 부분을 먼저 작성한 다음 고유 한 식별자를 생성해야합니다. autoinc을 사용해야한다면 방금 테이블에 삽입 된 값을 어떻게 얻을 수 있습니까?

답변

2

LastAutoInc(STATEMENT)autoinc과 함께 사용합니다. documentation에서

(이점에서 SQL-> 지원되는 SQL Grammar-> 지원 스칼라 Functions-> 기타) :

LASTAUTOINC (연결 | STATEMENT)

가에서 마지막으로 사용 된 자동 증가 (Autoinc)의 값을 반환 삽입하거나 추가하십시오. CONNECTION을 지정하면 전체 연결에 마지막으로 사용 된 값이 반환됩니다. STATEMENT를 지정하면 현재 SQL 문에 대해서만 마지막으로 사용 된 값이 리턴됩니다. autoinc 값이 아직 업데이트되지 않은 경우 NULL 값이 반환됩니다.

참고 : autoinc 필드가있는 테이블에서 작동하는 트리거는 마지막 autoinc 값에 영향을 줄 수 있습니다.

참고 : SQL 스크립트 트리거는 고유 한 SQL 문에서 실행됩니다. 따라서 SQL 스크립트 트리거 내에서 LASTAUTOINC (STATEMENT)를 호출하면 트리거를 시작한 원본 SQL 문이 아니라 트리거의 SQL 문에서 사용한 lastautoinc 값이 반환됩니다. 마지막 원본 SQL 문의 lastautoinc 값을 얻으려면 대신 LASTAUTOINC (CONNECTION)를 사용하십시오.

예 : 시스템에서 SELECT LASTAUTOINC (STATEMENT)를 선택하십시오.Iota

+0

감사합니다 아주 많이 ! 나는 autoinc 및 LastAutoInc에 대해 발견 한 정보가 유효 기간이 지났다고 생각합니다. LastAutoInc을 CONNECTION 및 STATEMENT와 함께 사용했지만 동시성 문제가 해결되는지 여부에 대한 정보는 제공하지 않았습니다. LastAutoInc (STATEMENT)는 이제 내가 쫓고있는 것과 똑같은 소리가납니다. –

0

또 다른 옵션은 GUID를 사용하는 것입니다.

(확실하지 않았지만 라고 말하면 이미 이것을 암시했거나 개발자 가이드에서 제시 한대로 진정으로해야 할 일이며 내 고유 식별자를 생성해야합니다. - 그렇다고해도 그래도이 정보는 다른 사람들에게 유용 할 수 있습니다.)

대리 키로 GUID를 사용하면 응용 프로그램이나 데이터베이스에서 a guarantee of no clashes과 같이 고유 한 식별자를 만들 수 있습니다. .

의 장점 (12)가 내장되어 지원 GUID를 데이터 형식에 대해 :

GUID 및 64 비트 정수 필드 유형

어드밴티지 서버와 클라이언트 지금 지원 GUID와 긴 정수 (64 비트) 데이터 형식을 모든 테이블 형식으로. 64 비트 정수 유형은 정수의 손실없이 -9,223,372,036854775807 및 9,223,372,036854775807 사이의 정수 값을 저장하는 데 사용할 수 있습니다. GUID (전역 고유 식별자) 필드 형식은 16 바이트 데이터 구조입니다. 새로운 스칼라 함수 NewID()는 새로운 GUID를 생성하기 위해 표현 엔진과 SQL 엔진에서 사용할 수 있습니다. 자세한 내용은 ADT 필드 형식 및 사양 및 DBF 필드 형식 및 사양을 참조하십시오.

http://scn.sap.com/docs/DOC-68484

이전 버전의 경우는 char(36)로 GUID를 저장할 수 있습니다. 여기서 performance 요구 사항에 대해 생각해보십시오. 그런 다음 GUID와 문자열 사이의 응용 프로그램 계층에서 앞뒤로 약간의 변환을 수행해야합니다. 일부 중간 데이터 액세스 레이어를 사용하는 경우 NHibernate 또는 Entity Framework를 사용하면 적어도 한 곳으로 변환을 현지화 할 수 있어야합니다.

로직의 일부가 저장 프로 시저에있는 경우, 당신은 백업 컬럼의 유형에 따라 newid() 또는 newidstring() 기능을 사용할 수 있어야합니다 : 빠른 응답

INSERT INTO Example_Table (newid(), OtherStuff) 
관련 문제