2014-10-20 1 views
0

저는 SQL Server 2012가 새로 도입되었으며 이상한 문제가 있습니다.SQL Server 2012 트리거를 만들 때 문제가 발생했습니다.

내 데이터베이스의 테이블에 AFTER UPDATE 트리거를 개발했습니다. SQL Server 2012의 익스프레스 에디션 인 개발 환경에서 트리거를 만들었습니다. 문제 없습니다.

SQL Server 2012 Enterprise Edition의 프로덕션 환경에서 동일한 트리거를 만들어야하고 만들기 스크립트가 실행을 중지하지 않으며 트리거가 만들어지지 않습니다.

방아쇠를 만들려면 무엇을해야하는지에 대한 아이디어가 있습니까?

스크립트 : 여기

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 from inserted' - 비 결정적입니다. 이것을 고려하려면 트리거를 다시 작성해야합니다! –

+0

'betalingsOplysningerbo'가 잠겼을 수 있습니다. –

답변

0

2 일, 새로운 사람들을위한 일반적인 갱신 사항은 DELETE이며, 당신이 그것을 업데이 트 가정 전에 INSERT 그래서 당신은 모두 있는지 확인하십시오. 둘째, 이러한 특수 테이블은 단일 SQL 호출로 영향을받는 모든 행을 반환합니다. 예를 들어, Update Table SET This = 'That'은 테이블의 모든 레코드를 INSERTED MANY 레코드로 업데이트합니다. 둘 이상의 행이 업데이트 될 경우이 같은

+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 
관련 문제