Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server - après le déclencheur d'insertion - mettre à jour une autre colonne dans la même table

Cela dépend du niveau de récursivité des déclencheurs actuellement définis sur la base de données.

Si vous faites ceci :

SP_CONFIGURE 'nested_triggers',0
GO
RECONFIGURE
GO

Ou ceci :

ALTER DATABASE db_name
SET RECURSIVE_TRIGGERS OFF

Ce déclencheur ci-dessus ne sera plus appelé, et vous seriez en sécurité (à moins que vous ne vous retrouviez dans une sorte d'impasse ; cela pourrait être possible, mais peut-être que je me trompe).

Pourtant, je ne le fais pas pense que c'est une bonne idée. Une meilleure option serait d'utiliser un déclencheur AU LIEU DE . De cette façon, vous éviterez d'exécuter la première mise à jour (manuelle) sur la base de données. Seul celui défini à l'intérieur du déclencheur serait exécuté.

Un déclencheur INSTEAD OF INSERT ressemblerait à ceci :

CREATE TRIGGER setDescToUpper ON part_numbers
INSTEAD OF INSERT
AS
BEGIN
    INSERT INTO part_numbers (
        colA,
        colB,
        part_description
    ) SELECT
        colA,
        colB,
        UPPER(part_description)
    ) FROM
        INSERTED
END
GO

Cela "remplacerait" automatiquement l'instruction INSERT d'origine par celle-ci, avec un appel UPPER explicite appliqué à la part_description champ.

Un déclencheur INSTEAD OF UPDATE serait similaire (et je ne vous conseille pas de créer un seul déclencheur, gardez-les séparés).

En outre, cela répond au commentaire de @Martin :cela fonctionne pour les insertions/mises à jour multilignes (ce n'est pas le cas de votre exemple).