2012-01-03 15 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 *(ロング - ロング)* COS(緯度/ 57.3)、2))<1 'は私にとって疑わしい。 – Yuck

+0

正確にはどうなりますか?エラーメッセージはありますか? 「挿入がうまくいかない....挿入するのを許可しない」という情報が十分ではないため、診断に役立ちません。 **どの部分が問題を引き起こす可能性があるかをデバッグするために、特別なコンテキストでトリガのTSQLを実行しましたか?** –

+0

返信いただきありがとうございます。はい、私は孤立してコードを実行して、それは動作します....しかし、私たちが有効にすると&poblemは、メッセージテーブルのレコード挿入を停止します:((それはバックエンドサービスによって管理されています) –

答えて

5

SQL Serverのトリガについての基本的な仮定は間違っています。トリガは挿入された行ごとに1回呼び出されると仮定しているようです(つまり、多くの人がそうします)。NOTケースです!

トリガー文ごとに一度と呼ばれます - あなたの文は一度に20行を挿入する場合はつまり、あなたのトリガが一度呼び出され、擬似テーブルInserted20行それでが含まれています。

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) 

あなたはInsertedができることを考慮に入れて、完全にあなたのトリガーを書き直す必要があり複数行を含みます。

+2

挿入または削除されたフィールドにスカラー変数を設定すると、トリガが間違って書き込まれたことを示す記号になります – HLGEM

+1

「任意のランダムなエントリを選択する」 - いいえ、それよりも面白い - 4つの別々の選択があるので、挿入された行のいずれかからランダムな要素を1つずつ得ることができます。選択された値は相関されます。 –

+0

@Damien_The_Unbeliever:そうですね、それは私が意味していたことです。どちらの方法でそれらの値が選択されても、このトリガーは機能しませんし、それが行うべきことをしません... –