Как проверить наличие нескольких действий строки в триггере SQL Server? - PullRequest
4 голосов
/ 02 января 2009

Мой детский сад SQL Server научил меня запускать триггер с несколькими строками во вставленных и удаленных псевдотаблицах. Я в основном пишу свой код триггера, помня об этом, что часто приводит к появлению некоторого клея на основе курсора. Теперь я действительно могу протестировать их стрельбу только по одному ряду. Как я могу сгенерировать многорядный триггер и будет ли SQL Server когда-либо отправлять многострочный триггер? Могу ли я установить флаг, чтобы SQL Server запускал только триггеры из одной строки ??

Ответы [ 5 ]

9 голосов
/ 03 января 2009

Определения триггеров всегда должны обрабатывать несколько строк.

Взято из SQLTeam :

-- BAD Trigger code following:

CREATE TRIGGER trg_Table1 
ON Table1 
For UPDATE
AS
DECLARE @var1 int, @var2 varchar(50)

SELECT @var1 = Table1_ID, @var2 = Column2
FROM inserted

UPDATE Table2
SET SomeColumn = @var2
WHERE Table1_ID = @var1

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

CREATE TRIGGER trg_Table1 
ON Table1 
FOR UPDATE
AS

UPDATE t2
SET SomeColumn = i.SomeColumn
FROM Table2 t2
INNER JOIN inserted i
ON t2.Table1_ID = i.Table1_ID
4 голосов
/ 02 января 2009

Да, если оператор влияет на более чем одну строку, он должен обрабатываться одним вызовом триггера, так как вы можете отменить всю транзакцию. Невозможно логически разделить его на триггерные вызовы, и я не думаю, что SQL Server предоставляет такой флаг. Вы можете заставить SQL Server вызывать триггер с несколькими строками, выполнив инструкцию UPDATE или DELETE, которая влияет на несколько строк.

1 голос
/ 04 января 2009

Сначала меня беспокоит то, что вы заставляете триггеры обрабатывать несколько строк с помощью курсора. Не делай этого! Используйте основанную на множестве оценку вместо того, чтобы присоединиться к вставленным или удаленным псевдостолам. Кто-то поместил один из этих триггеров на основе курсора в нашу базу данных, прежде чем я пришел сюда. Обработка вставки 400 000 записей заняла более сорока минут (и мне часто приходится вставлять более 100 000 записей в эту таблицу для одного клиента). Изменение его на решение на основе множеств изменило время до менее минуты. Хотя все триггеры должны быть способны обрабатывать несколько строк, вы не должны делать это, создавая кошмар производительности.

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

0 голосов
/ 02 января 2009

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

0 голосов
/ 02 января 2009

Я всегда писал свои триггеры для обработки нескольких строк, я понимал, что если один запрос вставляет / обновляет / удаляет несколько строк, то срабатывает только один триггер, и поэтому вам придется использовать курсор для перемещения по нему. записи по одной.

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