2010-05-12 5 views
3

내 문제는 C#의 SQL 엔티티에 LINQ로 매핑되는 SQL 뷰 (MS SQL 2005)에서 업데이트 트리거가 있다는 것입니다. ...@@ identity가 기본 키 또는 ID 필드를 반환합니까?

SQL은 올바르게 보이지만 2 차 테이블 PK 필드에 널 값을 삽입하십시오.

기본 테이블에서 기본 키와 ID를 별도의 필드로 사용하는 것과 관련이 있다고 생각합니다. 그래서 내 질문은 .... @@ 신분을 사용하면 삽입 된 행의 기본 키를 보지 않습니까, 아니면 "IDENTITY"가 지정된 필드를 봅니까 ???

+0

왜 기본 키가 아닌 ID 필드를 가진 사람이 있습니까? 자연 키를 가지고 있다면 고유 한 undex를 설정하고 PK로 신원 정보를 사용하십시오. 자연스러운 키를 업데이트하고 모든 하위 레코드를 필터링 할 필요가 없으므로 자연 키에 대한 업데이트를 쉽게 수행 할 수 있습니다. – HLGEM

답변

12

@@IDENTITY은 마지막 삽입에서 ID 값만 반환합니다. 이 값이 기본 키 열에서 사용되었는지 또는 지정된 열에 대해 고유 한 값이 될지 여부는 알 수 없습니다. @@IDENTITY을 사용하는 대신 특히 트리거가있는 경우 SCOPE_IDENTITY()을 사용해야합니다. @@ IDENTITY는 IDENTITY 특성을 가진 열 (테이블에 하나만있을 수 있음)에만 관심이 있습니다. 테이블에 기본 키가 있는지 여부와 PK가 ID 열인지 여부는 아무런 차이가 없습니다.

자세한 내용은 SCOPE_IDENTITY을 참조하십시오.

+1

트리거가 없더라도 scope_identity를 사용하면 누군가를 나중에 추가 할 수 있는지 알 수 없으며 수정할 수없는 데이터 무결성 오류가 발생할 위험이 없습니다. – HLGEM

+2

+1 @@ IDENTITY는 모든 범위에 삽입 된 마지막 ID입니다 (트리거 내부 또는 마지막 위치에서). SCOPE_IDENTITY()는 현재 범위의 마지막 ID를 제공합니다. –

2

당신은 항상 결코 테이블의 기본 키에, ID 열을 참조하는 대신 @@Identity

0

@@ IDENTITY의 SELECT SCOPE_IDENTITY()를 사용하고 싶습니다. Thomas가 말했듯이, 당신이 트리거로 작업하고 있기 때문에 SCOPE_IDENTITY()를 사용해야 할 것입니다.