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.