나는 발사하기 전에 조건을 평가하는 업데이트 트리거 대신 트리거의 끝에서 간단한 쿼리를 수행하는 업데이트 후 트리거를 시작하고 싶습니다. 그러나, after 트리거가 올바른 해결책인지 확실하지 않으며, 어쨌든 after 트리거를 끝까지 포함시키려는 시도가 너무 많아 많은 구문 오류가 발생합니다.삽입 트리거 대신 삽입 후 결합하는 방법?
INSTEAD OF INSERT
AS
BEGIN
IF EXISTS (SELECT 1 FROM inserted WHERE SHAPE IS NOT NULL)
BEGIN
INSERT dbo.TBL_Locations(SHAPE, X_Coord, Y_Coord,objectid, loc_name)
SELECT SHAPE, X_Coord = SHAPE.STX,Y_Coord = SHAPE.STY,objectid, loc_name
FROM inserted;
END
ELSE
BEGIN
INSERT dbo.TBL_Locations(SHAPE, X_Coord, Y_Coord,objectid,loc_name)
SELECT SHAPE=Geometry::STPointFromText('POINT('
+ CAST(X_Coord AS VARCHAR(20)) + ' '
+ CAST(Y_Coord AS VARCHAR(20)) + ')', 26917),
X_Coord, Y_Coord,objectid,loc_name
FROM inserted;
END
END
go
after insert
as
begin
set nocount on;
INSERT INTO TBL_LOCATIONS (TOPO_NAME)
SELECT dbo.QD24K_GRSM.NAME
FROM INSERTED I
LEFT JOIN dbo.QD24K_GRSM
on QD24K_GRSM.Shape.STContains(I.SHAPE) = 1;
go
이 추가 경우를 처리하기 위해 수정, 내가이 예에서 혜택을 누릴 수있는 유일한 사람이 아니에요 확실 허용 대답을 해요 :
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;
--insert binary xy to geo column when user enters location from non-gis app (a);
--insert topo quad (b) name and county (c) name admin boundary which location occurs
INSERT dbo.TBL_Locations(SHAPE, X_Coord, Y_Coord,objectid, loc_name, TOPO_NAME, County)
SELECT a.Shape, a.X_Coord, a.Y_Coord, a.objectid, a.loc_name, b.NAME, c.name
FROM
(
SELECT
--see if GIS populated geo column, if not, write user-input xy to geometry
SHAPE = CASE WHEN SHAPE IS NOT NULL
THEN SHAPE ELSE Geometry::STPointFromText('POINT('
+ CAST(X_Coord AS VARCHAR(20)) + ' '
+ CAST(Y_Coord AS VARCHAR(20)) + ')', 26917) END,
--if record was created with GIS, then translate binary to human-readable xy
X_Coord = CASE WHEN SHAPE IS NULL THEN X_Coord ELSE SHAPE.STX END,
Y_Coord = CASE WHEN SHAPE IS NULL THEN Y_Coord ELSE SHAPE.STY END,
objectid,
loc_name
FROM inserted
) AS a
--spatial query, what topo quad is this point in?
LEFT OUTER JOIN dbo.QD24K_GRSM AS b
ON b.Shape.STContains(a.Shape) = 1
--spatial query, what county is this point in?
LEFT OUTER JOIN dbo.COUNTY as c
ON c.Shape.STContains(a.Shape) = 1;
END
GO
GO
아론이 맞다,이 업데이 트를 처리하지 않습니다 사용자가 xy 열을 변경하거나 GIS 응용 프로그램을 사용하여 지점을 이동하는 상황 (상황에 따라 충돌이 발생하지 않음) 업데이트 후 트리거가이를 처리 할 것으로 예상되지만,이 단계에서는 삽입 된 희귀 포인트 편집 내용을 추적하는 것이 응용 프로그램 관리자의 역할입니다. 사용자가 제공 한 X 또는 Y가 널이면 Geometry는 널 (NULL)이되며주기적인 DB 유지 보수는 수동으로 위치를 판별하기 위해 해당 레코드를 추려 내고 위치가 대서양 어딘가에있는 임시 테이블로 이동시킵니다.
트리거가 끊어졌습니다. 'inserted'는 여러 개의 행을 포함 할 수있는 의사 테이블입니다. 따라서'IF EXISTS' 테스트를 수행하면 대부분 단일 * 행의 상태를 알 수 있습니다. –
@Damien 예, 'FROM inserted'비트에는 해당 행만 선택하는 동등한'WHERE' 절이 있어야합니다. 나는 체크를 전혀 요구하지 않기 위해 아래의 솔루션에서 방아쇠를 업데이트했다. –