2009-03-05 20 views
0

Ben SQL Server 2000'de bir tabloda bir tetikleyici var, bu tetikleyicisi:SQL Server 2000 Tek takın Tetik Davranış Recursive gibi

Şimdi
ALTER Trigger [dbo].[Set_Asignado_State] ON [dbo].[Tables] 
FOR INSERT AS 
BEGIN   
    DECLARE @area varchar(1) 
    SELECT @area = Table_Area_ID FROM inserted 

    IF (@area = 'L') 
    BEGIN 
     INSERT INTO Table_History 
     SELECT (SELECT TOP 1 Table_Area_Id AS Table_Area_Id FROM inserted) AS Table_Area_Id, 
       (SELECT SUBSTRING(CAST(YEAR(GETDATE()) AS VARCHAR), 3, 2)) AS Table_Year, 
       (SELECT TOP 1 Table_Seq AS Table_Seq FROM inserted) AS Table_Seq, 
       (SELECT TOP 1 ID FROM Table_Status WHERE Description = 'Asignado') AS Status, 
       '' AS Responsible, 
       (SELECT TOP 1 OrigDept FROM inserted) AS User_Responsible, 
       GETDATE() AS [DateTime], 
       'None' AS Comments 
     FROM Tables 
     WHERE Tables.Table_Area_Id = (SELECT TOP 1 Table_Area_Id AS Table_Area_Id FROM inserted) AND 
       Tables.Table_Year = (SELECT SUBSTRING(CAST(YEAR(GETDATE()) AS VARCHAR), 3, 2)) 

     IF @@ERROR <> 0 
     BEGIN 
      DECLARE @errorMsg NVARCHAR(256) 
      SET @errorMsg = @@ERROR; 

      PRINT 'Error Inserting in Table_History' 

     END 
    END 
END 

, onlar "Tablolar" rekor eklediğinizde, Tetik denir ama Table_History'de birçok kayıt eklemeye devam eder.

Akranlarımla konuştum ve yanlış bir şey yok gibi görünüyor! = S Bu konuda herhangi bir ipucu var mı? Yanlış bir şey mi yapıyorum? peşin

sayesinde =)

+0

@Hugo: belki de ne yapması gerektiğini kelimelerle açıklayabilirdiniz? –

+0

Makas ile çalışıyor ... – dkretz

+0

Anlaşılan, ancak birisi çalıştırmak istiyorsa, olası yan etkileri en aza indirmelerine yardımcı olmalıyız –

cevap

0

Tetikleyiciler böylece sadece eklenen tablodan ilk kayıt bakacağız IF (@area = 'L')
yapıyor, esaslı ayarlanır. WHERE yan tümcesi bir parçası olarak çeki eklemeyi deneyin: Eğer ana Select ifadesi yalnızca bir satır dönmek emin

WHERE Tables.Table_Area_Id = (SELECT TOP 1 Table_Area_Id AS Table_Area_Id FROM inserted) AND 
       Tables.Table_Year = (SELECT SUBSTRING(CAST(YEAR(GETDATE()) AS VARCHAR), 3, 2)) 
AND SUBSTRING(Tables.Table_Area_Id, 1, 1) = 'L' 

musunuz? Üst (1) niteleyiciyi yoğun bir şekilde kullandığınızı fark ettim. Birden fazla satır döndürürse, tarih tablonuza eklenen birden fazla satır olacaktır.

Belki kör bir atış olarak, (1) en dıştaki seçme için Top koymayı deneyin: Bazı yineleme tetikleyici oluyor var sanki

INSERT INTO Table_History 
    SELECT TOP(1) (SELECT TOP 1 ... 

Aksi görünüyor. Bunu göremiyorum, ancak isterseniz, bir veritabanı seçeneği olduğundan, tüm veritabanı için yinelemeli tetiklemeyi kapatabilirsiniz.

+0

Geç yanıt için özür dilerim, ama daha yüksek bir önceliğe sahip olan başka bir şeyi düzeltmek zorunda kaldım, bunu test edeceğim ve bunun olacağını bilmenizi istiyorum ama, bence cevap bu olacak. Tekrar teşekkürler adam =) – Hugo

+0

Anthony çalıştı! Çok teşekkürler dostum! =) – Hugo

0

Tablolar içine yerleştirdikten Table_History masa thats başka tetikleyici var mı?