web-dev-qa-db-fra.com

Déclencheur SQL Server AFTER INSERT

Je veux que ce déclencheur soit déclenché après une insertion avec le texte married sur le marital_status colonne, 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
10
kabuto178

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 plus d'une ligne.

Si une telle mise à jour devait se produire, votre déclencheur échouerait, car (SELECT [marital_status] FROM inserted) renverrait 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
11
db2

Ce déclencheur est donc 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é.

8
mrdenny