инициировать обновление всех строк, а не только вставленных - PullRequest
1 голос
/ 11 февраля 2012

Я знаю, что мне здесь не хватает чего-то очевидного.Этот триггер обновляет все строки в таблице (убивая производительность), когда все, что я хочу, это выполнить обновление для новой вставленной строки.

CREATE TRIGGER [dbo].[update_location_topo_name]
--fires at each row insert, queries topo map layer (must be present!) and inserts name of topo into new location record
on [dbo].[TBL_LOCATIONS] 
after insert
AS 
BEGIN 
update TBL_LOCATIONS
set TOPO_NAME = dbo.QD24K_GRSM.NAME
FROM dbo.tbl_locations
inner join dbo.QD24K_GRSM 
on TBL_LOCATIONS.Location_ID = TBL_LOCATIONS.Location_ID
WHERE  (QD24K_GRSM.Shape.STContains(TBL_LOCATIONS.SHAPE) = 1)  
END

Ответы [ 2 ]

1 голос
/ 11 февраля 2012

Вам необходимо обратиться к псевдотаблице INSERTED, чтобы получить только вставленные строки.

Кроме того, ваше условие соединения TBL_LOCATIONS.Location_ID = TBL_LOCATIONS.Location_ID не имеет никакого смысла.

Вероятно, лучше сделать это как INSTEAD OF триггер для изменения строк перед вставкой, а не после их вставки.

CREATE TRIGGER [dbo].[update_location_topo_name] 
ON [dbo].[TBL_LOCATIONS] 
INSTEAD OF INSERT 
AS 
  BEGIN 
      INSERT INTO TBL_LOCATIONS 
                  (foo, 
                   bar, 
                   TOPO_NAME) 
      SELECT foo, 
             bar, 
             dbo.QD24K_GRSM.NAME 
      FROM   INSERTED I 
             LEFT JOIN dbo.QD24K_GRSM 
               ON QD24K_GRSM.Shape.STContains(I.SHAPE) = 1/* Will insert additional 
                                                    rows if more than one match*/
  END 
0 голосов
/ 13 февраля 2012

Я бы предложил создать триггер «Вместо вставки», а не «После вставки».Таким образом, вы можете изменять новые вставленные строки так, как вам нужно, прежде чем фактически вставить их в целевую таблицу.И нет абсолютно никакой необходимости объединять «вставленную» таблицу с целевой таблицей.

Что-то вроде этого (синтаксис может быть неправильным, поскольку на самом деле этот код не выполняется):

CREATE TRIGGER [dbo].[update_location_topo_name]
on [dbo].[TBL_LOCATIONS] 
Instead Of insert
AS 
BEGIN 
    Insert Into TBL_LOCATIONS (...., TOPO_NAME)
    Select ..., CrTable.NAME as TOPO_NAME
        From Inserted Cross Apply 
        (
                Select top 1 QD24K_GRSM.NAME from QD24K_GRSM where 
                QD24K_GRSM.Shape.STContains(Inserted.SHAPE) = 1
        ) as CrTable
END
...