2012-03-16 2 views
0

트리거를 연구 중이며 질문이 있습니다.SQL Server 2008 FOR INSERT 트리거가 작동하지 않습니다.

복잡한 시간을 변경하는 트리거를 만듭니다. weeklymeeting

|section_id| meeting type| days| timestart|timeend|class_id| 
| 13  | Lecture  | 5 | 01:00:00 |02:00:00|12  | 

timestarttimeend 내가 예

위한

복잡한 시간을 확인하는 트리거를 생성하고 TIME

자료형으로하는 데이터 테이블에서

사용자 사용한다면

과 같은 검색어 515,
INSERT INTO DBO.WeeklyMeetings VALUES (35, 1,1 ,'11:40:00','11:42:00', 42) 

는 데이터

삽입해야하지만

INSERT INTO CSE132B.DBO.WeeklyMeetings VALUES (35, 1, 1, '12:30:00','01:30:00', 42) 

따라서 I는 시간 착체를 확인하는 트리거를 생성 복잡한 시간이기 때문에 그때는 에러 메시지를 반환한다 .. 그러나 예 :

ALTER TRIGGER [dbo].[check_section_time_complex] ON [dbo].[WeeklyMeetings] 
FOR INSERT AS 
IF EXISTS(select * from inserted as i INNER JOIN dbo.WeeklyMeetings as m ON (i.timestart BETWEEN m.timestart and m.timeend) 
OR(i.timeend BETWEEN m.timestart and m.timeend)) 
begin 
RAISERROR ('Can not update data because section time is complexing with other section!!', 16,1); 
rollback tran 
end 

ho wever, 그것은 정말로 작동하지 않습니다 ... 나는 그 이유를 정말로 확신하지 못합니다 ....

누구도이 방아쇠에 문제가 있음을 압니까? 당신이 FOR INSERT 트리거를 지정했기 때문에

감사

답변

1

에 의해 당신이 삽입 할 충돌 데이터를 허용하고 오류를 제기 있다는 의미 "정말 작동하지 않는"경우이는 후 일어나고 있음을 의미입니다 데이터가 삽입됩니다.

데이터가 삽입되는 것을 막으려면 INSTEAD OF 트리거를 사용해야합니다. 전에 삽입 전에 발생하고 유효하다면 삽입하십시오.

트리거 정의는 http://msdn.microsoft.com/en-us/library/ms189799.aspx을 참조하십시오.

오류가 더 이상 설명되어 있지 않은 경우 좀 더 자세하게 설명하십시오.

+0

대신에 다음으로 변경되었으며 오류 메시지가 정상적으로 작동합니다. 아무런 문제가 없다면이 데이터를 삽입해야합니다. 이제는 anydata를 삽입하지 않습니다 ... –

+0

INSTEAD OF 트리거에서 유효한 데이터 삽입을 직접 수행해야합니다. INSTEAD OF 트리거 *는 삽입 시도를 대체하므로 * 검사 후에 트리거를 명시 적으로 수행해야하는 행을 삽입하고자하는 경우. 재귀 루프 삽입으로 끝나지 않도록 조심하십시오. – kaj

+0

다른 (약간 못 생기는) 옵션은 FOR INSERT (AFTER) 트리거를 사용하는 것이고 데이터가 유효하지 않은 경우 방금 생성 한 것임에도 불구하고 삭제하십시오 – kaj

관련 문제