Trigger di SQL Server AFTER INSERT


10

Voglio che questo grilletto venga attivato dopo aver fatto un inserimento con il testo marriedsulla marital_statuscolonna, questo è quello che ho finora

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

Risposte:


11

Il problema che incontrerai qui deriva dal fatto che SQL Server non ha i trigger "FOR EACH ROW" che Oracle ha. È necessario scrivere i trigger per gestire le modifiche su più righe, ovvero le tabelle virtuali INSERTED o DELETED possono contenere più di una riga.

Se si verificasse un tale aggiornamento, il trigger non funzionerebbe, poiché (SELECT [marital_status] FROM inserted)restituirebbe più righe e le sottoquery devono restituire un singolo valore da utilizzare in un confronto diretto.

Il trigger dovrebbe probabilmente avere un aspetto simile al seguente:

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

Quindi questo trigger è in realtà abbastanza vicino a quello che ti serve. Ora il problema qui è che solo una riga verrà inserita in candidate_marriage_info se sono state inserite righe. È questo quello che vuoi veramente? Cosa succede se sono inserite più righe contemporaneamente?

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

Probabilmente avrai bisogno di più colonne di quelle che ho mostrato.


Dovrebbe essere fatto ogni volta che vengono inseriti questi dati
— kabuto178,

2
Quindi un modo è sostituire l'ultima parte conBEGIN INSERT INTO [dbo].[applicant_marriage_info]([dom]) SELECT 'abc' FROM inserted WHERE marital_status = 'married' END
— ypercubeᵀᴹ

Ho modificato un po 'il codice di esempio per tener conto di questo. Non è più necessario il bit IF EXISTS. Basta eseguire la query su inserito e caricare quei dati nell'altra tabella. Probabilmente avrai bisogno di più colonne di quelle che ho mostrato, probabilmente una sorta di ID, ma probabilmente avrai l'idea.
— mrdenny,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.