SQL Server 2008 Триггеры - PullRequest
0 голосов
/ 03 января 2012

Таблица Message уже имеет триггер.Успешно работает внутри этого триггера. У меня есть оператор insert:

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

На столе tblSettlement Я поместил этот триггер:

 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

Однако проблема в том, что всякий раз, когда мывключите вышеуказанный триггер, вставка перестает работать с таблицей Message.

Значение: мы хотим вставить, после вставки, принимая несколько значений столбца, и попытаться обновить другую таблицу в Trigger той же таблицы.Что на самом деле не позволяет нам вставить.

1 Ответ

5 голосов
/ 03 января 2012

Ваше основное предположение о триггерах SQL Server неверно - вы, похоже, предполагаете (как это делают многие), что триггер будет вызываться один раз для каждой вставленной строки - это НЕ случай!

Триггер будет вызываться один раз для каждого оператора - то есть, если ваш оператор вставляет 20 строк одновременно, ваш триггер будет вызываться один раз и псевдотаблица Inserted будет содержать 20 строк .

Таким образом, если 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 может и будет содержать несколько строк .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...