2009-10-07 5 views
2

그래서 레코드가 존재하지 않았기 때문에 특정 테이블에서 업데이트를 처리하는 저장 프로 시저가 아무런 작업도 수행하지 않는 인스턴스를 발견했습니다 [duh]. 그래서 분명히 문제를 해결하고 내가 설정 가능에 UpdateTable에서 sproc에 개명Insert/Update 또는 sproc 세트를위한 별도의 sprocs?

UPDATE Table 
SET  col1 = @var1 
WHERE  Type = @type AND UserId = @userId 
IF @@ROWCOUNT = 0 
BEGIN 
    INSERT INTO Table 
---etc.... 
END 

:

그래서 내가 무엇을하기로 결정하기로 저장 프로 시저를 변경했다.

이것은 좋은 생각입니까, 아니면 영향을받은 0 행을 반환하는 경우 삽입 절차를 호출하는 응용 프로그램 수준에서해야합니까?

+0

나는 그것을 좋아한다. 그래도 UpsertTable이라고 부릅니다. ;) – Yoopergeek

+0

우리는 여기에 업서 팅 (upserting)이라고하는 새로운 태그를 만들 것입니다. –

답변

3

나는 당신이 보여 주었던 "upsert"를 선호한다. 왜냐하면 그것은 퍼시스턴스 관련 로직으로부터 훨씬 더 멀리 떨어져있을 수 있기 때문이다. 응용 프로그램에서 나는 단지 내 개체와 함께 작업하고 싶고 "해야한다면"저장/유지하도록 요청합니다. 업데이트와 삽입을 별도로 수행하면 도메인 모델에서이를 고려해야합니다. 그러나 끈질 기게 지키려는 가장 큰 장점은 인프라 문제가 아닌 실제 비즈니스 문제에 집중할 수 있다는 것입니다.

이 디자인

또한 내가 "업데이트"/ "삽입"통화의 톤을 가지고 있지 않았기 때문에 내가 올해 초 ORM로 마이그레이션 도움, 대신 간단한 그것은 다름

+0

DAL 레이어에 저장하는 것이 좋지만 삽입 용 proc 및 저장 용 proc (실제로 저장된 procs를 사용하는 경우)입니다. – RichardOD

+0

오른쪽 - 이것은 지속성 무지의 목표를 달성하는 또 다른 방법입니다 (저장 프로 시저를 사용해야하고 ORM이 아니오/아니오 인 경우) –

2

나는 각각 하나씩 갖고 싶어. 나는 sproc을 두 가지가 아닌 특정한 작업을 수행하게하여 유지 보수와 확장을 더 쉽게합니다.

+0

어느쪽으로 든 갈 수 있지만 유연성을 선호합니다. 그리고 당신이 정말로 원한다면 당신은 항상 삽입과 업데이트 sprocs를 사용하는 sproc을 만들 수 있습니다. –

+0

@Chris : 저장 프로 시저를 사용하여 추가 또는 업데이트를 호출 할 수 있습니다. 그런 식으로 당신은 좋은 저장 인터페이스를 위쪽으로 가지고있는 동시에 DB에서 그들을 분리 할 수 ​​있습니다. –

+0

프레드닉, 네가 그럴 수 있다는 것도 알지? 당신은 당신의 BLL IMO에서해야 할 일을하고 있습니다. –

1

을 "저장"을 선택합니다.

응용 프로그램의 일부 위치에서는 현재 저장된 상태에 이미 레코드가 포함되어 있으면 알 수 없거나 상관하지 않기 때문에 업서 트를하는 것이 좋습니다. 그러나 정확히 알고 싶은 다른 장소에서 삽입물에 대한 레코드의 존재 또는 업데이트에 대한 누락 된 레코드는 오류입니다.

어쨌든 'upsert'를하기로 결정한 경우 고유 한 경쟁 조건 때문에주의해야합니다. 두 개의 개별 연결은 업데이트를 시도 할 수 있습니다. 둘 다 @@ ROWCOUNT가 0으로 표시되면 삽입을 시도하여 기본 키 위반 (운이 좋으면) 또는 불일치하는 데이터베이스 상태 (다른 정보로 중복 기록)로 이어집니다. 이러한 작업을 올바르게 수행하는 것은 매우 까다 롭습니다. 상태에서 UPDATE가 잠겨 있는지 (즉, 다른 트랜잭션을 삽입 할 수 없음) 또는 삽입시 PK 위반을 적발하여 적절하게 처리해야하는지 사전에 확인해야합니다. 경주 조건 창은 보통 작고 예외 처리는 concurent 삽입을 방지하는 것보다 쉽기 때문에 나중에 옵션을 선택합니다.

하나의 방법은 새 SQL Server 2008 MERGE 문을 사용하는 것으로,이 경우를 처리하도록 설계되었으며 (오라클과 MySQL은 다른 공급 업체와 SQL Server를 마침내 오랫동안 지원하고 있습니다 ...) .

2

응용 프로그램의 예상과 일치하는 것이 좋습니다.

비즈니스 의사가 기존 레코드를 업데이트하는 경우 또는 응용 프로그램에서 행이 이미 존재하고 저장 프로 시저가 자동으로 숨겨진 사실을 숨기면 다른 논리가 손상 될 수 있습니다. 다른 함수/프로세스가 이유 때문에 행을 삭제하면 어떻게 될까요? 행에서 업데이트되지 않는 열에 정보가있는 경우 어떻게됩니까? 삽입하면 예기치 않게 해당 열의 값이 변경 될 수 있습니다.

이 경우는 해당되지 않습니다. 응용 프로그램을 잘 아는 사람 만이 변경 작업을 수행 할 수 있는지 여부를 알 수 있습니다.

1

나는 업서 트를 좋아한다. (그러나 저장 프로 시저가 아니기 때문에 :))하지만, 왜 그런 식으로 업데이트하거나 삽입해야 하는지를 알지 못하는 방법에 논리를 쓰면 - 왜 sproc이 알아낼 수 있을까요?

관련 문제