INSERT tetikleyicisinden SONRA SQL Server


10

Bu tetikleyicinin married, marital_statussütundaki metinle bir ekleme yapıldıktan sonra tetiklenmesini istiyorum, şu ana kadar olan şey bu

ALTER TRIGGER [dbo].[marriage]
ON  [dbo].[applicant_personal_info]
AFTER INSERT
AS 
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
IF (SELECT [marital_status] FROM inserted) = 'married'
 BEGIN
     INSERT INTO [dbo].[applicant_marriage_info]([dom])
     VALUES('abc')
 END
END

Yanıtlar:


11

Burada karşılaşacağınız sorun, SQL Server'ın Oracle'ın yaptığı "FOR EACH ROW" tetikleyicilerine sahip olmamasıdır. Çok satırlı değişiklikleri işlemek için tetikleyicilerinizi yazmanız gerekir; örn. INSERTED veya DELETED sanal tablolarında birden fazla satır olabilir.

Böyle bir güncelleme olursa, tetikleyiciniz başarısız olur, çünkü (SELECT [marital_status] FROM inserted)birden fazla satır döndürür ve alt sorguların doğrudan karşılaştırmada kullanılacak tek bir değer döndürmesi gerekir.

Tetikleyicinin muhtemelen şöyle görünmesi gerekir:

CREATE TRIGGER [dbo].[marriage] ON  [dbo].[applicant_personal_info] FOR INSERT
AS 
BEGIN
    SET NOCOUNT ON
    IF EXISTS (SELECT [marital_status] FROM INSERTED WHERE marital_status = 'married')
    BEGIN
        INSERT INTO [dbo].[applicant_marriage_info] ([dom])
        SELECT
            'abc' --Replace with whatever you're really inserting
        FROM INSERTED
        WHERE marital_status = 'married'
    END
END

8

Yani bu tetik aslında ihtiyacınız olana oldukça yakın. Şimdi buradaki sorun, eklenen herhangi bir satır varsa, yalnızca bir satır applic__riage_info içine eklenecek olmasıdır. Aslında istediğin bu mu? Bir kerede birden fazla satır eklenirse ne olur?

ALTER TRIGGER [dbo].[marriage]
ON  [dbo].[applicant_personal_info]
AFTER INSERT
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    INSERT INTO [dbo].[applicant_marriage_info]([dom])
    SELECT 'abc' 
    FROM inserted 
    WHERE marital_status = 'married'
END

Büyük olasılıkla gösterdiğimden daha fazla sütuna ihtiyacınız olacak.


Bu veri her girildiğinde yapılmalıdır
kabuto178

2
Sonra bir yolu son parçayıBEGIN INSERT INTO [dbo].[applicant_marriage_info]([dom]) SELECT 'abc' FROM inserted WHERE marital_status = 'married' END
ypercubeᵀᴹ

Bunun için hesap kodunu biraz değiştirdim. Artık IF EXISTS bitine ihtiyacınız yok. Sorguyu eklenen dosyaya karşı çalıştırın ve bu verileri diğer tabloya yükleyin. Muhtemelen gösterdiğimden daha fazla sütuna ihtiyacınız olacak, muhtemelen bir çeşit kimlik, ama muhtemelen fikri anlıyorsunuz.
mrdenny
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.