sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server:después del activador de inserción, actualice otra columna en la misma tabla

Depende del nivel de recursividad de los disparadores configurados actualmente en la base de datos.

Si haces esto:

SP_CONFIGURE 'nested_triggers',0
GO
RECONFIGURE
GO

O esto:

ALTER DATABASE db_name
SET RECURSIVE_TRIGGERS OFF

Ese activador anterior no volverá a activarse y estarás a salvo (a menos que entres en algún tipo de punto muerto; eso podría ser posible, pero tal vez me equivoque).

Aún así, no Creo que esta es una buena idea. Una mejor opción sería usar un EN LUGAR DE activador . De esa forma, evitaría ejecutar la primera actualización (manual) sobre la base de datos. Solo se ejecutará el definido dentro del disparador.

Un activador INSTEAD OF INSERT sería así:

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

Esto "reemplazaría" automáticamente la declaración INSERT original por esta, con una llamada SUPERIOR explícita aplicada a part_description campo.

Un disparador EN VEZ DE ACTUALIZAR sería similar (y no le aconsejo que cree un solo disparador, manténgalos separados).

Además, esto aborda el comentario de @Martin:funciona para inserciones/actualizaciones de varias filas (su ejemplo no lo hace).