두 테이블간에 일대 다 양방 향 강제 관계를 적용하는 방법을 이해하는 데 어려움을 겪고 있습니다. 일반적으로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
로, 여행의 매일 싶습니다 : 나는 두 테이블, 그런 약 뭔가가있다. 그렇게하기 위해, 관련 테이블에 데이터를 삽입하는 두 가지 절차를 준비했습니다. 이들을 createTrip
및 createTripDay
이라고합시다. 그것들을 채우기 위해, 먼저 명백한 매개 변수 starts
과 ends
을 가진 첫 번째 호출을 호출 한 후 첫 번째 프로 시저에서 반환 된 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
필드를 채우는 데 필요한 정보가 부족합니다. 불가능한 방아쇠를 연기하는 경우에 대비하여 몇 가지 대안을 고맙게 생각합니다. 도와 줘서 고마워.
나중에 참조 할 수 있도록 - Postgres 또는 Oracle을 사용할 때 트랜잭션이 커밋되기 직전까지 점검 제한 조건을 연기 할 수 있습니다. 불행히도 SQL Server는 적어도 SQL99 이후로 정의되었지만이 기능을 제공하지 않습니다. 따라서 문제없이 원형 참조 (예 : 일대 다 관계)를 수행 할 수 있습니다. – lared