Создание уникальных URI-слагов - это рекурсивный триггер? (SQL Server) - PullRequest
1 голос
/ 14 января 2011

Вот моя таблица:

dbo.Posts

  • PostId (IDENTITY, PK)
  • Тема
  • UniqueUri (NVARCHAR (350), NOT NULL)

Когда я создаю «публикацию», я вставляю пробел UniqueUri (используя встроенную функцию NEWID()).

У меня тогда есть триггер в таблице «Post»:

CREATE TRIGGER [dbo].[OnAfterInsertUpdatePostTrigger]
   ON  [dbo].[Posts]
   AFTER INSERT, UPDATE
AS 
BEGIN
    SET NOCOUNT ON

    DECLARE @PostIds IdentityType

    INSERT INTO @PostIds
    SELECT PostId
    FROM INSERTED

    -- Create the UniqueUri's.
    EXECUTE [dbo].[UpdatePostsCleanedUriUniqueUri] @PostIds

END

, который вызывает SPROC для создания уникальных Uri.

SPROC имеет некоторый код, подобный этому:

UPDATE a
    SET a.CleanedUri = NEWID(),
        a.UniqueUri = NEWID()
    FROM [dbo].[Posts] a
        INNER JOIN @PostIds b ON a.PostId = b.Id

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

Я могу только сделать вывод, что это рекурсивный триггерный вызов?

В основном, когда сообщение создается / обновляется, мне нужно создать уникальные URI (очень похоже на стек для вопросов).

Единственное решение, о котором я могу подумать, - это создать еще одну таблицу с именем UniqueUri, которая будет иметьничего, кроме PostId FK и Uri, например, 1-1, которого я всегда стараюсь избегать.

Тогда SPROC обновит эту таблицу.

Любые другие предложения / идеи?

1 Ответ

0 голосов
/ 14 января 2011

Одним из способов предотвращения рекурсивного срабатывания триггера является исключение изменений в ваших столбцах из триггера:

IF ( NOT UPDATE (CleanedUri) AND NOT UPDATE (UniqueUri ) )
BEGIN
    DECLARE @PostIds IdentityType      
    INSERT INTO @PostIds     
    SELECT PostId     
    FROM INSERTED      

    -- Create the UniqueUri's.     
    EXECUTE [dbo].[UpdatePostsCleanedUriUniqueUri] @PostIds 
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...