Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Триггер на Insert  [new]
mkliver
Member

Откуда:
Сообщений: 41
Добрый день.
У меня есть набор таблиц (SourceTable1,SourceTable2,SourceTable3,SourceTable4).
SourceTable1(
    Segment_ID,
    Road_ID,
)

SourceTable2(
  Road_ID,
  col1,
  col2
)


SourceTable3(
  Segment_ID,
  col1,
  col2
)

SourceTable4(
  Segment_ID,
  col1,
  col2
)


И при добавлении записей в, которые хочу добавлять некоторые данные в таблицу AnotherTable. Для этого планировал повесить триггер на таблицу SourceTable1, нашел вот такой пример:
    CREATE TRIGGER NewTrigger ON SourceTable1
FOR INSERT
AS

INSERT INTO AnotherTable
        (col1, col2    , col3, user_id, user_name)
    SELECT
        'a'  , default , null, user_id, user_name
        FROM INSERTED

go


Таблица SourceTable1 выбрана по причине того, что в ней содержатся айдишники связывающие другие таблицы.
И у меня возникло несколько вопросов.
1. В Постргресе для выбора только что вставленных данных используется оператор NEW. В SQL-Server его роль выполняет INSERTED? Если да то почему в примере выбираются не колонки а уже какие-то значения?
2. Пока писал вопрос понял, что он друрацский, но все же спрошу. Пример выше как я понимаю будет работать только для таблицы SourceTable1. И на все другие таблицы мне нужно будет вешать такие же триггеры, но только с проверкой, что в AnotherTable уже есть запись с таким Segment_ID. Как можно сделать такую проверку?

Надеюсь помидорами меня не закидают.
31 мар 13, 10:17    [14118050]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на Insert  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
1. Да inserted. Если нужны значения столбцов, то вместо значений в примере подставьте имена соответствующих столбцов таблицы, на которой "висит" триггер.
2. Ну, так и вставьте эту проверку прямо в инструкцию SELECT в предлощение WHERE.
31 мар 13, 10:25    [14118056]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на Insert  [new]
mkliver
Member

Откуда:
Сообщений: 41
tpg
2. Ну, так и вставьте эту проверку прямо в инструкцию SELECT в предлощение WHERE.


А можно пример такого? Извините, я в sql совсем не силен.
31 мар 13, 10:32    [14118063]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на Insert  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Ну, где-то так, например:

INSERT INTO AnotherTable
        (...)
    SELECT
        ...
	FROM INSERTED i
	where not exists
		(
		select
			*
		from AnotherTable
		where Segment_ID = i.Segment_ID
		)
31 мар 13, 10:39    [14118077]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на Insert  [new]
mkliver
Member

Откуда:
Сообщений: 41
tpg,

Большое спасибо. Посылаю вам лучей добра.
31 мар 13, 10:43    [14118086]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на Insert  [new]
mkliver
Member

Откуда:
Сообщений: 41
А как мне организовать такую проверку если я не инсертю в AnotherTable а делаю Update?
31 мар 13, 11:28    [14118157]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на Insert  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
mkliver
А как мне организовать такую проверку если я не инсертю в AnotherTable а делаю Update?
Какой смысл в такой проверке при update'е?
31 мар 13, 11:40    [14118177]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на Insert  [new]
mkliver
Member

Откуда:
Сообщений: 41
invm,
Да действительно. Я неверно сформулировал вопрос.

Как мне сделать вот такой апдейт не могу синтаксис подобрать:

CREATE TRIGGER TrackTrigger ON Track
FOR INSERT
AS

UPDATE Segments_Summer
       SET the_geom=
		SELECT
        Segment_ID,GEOMETRY::STGeomFromText(Track.Track.STAsText(),4326) as the_geom
        FROM INSERTED i
        WHERE Segments_Summer.Segment_ID=i.Segment_ID

go
31 мар 13, 11:57    [14118196]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на Insert  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
В update тоже можно использовать joins:
UPDATE s
       SET the_geom=...
from
 INSERTED i join
 Segments_Summer s on s.Segment_ID = i.Segment_ID
31 мар 13, 12:05    [14118206]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на Insert  [new]
mkliver
Member

Откуда:
Сообщений: 41
CREATE TRIGGER TrackTrigger ON Track
FOR INSERT
AS

UPDATE Segments_Summer
       SET the_geom=GEOMETRY::STGeomFromText(Track.Track.STAsText(),4326)
        FROM INSERTED i
        WHERE Segments_Summer.Segment_ID=i.Segment_ID

go


Можете подсказать это правильный синтаксис?
31 мар 13, 20:53    [14119122]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на Insert  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
CREATE TRIGGER TrackTrigger ON Track
FOR INSERT
AS

UPDATE Segments_Summer
       SET the_geom=GEOMETRY::STGeomFromText(i.Track.STAsText(),4326)
        FROM INSERTED i
        WHERE Segments_Summer.Segment_ID=i.Segment_ID

go
31 мар 13, 21:33    [14119236]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить