2008-08-20 22 views
2

SQL Server 2005 veritabanında, yeni bir kayıt eklendiğinde farklı bir tabloya kayıt eklemesi gereken bir tetikleyici içeren bir tablo var. İyi çalışıyor gibi görünüyor, ancak değerlerin kaynağı olarak bir alt sorgu kullanan ana tabloya bir Insert Into çalıştırırsam, tetikleyiciye birden çok kayıt eklenmiş olsa da tetikleyici yalnızca diğer tabloya bir kayıt ekler. Tetikleyicinin, ana tabloya eklenen her yeni kayıt için ateşlenmesini istiyorum. Bu 2005 yılında mümkün mü?SQL Server 2005 yeterli kayıtları eklemiyor tetikleyicisi ekleyin

yapıyorum insert geçerli:

CREATE TRIGGER [dbo].[tblMenuItemInsertSecurity] ON [dbo].[tblMenuItems] 
FOR INSERT 
AS 

Declare @iRoleID int 
Declare @iMenuItemID int 

Select @iMenuItemID = [ID] from Inserted 

DECLARE tblUserRoles CURSOR FASTFORWARD FOR SELECT [ID] from tblUserRoles 
OPEN tblUserRoles 
FETCH NEXT FROM tblUserRoles INTO @iRoleID 

WHILE (@@FetchStatus = 0) 
    BEGIN 
    INSERT INTO tblRestrictedMenuItems(
     [RoleID], 
     [MenuItemID], 
     [RestrictLevel]) 

     VALUES(
     @iRoleID, 
     @iMenuItemID, 
     1)  

    FETCH NEXT FROM tblUserRoles INTO @iRoleID 
    END 

CLOSE tblUserRoles 
Deallocate tblUserRoles 

cevap

3

Kişisel tetik sadece 'Eklenen' dan ilk satırı kullanıyor:

İşte
INSERT INTO [tblMenuItems] ([ID], [MenuID], [SortOrder], [ItemReference], [MenuReference], [ConcurrencyID]) SELECT [ID], [MenuID], [SortOrder], [ItemReference], [MenuReference], [ConcurrencyID] FROM [IVEEtblMenuItems] 

tetik neye benzediği. Bu, ilk kez SQL tetikleyicileriyle uğraşırken yaygın bir yanlış anlaşılmadır. Tetik, her satırda değil güncelleme başına ateşler. bunu yaparsanız

Örneğin aşağıdaki: -

güncelleme ürünleri seti title = 'Geoff de Geoff'

bu tüm ürünleri güncellerdi ama sadece bir kez ateş ediyorum ürün masada bir tetikleyici .

Tetikleyiciye eklediğiniz 'tablo' tüm satırları içerecektir. Eklenmiş bir imleç ile ya da güncellemekte olduğunuz tablonun içine eklenmiş olan daha iyi birleşim ile geçmelisiniz.

1

Tetik, her bir INSERT kaydı için yalnızca bir kez tetiklenir - eklenen her kayıt için bir kez değil.

Tetikleyicinizde, eklenen kayıtların ayrıntıları için eklenen adlı sanal kareye erişebilirsiniz.

yani:

SELECT COUNT(*) FROM inserted 

eklenen kayıtların sayısını döndürür.

0

Ben sadece onun cevabını ikinci @Gordon Bell istiyorum/diğer maintanance bir sürü tabloları/güncelleme istatistikleri birleştirmek için yalnızca kullanılmalıdır ..

Değerleri takılı oldukları anda "yakalayın". Bu durumda imleci gerçekten gerek yoktur (veya belki bir sebebiniz var mı?).

http://dbalink.wordpress.com/2008/06/20/how-to-sql-server-trigger-101/

:

Basit TRIGGER tek ihtiyacınız olabilir