2011-01-13 4 views
1

Вот мой стол:Создание уникальных слизов URI - это рекурсивный триггер? (SQL Server)

dbo.Posts

  • сообщения дан (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 для создания уникального Ури.

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 обновит эту таблицу.

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

ответ

0

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

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; 
+0

Очень умный! Не знал о синтаксисе 'UPDATE (fieldname)'. Попробуйте это сейчас ... – RPM1984

+1

Это действительно работает, но в конце концов проблема была отсутствующим индексом в таблице GEOGRAPHY (и здесь отсутствующие индексы могут убить вас), так что это была проблема, а не рекурсивный триггер. Тем не менее, я буду принимать этот ответ, потому что если он * был * рекурсивным, это решило бы проблему. Благодаря! – RPM1984

Смежные вопросы