Триггеры базы данных: при вставке - PullRequest
2 голосов
/ 23 ноября 2011

Это простой пример.

Я хочу вставить данные в Table1 (Name, Age, Sex). Эта таблица автоматически увеличивается serial# (int) при вставке данных.

Я хочу поставить триггер на Table1 insert, чтобы после вставки данных он брал serial# (int) из Table1 и помещал Serial# и Name в Table2 и Serial# и some other data в Table3.

Возможно ли это с помощью триггеров?

или я должен выбрать (последний) Serial из table1 и вызвать insert для других таблиц, увеличив его вручную, в том же SP, который я использовал для вставки в Table1?

Какой подход лучше?

РЕДАКТИРОВАТЬ 1:
Предположим, таблица:

Serial | UID | Name | Age | Sex | DateTimeStamp
(int | uniqueidentifier | nvarchar | smallint | nchar | DateTime ) 

По умолчанию NewID() и По умолчанию GetDate() как UID и DateTimeStamp, будет ли в таблице INSERTED Datetime-Of-Insertion в поле DatetimeStamp? То есть изначально я не вводил Serial, GUID или DatetimeStamp, они будут появляться в таблице INSERTED?


РЕДАКТИРОВАТЬ 2: Можете ли вы указать мне хорошие книги / статьи о триггерах. Я читал мастеринг SQL Server 2005, мало что получил от него. Спасибо!

Ответы [ 4 ]

4 голосов
/ 23 ноября 2011

Конечно, вы можете сделать это с помощью триггера - что-то вроде:

CREATE TRIGGER trg_Table1_INSERT
ON dbo.Table1 AFTER INSERT 
AS BEGIN
   INSERT INTO dbo.Table2(SerialNo, Name)
      SELECT SerialNo, Name
      FROM Inserted

   INSERT INTO dbo.Table3(SomeOtherCol)
      SELECT SomeOtherCol
      FROM Inserted
END

или что-то еще, что вам нужно сделать здесь ...

Важно понимать, что триггербудет вызываться один раз для оператора - не один раз для вставленной строки.Поэтому, если у вас есть оператор, который вставляет 10 строк, ваш триггер будет вызываться один раз , и псевдотаблица Inserted будет содержать те 10 строк, которые были вставлены в оператор.

2 голосов
/ 23 ноября 2011

Да, это возможно с триггерами.

Когда вы используете триггер INSERT, у вас есть доступ к логической таблице INSERTED, которая представляет вставляемую строку,со значением нового идентификатора в.

1 голос
/ 23 ноября 2011

Да, это возможно с помощью триггера, но имейте в виду, что TRIGGER не принимает никаких входных данных и не предоставляет никаких выходных данных, поэтому вы можете собирать нужные данные только путем запроса в триггере, однако для удовлетворения вставки в ваш Table2 и Table3

CREATE TRIGGER tr_YourDesiredTriggerName ON Table1
 FOR INSERT
 AS
 BEGIN
    -- Inserting data to Table2
INSERT INTO Table2( Serial, Name) 
   SELECT i.Serial, i.Name 
       FROM Table1 AS t1 INNER JOIN Inserted AS i ON t1.Serial = i.Serial
       AND i.Serial NOT IN  ( SELECT t2.Serial FROM Table2 AS t2 )

    -- Inserting data to Table3     
INSERT INTO Table3( Serial, OtherData)  -- select from other table
   SELECT i.Serial, OtherData
       FROM OtherTable AS ot INNER JOIN Inserted AS i ON ot.Serial = i.Serial
       AND i.Serial NOT IN ( SELECT t3.Serial FROM Table3 AS t3 )
END
0 голосов
/ 23 ноября 2011

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

Будете ли вы также контролировать будущие вставки? Что, если для этой таблицы будет создана другая вставка? Если вы используете триггер, то вторичные вставки также будут обрабатываться автоматически. Если нет, то второй процесс вставки может пропустить вторичные вставки. Может быть, это будет хорошо или плохо в зависимости от вашего приложения.

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