2009-12-09 4 views
0

삽입시 table_a의 기본 키로 사용할 다른 테이블 (table_b)의 available_id 필드에서 다음 사용 가능한 ID를 검색해야하는 테이블 (table_a)이 있습니다. , 그리고 table_b의 available_id 필드를 1 씩 증가시킵니다. 저장 프로 시저를 통해이를 수행하는 것이 쉽지만 테이블에 삽입 할 때마다이를 수행 할 수 있어야합니다.트리거를 사용하여 삽입시 ID 가져 오기

나는 트리거를 사용해야한다는 것을 알고 있지만 이것을 코딩하는 방법을 잘 모르겠습니다. 어떤 충고?

기본적으로 이것은 내 딜레마입니다.
전체적으로 고유 한 ID가 2 개의 다른 테이블에 있는지 확인해야합니다. GUID를 사용하지 않고이 작업을 수행하는 가장 좋은 방법은 무엇입니까? (이 코드의 일부는 우리의 목적으로는 제어 될 수없고, int의 ID가 필요하다.)

+2

왜 그런 식으로 아이디를 얻고 있습니까? 이것은 serios 동시성 문제를 가질 수있는 좋지 않은 방법입니다. – HLGEM

+1

HLGEM이 말한 것 - IDENTITY 열을 사용해야합니다 : http://sqlservernation.com/blogs/tipweek/archive/2009/02/23/identity-columns.aspx –

+0

테이블에 IDENTITY 열이 있습니다.이 테이블은 2 개의 테이블 (table_a 및 table_c)이 함께 결합되어 사용되는 별도의 기본 키입니다. 이것은 ID (IDENTITY와 별개 - 혼동스러운)가 중복되지 않도록하기위한 것입니다. 테이블 C에는 이와 동일한 "트리거"가 부착되어 있어야합니다. – Callie

답변

2

제 조언은하지 마십시오! 대신 ID 필드를 사용하십시오.

처음에는 삽입이 여러 레코드를 가질 수 있으므로이를 올바르게 수행하는 트리거는이를 기록해야하기 때문에 다소 까다로울 수 있습니다. 그것은 당신이 초기 값에 필요한 값 (ID 필드가 필요하다고 가정)을 갖지 않으므로 까다로운 트리거 대신 사용해야합니다. 두 번째 자리에서 동시에 두 개의 인서트가 동일한 번호를 선택하거나 한 번의 연결에서 많은 양의 데이터를 가져 오는 경우 두 번째 연결을 잠글 수 있습니다.

+1

+1 : 및 격리 수준으로 인해 업데이트 전에 읽기가 가능하여 고유 및/또는 기본 키 오류가 발생합니다 –

1

당신이 (당신의 삽입 루틴에 결과 값을 제공) 오라클 스타일의 시퀀스, 여기에 설명 된 트리거를 통해 또는 응용 프로그램 중 하나를 호출을 사용할 수

http://www.sqlteam.com/article/custom-auto-generated-sequences-with-sql-server

그는 이러한 문제를 언급 고려해야 할 사항 :

• 두 프로세스가 행을 정확히 시간에 테이블에 추가하려고하면 어떻게됩니까? 프로세스 모두에 대해 동일한 값이 생성되지 않도록 할 수 있습니까?

오버 헤드 기존 데이터 매번 질의가있을 수 있습니다 • 당신은 새로운 데이터

를 삽입하려는

이것은 트리거로 구현되지 않는 한 •이 즉 모든 삽입해야 항상 데이터에 을 통해 이 이러한 시퀀스를 계산하는 동일한 저장 프로 시저를 수행하십시오. 이 은 대량 가져 오기 또는 생산에서 테스트까지 데이터를 이동하고 등등을 수행 할 수 없거나 이 매우 비효율적 일 수 있음을 의미합니다.

• 트리거로 구현되는 경우 집합 기반 다중 행 INSERT 문에 대해 이 작동합니까? 그렇다면 얼마나 효율적일까요? 이 함수는 단일 집합 기반 INSERT 의 각 행에 대해 호출 된 경우 작동하지 않습니다. 반환 된 각 NextCustomerNumber()는 동일한 값입니다.

관련 문제