2014-10-20 3 views
0

Я совершенно новый на SQL Server 2012, и у меня возникла странная проблема.Ошибка создания SQL Server 2012 trigger

Я разработал триггер AFTER UPDATE в таблице в моей базе данных. Я создал триггер в нашей среде разработки, которая представляет собой экспресс-версию SQL Server 2012, без проблем.

Теперь я должен создать тот же триггер в нашей производственной среде, который является версией SQL Server 2012 Enterprise, а сценарий создания никогда не прекращает выполнение, а триггер не создается.

Любые идеи о том, что мне нужно сделать для создания триггера?

Сценарий:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
alter TRIGGER [dbo].[til_aks_ved_betaling] 
    ON [dbo].[betalingsOplysningerbo] 
    AFTER UPDATE 
AS 
BEGIN 
    declare @snr   uniqueidentifier 
    declare @@status  varchar(1024) 

    SET NOCOUNT ON;  

    select 
     @snr = indmeldelse_snr 
    from 
     inserted 

    if UPDATE(betalingsDato)   
    begin   
     set @@status = 'Kalder med snr = ' + convert(varchar(38), @snr)  

     exec xp_logevent 60000, @@status , informational     
     exec overfoer_betalingsdato @snr 
    end 
END 
+0

он потерпит неудачу, если более чем один ряд обновляется. Каков столбца первичного ключа в вашей таблице? –

+1

У вашего триггера есть ** ОСНОВНАЯ ** ошибка в том, что вы, кажется, считаете, что она будет называться ** один раз за строку ** - это не ** не случай. Триггер будет срабатывать ** один раз за оператор **, поэтому, если ваши утверждения 'UPDATE' влияют на 25 строк, вы будете запускать триггер ** сразу **, но тогда' Inserted' и 'Deleted' будут содержать 25 строк , Какой из этих 25 строк будет выбран ваш код? 'select @snr = indmeldelse_snr из вставленного' - он не детерминирован. Для этого нужно переписать триггер! –

+0

'betalingsOplysningerbo' может быть заблокирован. –

ответ

0

2 вещи здесь, общие для новых людей, обновление является DELETE и INSERT поэтому убедитесь, что у вас есть и, прежде чем предположить, что это обновление. Во-вторых, эти специальные таблицы возвращают все строки, влияющие на один вызов sql. Например, Update Table SET This = 'That' обновит каждую запись в таблице, оставив INSERTED с МНОГИМИ записями.

+0

Помимо «плохого» триггерного дизайна, который я создал, проблема, не имеющая возможности создать триггер, кажется, вызвана сиротским процессом, который удерживает блокировку на столе. я попытаюсь убить процесс и воссоздать триггер – janbom

0

попробовать что-то вроде этого ....

ALTER TRIGGER [dbo].[til_aks_ved_betaling] 
ON [dbo].[betalingsOplysningerbo] 
AFTER UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 
     declare @snr   VARCHAR(1000); 
     declare @status  varchar(1024);  


    DECLARE @Temp TABLE (indmeldelse_snr uniqueidentifier , [Status] varchar(1024)) 

    INSERT INTO @Temp (indmeldelse_snr , [Status]) 
    SELECT i.indmeldelse_snr , i.[Status] 
    FROM inserted i INNER JOIN deleted d 
    ON i.Snr = d.Snr AND i.betalingsDato <> d.betalingsDato 


WHILE EXISTS(SELECT * FROM @Temp) 
    BEGIN 
     SELECT TOP 1 @snr = 'Kalder med snr = ' + convert(varchar(38),indmeldelse_snr) 
         ,@status = [Status] 
     FROM @Temp 

     exec xp_logevent 60000, @status , informational     
     exec overfoer_betalingsdato @snr 

     DELETE FROM @Temp WHERE indmeldelse_snr = @snr 

    END 

END