2013-08-02 1 views
1

세션 예약에 순차적 인 예약 번호를 할당하는 트리거를 만들려고합니다. 이 번호는 영화 티켓에있는 좌석 번호와 같은 약간의 티켓에 인쇄되어 있습니다. SessionBooking 레코드가 생성 될 때SQL Server 트리거를 사용하여 필드에 연속 번호를 어떻게 만듭니 까?

  1. , 나는 방아쇠가 BookingNumber을 할당 할. SessionBooking 논리적으로 삭제 된 경우
  2. 은 (에 isDeleted = 1) BookingNumber는 SessionBooking 논리적으로 삭제되면
  3. 에서, BookingNumber가 SessionBooking가 생성 된 다음에 재 할당되어야 NULL로 설정한다.
  4. 세션은 (는 삭제하지 않는 한)을 BookingNumber이 할당되면, 그것은 변경되지 않아야 논리적
  5. 을 삭제되지 않습니다 SessionBookings의 BookingCount

데이터베이스의 관련 부분을 유지 스키마는 다음과 같습니다.

----- ----------------- 
Table Session 
----- ----------------- 
PK SessionID 
int BookingCount  (count of SessionBookings) 

----- ----------------- 
Table SessionBooking 
----- ----------------- 
PK SessionBookingID 
FK SessionID 
int BookingNumber  (allows nulls) 
bool IsDeleted   (1 = deleted) 

이것은 내가 지금까지 가지고있는 것입니다. 나에게 너무 복잡해 보이고 어떤 이유로 인해 SessionBooking을 만들 때 BookingNumber가 NULL로 남아 있습니다.

은 어떤 미친 이유로 나는이 다음 사용되지 않은 예약 번호를 찾을 수

enter image description here

+0

어떤 이유로 나는 트리거의 SQL을 질문에 게시 할 수 없습니다. 오류가 발생합니다. –

+0

방아쇠는 실제로'DELETE'을 위해 발사해야합니까? 테이블에 논리적 삭제 ('IsDeleted =')와 물리적 삭제가 모두 발생하는 설정은 이상합니다. –

+0

맞아요, 실제 삭제는 레코드를 수정할 때 INSERTED 및 DELETED 테이블에 나타납니다. –

답변

1

... 나는 화면 캡처를 사용할 필요가 텍스트로이를 게시 할 수 없습니다.

;with live as (select * from sessionBooking where isdeleted=0) 
select isnull(min(t1.bookingNumber)+1,1) 
from live t1 
    left join live t2 on t1.bookingNumber+1=t2.bookingNumber 
where t2.bookingnumber is null 
+0

첫 번째 레코드를 만들 때 (내부 조인을 사용하여)이 방법을 시도했지만 실패했습니다 기존 기록이 없기 때문입니다. –

+0

이것은 WITH 문에 대해 몰랐기 때문에 +1하지 않았지만 올바른 방향으로 나를 보내고 있다고 생각합니다. –

+0

@DerekTomes 레코드가없는 상황에서 작동하도록 조정했습니다. – podiluska

관련 문제