Was kann der Zweck dieses Auslösers sein?


7

Ich stolpere über diesen Auslöser, wenn ich versuche, eine Datenbank zu analysieren:

Create trigger [tbl_Details_Trigger] on [tbl_Details]
    Instead of Insert
    As
      Insert into [tbl_Details]
      Select * from inserted

Für mich sieht es so aus, als ob dieser Auslöser nichts Besonderes bewirkt, und wenn er fallen gelassen wird, ist das Ergebnis dasselbe. Habe ich recht? Vermisse ich etwas



Ich kann mir zwei Dinge vorstellen, die sich von der ursprünglichen Beilage unterscheiden könnten: Die Reihenfolge von geht verloren (falls vorhanden) und es gibt die berüchtigten *, die die Beilage beschädigen könnten, wenn Sie eine Identitätsspalte haben, die nicht eingefügt werden kann. Beide Dinge sind negativ, daher kann ich mir keinen guten Grund vorstellen, dies zu verwenden.
EzLo

@ Eslo - gute Punkte, obwohl Einfügungen die ORDER BYKlausel tatsächlich ignorieren , wenn sie in der INSERTAnweisung enthalten ist.
Max Vernon

1
@MaxVernon gut darauf hinzuweisen, wusste nicht, dass Zeilen nicht geordnet wurden, wenn es keine Identitätsspalte oder TOP (teilweise) gibt, und es ist sinnvoll, es zu ignorieren.
EzLo

Antworten:


3

Du hast Recht; Da dieser Trigger ein INSTEAD OF INSERTTrigger ist, der einfach eingefügte Daten in die Tabelle einfügt, für die der Trigger definiert ist, besteht das einzige Ergebnis darin, die Daten so einzufügen, als ob der Trigger nicht vorhanden wäre.

Stellen Sie wie bei allen Änderungen sicher, dass Sie die Änderung in Ihrer Entwicklungs- / Testumgebung testen, bevor Sie diesen Auslöser in der Produktion löschen.

Interessanterweise können IDENTITYSie den Trigger nicht erstellen , wenn die Tabelle eine Spalte enthält . Betrachten Sie diesen Repro, der unter SQL Server 2016+ ausgeführt wird:

USE tempdb;
DROP TABLE IF EXISTS dbo.insert_test;
CREATE TABLE dbo.insert_test
(
    i int NOT NULL
        CONSTRAINT PK_insert_test
        PRIMARY KEY CLUSTERED
        IDENTITY(1,1)
    , d varchar(100) NOT NULL
);
GO
CREATE TRIGGER insert_test_trigger ON dbo.insert_test
INSTEAD OF INSERT
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO dbo.insert_test (i, d)
    SELECT i, d
    FROM inserted;
END
GO

INSERT INTO dbo.insert_test (d)
VALUES ('test');

SELECT *
FROM dbo.insert_test;

Ergebnisse:

Nachricht 544, Ebene 16, Status 1, Prozedur insert_test_trigger, Zeile 8 [Stapelstartzeile 24] Der
explizite Wert für die Identitätsspalte in Tabelle 'insert_test' kann nicht eingefügt werden, wenn IDENTITY_INSERT auf OFF gesetzt ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.