2013-07-16 2 views
0

트리거시 전체 초보자 ... 모든 문서는 초보자 용 물건에 신경 쓰지 않습니다.간단한 업데이트 트리거 + 간단한 행 삽입

방금 ​​업데이트되었거나 업데이트 된 행을 업데이트하려고합니다. 내 트리거 아래 전체 테이블을 업데이트합니다. 아래의 트리거는 변경 사항에 대해 두 개의 열만 테스트합니다.

이 업데이트 트리거를 전체 테이블이 아닌 업데이트 된 행만 업데이트하도록 어떻게 제한합니까?

ALTER TRIGGER [dbo].[geog_update] ON [dbo].[Site] 
FOR UPDATE 
AS 
SET NOCOUNT ON 
IF (UPDATE(Latitude) OR UPDATE(Longitude)) 
BEGIN 
    UPDATE Site 
    SET geog = geography::Point([Latitude], [Longitude], 4326) 
    WHERE Latitude is not null and Longitude is not null 
END 

난 그냥 FOR UPDATE를 사용하여 삽입 된 행에 대해 같은 트리거를 사용할 수입니까? INSERT가 UPDATE를 암시하지 않는 한, IF가 컬럼에 대해 UPDATE()를 체크했기 때문에 아마 아니다.

답변

1

처음에는 SQL Server에서 하나의 행만 업데이트하는 트리거를 설계하지 않았습니다. 삽입, 삭제 또는 업데이트 된 행을 업데이트하도록 디자인합니다. 트리거는 배치에 대해 작동하며 데이터베이스를 공격하는 코드에서 둘 이상의 레코드를 변경하지 않는다고 가정 할 수 없습니다.

삽입, 삭제 된 트리거에서만 사용할 수있는 두 개의 가상 테이블 중 하나에 결합하면됩니다. Inserted는 새 레코드 또는 업데이트 후 값을 포함하고 delted는 삭제 된 레코드 값 또는 업데이트가 발생하기 전의 값을 포함합니다. 여기에 최종 UPDATE 트리거가

ALTER TRIGGER [dbo].[geog_update] ON [dbo].[Site] 
FOR UPDATE 
AS 
SET NOCOUNT ON 


UPDATE S 
    SET geog = geography::Point(i.[Latitude], i.[Longitude], 4326) 
    FROM Site s 
    JOIN Inserted I on s.id = i.id 
    WHERE Latitude is not null and Longitude is not null 
+0

그 정보를 주셔서 감사합니다.하지만 어떻게 간단한 트리거를 작성합니까? – rheitzman

+0

감사합니다 - 최종 SQL 아래. – rheitzman

0

:

당신은 뭔가를 시도 할 수 있습니다. 거의 동일한 INSERT 트리거를 만들었습니다.

CREATE TRIGGER [dbo].[geog_update] ON [dbo].[Site] 
FOR UPDATE 
AS 
SET NOCOUNT ON 
IF (UPDATE(Latitude) OR UPDATE(Longitude)) 
BEGIN 
    UPDATE t1 
    SET t1.geog = geography::Point(t1.Latitude, t1.Longitude, 4326) 
    FROM Site AS t1 INNER JOIN Inserted AS t2 ON t1.Site_ID = t2.Site_ID 
    WHERE (t1.Latitude IS NOT NULL) 
    AND (t1.Longitude IS NOT NULL) 
    AND (t1.Record_Archive_Date IS NULL) 
END