Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server - após o gatilho de inserção - atualize outra coluna na mesma tabela


Depende do nível de recursão para gatilhos atualmente definidos no banco de dados.

Se você fizer isto:
SP_CONFIGURE 'nested_triggers',0
GO
RECONFIGURE
GO

Ou isto:
ALTER DATABASE db_name
SET RECURSIVE_TRIGGERS OFF

Esse gatilho acima não será chamado novamente, e você estaria seguro (a menos que você entre em algum tipo de impasse; isso pode ser possível, mas talvez eu esteja errado).

Ainda assim, eu não acho que isso é uma boa ideia. Uma opção melhor seria usar um INSTEAD OF trigger . Dessa forma, você evitaria executar a primeira atualização (manual) no banco de dados. Apenas o definido dentro do gatilho seria executado.

Um gatilho INSTEAD OF INSERT seria assim:
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

Isso automaticamente "substituiria" a instrução INSERT original por esta, com uma chamada UPPER explícita aplicada ao part_description campo.

Um gatilho INSTEAD OF UPDATE seria semelhante (e eu não aconselho você a criar um único gatilho, mantenha-os separados).

Além disso, isso aborda o comentário @Martin:funciona para inserções/atualizações de várias linhas (seu exemplo não).