2014-12-31 2 views
1

두 테이블간에 일대 다 양방 향 강제 관계를 적용하는 방법을 이해하는 데 어려움을 겪고 있습니다. 일반적으로SQL Server : 트랜잭션이 끝날 때 무결성을 적용하는 방법은 무엇입니까?

CREATE TABLE Trips 
(
    tripID int IDENTITY(1, 1), 
    starts date NOT NULL, 
    ends date NOT NULL 
); 


CREATE TABLE TripDays 
(
    tripDayID int IDENTITY(1, 1), 
    tripID int NOT NULL, 
    date date NOT NULL, 
    expenses money NOT NULL, 
    foreign key (tripDayID) references Trips (tripID) 
); 

내가 두 번째 테이블의 항목을 가지고, starts에서 ends로, 여행의 매일 싶습니다 : 나는 두 테이블, 그런 약 뭔가가있다. 그렇게하기 위해, 관련 테이블에 데이터를 삽입하는 두 가지 절차를 준비했습니다. 이들을 createTripcreateTripDay이라고합시다. 그것들을 채우기 위해, 먼저 명백한 매개 변수 startsends을 가진 첫 번째 호출을 호출 한 후 첫 번째 프로 시저에서 반환 된 tripID을 사용하여 두 번째 호출을 적절한 횟수만큼 호출합니다.

항상 무결성을 유지하기 위해 테이블 ​​에 관련 항목이없는 경우 트랜잭션을 다시 롤백하는 테이블 Trips에 트리거를 만들었습니다.

BEGIN TRANSACTION; 

    -creating the trip 
    <- the trigger raises error over violation of the integrity constraints 
    -creating entries in TripDays 

    COMMIT; 

이 있습니까 : 그들은 아직 삽입을 포장 트랜잭션에서 커밋되지 않았기 때문에 불행하게도 분명이 트리거는 아직 - 투 --할 두 번째 절차의 호출에 의해 인 변화를 볼 수 없습니다 트랜잭션이 끝날 때까지 트리거의 실행을 연기하는 방법은 무엇입니까? 평소에는 AFTER INSERT입니다.

내가 만날 수있는 유일한 해결책은 트리거에 항목을 만드는 것입니다. 그러나 expenses 필드를 채우는 데 필요한 정보가 부족합니다. 불가능한 방아쇠를 연기하는 경우에 대비하여 몇 가지 대안을 고맙게 생각합니다. 도와 줘서 고마워.

+0

나중에 참조 할 수 있도록 - Postgres 또는 Oracle을 사용할 때 트랜잭션이 커밋되기 직전까지 점검 제한 조건을 연기 할 수 있습니다. 불행히도 SQL Server는 적어도 SQL99 이후로 정의되었지만이 기능을 제공하지 않습니다. 따라서 문제없이 원형 ​​참조 (예 : 일대 다 관계)를 수행 할 수 있습니다. – lared

답변

0

FK가 잘못되었거나 오타가있는 것 같습니다. FK가 Trips.ays에 TripDays.tripID가되어서는 안됩니까?

저장된 procs에 대한 정보를 제공 할 수 있습니까? TripDays가 Trips를 채우는 프로세스가 FK를 위반하는 방법이 확실하지 않은 것처럼 보입니다.

+0

코드를 작동하지 않아 죄송합니다. 이동 중에도 쓰고있었습니다. 불행히도 서버에 원격 액세스 할 수만 있습니다. 전체 코드는 다음과 같습니다. https : //gist.github.com/anonymous/a5539ded8084522b2fee/ – lared

+0

참조. 따라서 한 번에 하나씩 날짜를 삽입하기 때문에 모든 항목에 대해 트리거가 실행됩니다. 업데이트와 삭제 같은 것을 다루지 않기 때문에 잘못된 접근이라고 생각합니다. 따라서 Trip 테이블을 업데이트하여 날짜를 변경하면 TripDays가 잘못됩니다. 전체 범위가 테이블에 채워 졌는지 확인하는 데 사용되는 별도의 저장 프로 시저를 만들어야한다고 생각합니다. TripDays 테이블을 자동 완성하지 않고 비용을 입력 할 때 입력하고 도메인에서 날짜를 확인하도록 접근 방식을 변경하십시오. –

+0

당신이 옳다는 생각을 조금 더 드린 후에.내가 어떻게 든 그것을하기를 원했던 것처럼 작동하는 솔루션을 어떻게 든 구현할 수는 있지만 어색 할 것입니다. 나는 가격이 입력되기를 기다리는 게으른 해결책을 생각할 것입니다. 어쨌든 일어날 것입니다. 시간과 조언을 주셔서 감사합니다. – lared

0

얼가 문제를 해결해야 여행의 갱신/삽입 트리거로 두 번째 SP에서 코드를 이동

오타

에 대한 권리입니다.

관련 문제