Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server – nach dem Insert-Trigger – aktualisieren Sie eine andere Spalte in derselben Tabelle

Dies hängt von der Rekursionsebene für Trigger ab, die derzeit in der DB eingestellt sind.

Wenn Sie dies tun:

SP_CONFIGURE 'nested_triggers',0
GO
RECONFIGURE
GO

Oder dies:

ALTER DATABASE db_name
SET RECURSIVE_TRIGGERS OFF

Der obige Auslöser wird nicht erneut aufgerufen, und Sie wären sicher (es sei denn, Sie geraten in eine Art Sackgasse; das könnte möglich sein, aber vielleicht irre ich mich).

Trotzdem nicht denke das ist eine gute idee. Eine bessere Option wäre die Verwendung eines ANSTATT DES Triggers . Auf diese Weise würden Sie vermeiden, das erste (manuelle) Update über die DB auszuführen. Nur der im Trigger definierte wird ausgeführt.

Ein INSTEAD OF INSERT-Trigger würde so aussehen:

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

Dies würde automatisch die ursprüngliche INSERT-Anweisung durch diese ersetzen, wobei ein expliziter UPPER-Aufruf auf die part_description angewendet wird Feld.

Ein INSTEAD OF UPDATE-Trigger wäre ähnlich (und ich rate Ihnen nicht, einen einzelnen Trigger zu erstellen, halten Sie sie getrennt).

Dies adressiert auch den @Martin-Kommentar:Es funktioniert für mehrzeilige Einfügungen/Aktualisierungen (in Ihrem Beispiel nicht).