У меня есть триггер, прикрепленный к столу.
ALTER TRIGGER [dbo].[UpdateUniqueSubjectAfterInsertUpdate]
ON [dbo].[Contents]
AFTER INSERT,UPDATE
AS
BEGIN
-- Grab the Id of the row just inserted/updated
DECLARE @Id INT
SELECT @Id = Id
FROM INSERTED
END
Каждый раз, когда вставляется или изменяется новая запись, я хочу обновить одно поле (в этой таблице). Ради этого вопроса представьте, что я обновляю поле LastModifiedOn (datetime).
Итак, у меня есть пакетная вставка.
INSERT INTO [dbo].[Contents]
SELECT Id, a, b, c, d, YouDontKnowMe
FROM [dbo].[CrapTable]
Теперь все строки вставлены правильно. Поле LastModifiedOn по умолчанию имеет значение null. Таким образом, все записи для этого нулевые -- ЗА ИСКЛЮЧЕНИЕМ первой строки.
Означает ли это, что триггер вызывается НЕ для каждой строки, которая вставляется в таблицу, а один раз ПОСЛЕ завершения запроса на вставку, т.е. ВСЕ строки вставлены? Что означает, что таблица INSERTED (в триггере) имеет не одну, а n строк?!
Если да... э-э... :( Значит ли это, что мне понадобится курсор в этом триггере? (если мне нужно сделать какую-то уникальную логику для каждой отдельной строки, что я делаю сейчас).
?
ОБНОВИТЬ
Я добавлю полный код триггера, чтобы посмотреть, можно ли это сделать без курсора.
BEGIN
SET NOCOUNT ON
DECLARE @ContentId INTEGER,
@ContentTypeId TINYINT,
@UniqueSubject NVARCHAR(200),
@NumberFound INTEGER
-- Grab the Id. Also, convert the subject to a (first pass, untested)
-- unique subject.
-- NOTE: ToUriCleanText just replaces bad uri chars with a ''.
-- eg. an '#' -> ''
SELECT @ContentId = ContentId, @ContentTypeId = ContentTypeId,
@UniqueSubject = [dbo].[ToUriCleanText]([Subject])
FROM INSERTED
-- Find out how many items we have, for these two keys.
SELECT @NumberFound = COUNT(ContentId)
FROM [dbo].[Contents]
WHERE ContentId = @ContentId
AND UniqueSubject = @UniqueSubject
-- If we have at least one identical subject, then we need to make it
-- unique by appending the current found number.
-- Eg. The first instance has no number.
-- Second instance has subject + '1',
-- Third instance has subject + '2', etc...
IF @NumberFound > 0
SET @UniqueSubject = @UniqueSubject + CAST(@NumberFound AS NVARCHAR(10))
-- Now save this change.
UPDATE [dbo].[Contents]
SET UniqueSubject = @UniqueSubject
WHERE ContentId = @ContentId
END