Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server - dopo l'inserimento del trigger - aggiorna un'altra colonna nella stessa tabella

Dipende dal livello di ricorsione per i trigger attualmente impostati sul DB.

Se lo fai:

SP_CONFIGURE 'nested_triggers',0
GO
RECONFIGURE
GO

O questo:

ALTER DATABASE db_name
SET RECURSIVE_TRIGGERS OFF

Quel trigger sopra non verrà chiamato di nuovo e saresti al sicuro (a meno che tu non entri in una sorta di stallo; potrebbe essere possibile ma forse mi sbaglio).

Tuttavia, io non pensa che questa sia una buona idea. Un'opzione migliore sarebbe utilizzare un INVECE DI trigger . In questo modo eviterai di eseguire il primo aggiornamento (manuale) sul DB. Verrebbe eseguito solo quello definito all'interno del trigger.

Un trigger INSTEAD OF INSERT sarebbe come questo:

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

Questo "sostituirebbe" automaticamente l'istruzione INSERT originale con questa, con un'esplicita chiamata UPPER applicata alla part_description campo.

Un trigger INSTEAD OF UPDATE sarebbe simile (e non ti consiglio di creare un trigger singolo, tienili separati).

Inoltre, questo indirizza il commento di @Martin:funziona per inserimenti/aggiornamenti multiriga (il tuo esempio no).