2012-01-03 2 views
0

테이블 Message에는 이미 트리거가 있습니다. 우리가 트리거 위에 가능하게 할 때마다 문제가 삽입에 대한 작동이 중지된다 그러나Sql Server 2008 트리거

ALTER TRIGGER [dbo].[AddSettlementOnINSERT] 
ON [dbo].[TblSettlement] 
After INSERT 
    AS 
DECLARE @id Bigint, @Lat Float,@Long Float, @LocName Varchar(200), @Dist float,@upd bit 
Set @upd = (SELECT updated FROM inserted) 
SET @id = (SELECT MessageID FROM inserted) 
SET @lat = (SELECT [Lat] FROM inserted) 
SET @Long = (SELECT [Long] FROM inserted) 
if (@upd = 0) 
begin 
declare @table table 
(Location Varchar(200),Distance float) 
insert into @table 
SELECT top 1 Full_Name_nd, SQRT(
    POWer(69.1 * (lat - @lat), 2) + 
    POWer(69.1 * (@long - long) * COS(lat/57.3), 2))As distance 
FROM geodb.dbo.geonames where SQRT(
    POWer(69.1 * (lat - @Lat), 2) + 
    POWer(69.1 * (@Long - long) * COS(lat/57.3), 2)) < 1 
set @LocName = (select location from @table) 
set @Dist = (select distance from @table) 
Insert into dbo.tblset2 

(Messageid,lat,long,settlement,distance)values(@id,@lat,@long,@locName,@Dist) 
    end 

: 테이블 tblSettlement

Insert into tblSettlement (MessageID,Lat,Long) Select Messageid,y,x from inserted 

내가 방아쇠에 놓여있다 : 그 트리거 내에서 성공적으로 실행 나는 insert 문이 Message 테이블.

의미 : 삽입 후 적은 수의 열 값을 가져 와서 같은 테이블의 트리거에서 다른 테이블을 업데이트하려고합니다. 실제로 삽입 할 수 없습니다.

+0

'SELECT' 쿼리를 단독으로 실행하고 결과를 확인할 수 있습니까? 이 절 -'SQRT (69.1 * (lat - @Lat), 2) + POWer (69.1 * (Llong-long) * COS (lat/57.3), 2)) <1 '는 나에게 의심 스럽다. – Yuck

+0

정확히 어떻게됩니까? 오류 메시지가 있습니까? "삽입 기능이 작동하지 않아 ... 삽입 할 수 없으므로"진단에 도움이되는 정보가 충분하지 않습니다. ** 어떤 부분이 문제를 일으킬 수 있는지 디버깅하기 위해 임시 방편으로 트리거의 TSQL을 실행 했습니까? ** –

+0

답장을 보내 주셔서 감사합니다. 그래, 난 고립에서 코드를 실행하고 그것은 작동하지만 .... poblem은 & 때 우리는 메시지 테이블에 트리거 삽입 레코드가 중지됩니다 활성화 (& : (백 엔드 서비스에 의해 관리되고) –

답변

5

SQL Server 트리거에 대한 기본 가정은 잘못되었습니다. 행이 삽입 될 때마다 트리거가 호출되는 것으로 가정합니다 (많은 사람들이 그렇듯이). 이 아닌 경우입니다.

트리거

문 당 한 번 호출됩니다 - 즉, 귀하의 문은 한 번에 20 행을 삽입 할 경우, 트리거는를 호출 할 것이며, 의사 테이블 Inserted20 행에게 그것에 포함됩니다. Inserted이 여러 행이 포함 된 경우 등으로

는 여기 문은 하나가 비참하게 실패, 또는 ​​임의의 임의의 항목을 선택합니다 : 당신은 고려 완전히 트리거를 다시 Inserted이 할 수있는 것을해야

DECLARE @id Bigint, @Lat Float,@Long Float, @LocName Varchar(200), @Dist float,@upd bit 
Set @upd = (SELECT updated FROM inserted) 
SET @id = (SELECT MessageID FROM inserted) 
SET @lat = (SELECT [Lat] FROM inserted) 
SET @Long = (SELECT [Long] FROM inserted) 

여러 행이 포함됩니다.

+2

삽입 또는 삭제 된 필드에 스칼라 변수를 설정하면 트리거가 잘못 쓰여지는 확실한 신호가됩니다 – HLGEM

+1

"임의의 임의 항목 선택"- 아니요, 그보다 더 재미 있습니다 - 4 개의 개별 선택 항목이 있으므로 각 행에 대해 삽입 된 행의 임의의 요소를 하나씩 가져올 수 있습니다. 선택한 값은 상호 연관됩니다. –

+0

@Damien_The_Unbeliever : 예, 그게 내가 의미했던 것입니다. 당신이 그것을 더 분명히해야합니다. - 고마워요! 그 값이 선택 되든간에 -이 방아쇠는 작동하지 않으며 그것이하는 일을하지 않을 것입니다 ... –