Déclencheur SQL Server AFTER INSERT

10

Je veux que ce déclencheur soit déclenché après une insertion avec le texte marriedsur la marital_statuscolonne, c'est ce que j'ai jusqu'à présent

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
kabuto178
la source

Réponses:

11

Le problème que vous rencontrerez ici vient du fait que SQL Server n'a pas les déclencheurs "POUR CHAQUE RANG" qu'Oracle possède. Vous devez écrire vos déclencheurs pour gérer les modifications sur plusieurs lignes, c'est-à-dire que les tables virtuelles INSÉRÉES ou SUPPRIMÉES peuvent contenir plusieurs lignes.

Si une telle mise à jour devait se produire, votre déclencheur échouerait, car (SELECT [marital_status] FROM inserted)retournerait plusieurs lignes, et les sous-requêtes doivent renvoyer une seule valeur pour être utilisées dans une comparaison directe.

Le déclencheur devrait probablement ressembler à ceci:

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
db2
la source
8

Donc, ce déclencheur est en fait assez proche de ce dont vous avez besoin. Maintenant, le problème ici est qu'une seule ligne sera insérée dans candidate_marriage_info s'il y a des lignes insérées. Est-ce vraiment ce que vous voulez? Que se passe-t-il s'il y a plusieurs lignes insérées à la fois?

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

Vous aurez probablement besoin de plus de colonnes que ce que j'ai montré.

mrdenny
la source
Cela devrait être fait à chaque fois que ces données sont entrées
kabuto178
2
Ensuite, une façon consiste à remplacer la dernière partie parBEGIN INSERT INTO [dbo].[applicant_marriage_info]([dom]) SELECT 'abc' FROM inserted WHERE marital_status = 'married' END
ypercubeᵀᴹ
J'ai un peu modifié l'exemple de code pour tenir compte de cela. Vous n'avez plus besoin du bit IF EXISTS. Exécutez simplement la requête contre inséré et chargez ces données dans l'autre table. Vous aurez probablement besoin de plus de colonnes que ce que j'ai montré, une sorte d'ID probablement, mais vous avez probablement l'idée.
mrdenny