2014-04-07 5 views
0

IDENT_CURRENT을 사용하면 정확한 ID 값을 반환하지 않는다는 점을 알고 있습니다 (특히 멀티 스레드 응용 프로그램에서 특히 그렇음). 대신 SCOPE_IDENTITY()을 사용하고 싶었습니다.제약 조건에서 SCOPE_IDENTITY() 사용

alter table Employee 
    add constraint Employee_D1 default ident_current('Employee') for SystemID 

내가 대신 SCOPE_IDENTITY()를 사용하여 수정해야 : 나는 아래의 문이

create table Employee 
(
    ID  int identity(1,1), 
    Name varchar(20), 
    SystemID int, 
    constraint Employee_PK primary key (ID asc) 
) 

:

예를 들어이 내 Employee 테이블입니다.

나는 아래 시도 :

alter table Employee 
    add constraint Employee_D1 default SCOPE_IDENITITY() for SystemID 

이 오류를 포기하지 않았다. 그러나 행을 삽입 할 때이 열이 ID 값으로 업데이트되는 것을 보지 못했습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

SystemID은 읽기 전용이 아니어야하므로 계산 된 필드는 옵션이 아닙니다.

여기 내 연습은 병렬 프로세스가 행을 삽입하려고 시도 할 때 IDENTITY 값이 SystemID에 잘못 입력 된 것을 제거하는 것입니다.

+0

문제는 IDENT_CURRENT와이다 (내가 본 발명의 기분 아니에요, 가난한 필드 이름에 대한 사과)이 문제를 접근하는 것 방법 그렇지 않으면 세션에 대한 마지막 신원 값을 제공하므로 사용하는 것이 안전해야합니다. SCOPE_IDENTITY는 현재 세션에서만 작동하므로 가치가 없다고 생각합니다. 하지만 제약 조건에서 얻는 이점이 무엇인지 확신 할 수 없습니까? –

+0

Allan과 동의 - 기본값이 'SCOPE_IDENTITY' 인 열을 가져야한다는 점은 무엇입니까 ?? 테이블에 고유 한 값이 필요한 경우 - 'INT IDENTITY' 유형의 컬럼을 사용하십시오. 그러나 동일한 값을 갖는 두 번째 컬럼을 갖는 이점은 무엇입니까? 이런 식으로해야한다면 - ON INSERT 트리거를 사용할 필요가 있습니다 .... –

+0

'ID'는'IDENTITY' 열입니다 - 당신이'SystemID'를 확실히하려고합니까? 항상'ID'와 동일합니까? 또는 다른 테이블의 ID에? –

답변

1

답변을 다시 읽으십시오. SystemID는 ID 열이 아닙니다. SCOPE_IDENITITY()는 행을 추가하지 않았으므로 값을 저장해야하는 시점에서 새 Identity 값을 검색하므로 사용할 수 없다고 생각합니다.

트리거를 만들려면 행을 삽입 한 후 SystemId 값을 업데이트해야합니다. 여기 CREATE TRIGGER

+0

병렬 프로세스가 행을 삽입 할 때'AFTER INSERT' 트리거가 올바른 ID 값으로'SystemID'를 업데이트하는 데 도움이됩니까? – aliensurfer

+0

예. 트리거에서 삽입 된 테이블을 사용하여 새 ID를 가져 오는 한. http://technet.microsoft.com/en-us/library/ms191300.aspx – sarin

0

난 당신이 다음을 예측하는 데 사용하는 경우

CREATE TABLE employees (
    id    int identity(1,1) NOT NULL 
, name    varchar(20)  NOT NULL 
, actual_system_id int     NULL 
, system_id As Coalesce(actual_system_id, id) 
, CONSTRAINT pk_employees PRIMARY KEY (id) 
) 
; 

INSERT INTO employees (name) 
    VALUES ('John') 
     , ('Paul') 
     , ('George') 
     , ('Ringo') 
; 

SELECT id 
    , name 
    , system_id 
FROM employees 
; 

UPDATE employees 
SET actual_system_id = 937 
WHERE name = 'George' 
; 

SELECT id 
    , name 
    , system_id 
FROM employees 
;