SQL Server AFTER INSERT-Trigger

10

Ich möchte, dass dieser Auslöser ausgelöst wird, nachdem eine Einfügung mit dem Text marriedin der marital_statusSpalte vorgenommen wurde. Dies ist, was ich bisher habe

ALTER TRIGGER [dbo].[marriage]
ON  [dbo].[applicant_personal_info]
AFTER INSERT
AS 
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
IF (SELECT [marital_status] FROM inserted) = 'married'
 BEGIN
     INSERT INTO [dbo].[applicant_marriage_info]([dom])
     VALUES('abc')
 END
END
kabuto178
quelle

Antworten:

11

Das Problem, auf das Sie hier stoßen, ist darauf zurückzuführen, dass SQL Server nicht über die von Oracle ausgeführten "FOR EACH ROW" -Trigger verfügt. Sie müssen Ihre Trigger schreiben, um mehrzeilige Änderungen zu verarbeiten, dh die virtuellen Tabellen INSERTED oder DELETED können mehr als eine Zeile enthalten.

Wenn eine solche Aktualisierung stattfinden würde, (SELECT [marital_status] FROM inserted)würde Ihr Trigger fehlschlagen, da mehrere Zeilen zurückgegeben würden und Unterabfragen einen einzelnen Wert zurückgeben müssen, um für einen direkten Vergleich verwendet zu werden.

Der Auslöser müsste wahrscheinlich ungefähr so ​​aussehen:

CREATE TRIGGER [dbo].[marriage] ON  [dbo].[applicant_personal_info] FOR INSERT
AS 
BEGIN
    SET NOCOUNT ON
    IF EXISTS (SELECT [marital_status] FROM INSERTED WHERE marital_status = 'married')
    BEGIN
        INSERT INTO [dbo].[applicant_marriage_info] ([dom])
        SELECT
            'abc' --Replace with whatever you're really inserting
        FROM INSERTED
        WHERE marital_status = 'married'
    END
END
db2
quelle
8

Dieser Auslöser ist also ziemlich nah an dem, was Sie brauchen. Das Problem hierbei ist nun, dass nur eine Zeile in Bewerber_marriage_info eingefügt wird, wenn Zeilen eingefügt werden. Wollen Sie das eigentlich? Was passiert, wenn mehrere Zeilen gleichzeitig eingefügt werden?

ALTER TRIGGER [dbo].[marriage]
ON  [dbo].[applicant_personal_info]
AFTER INSERT
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    INSERT INTO [dbo].[applicant_marriage_info]([dom])
    SELECT 'abc' 
    FROM inserted 
    WHERE marital_status = 'married'
END

Sie benötigen wahrscheinlich mehr Spalten als ich gezeigt habe.

mrdenny
quelle
Es sollte jedes Mal gemacht werden, wenn diese Daten eingegeben werden
kabuto178
2
Dann besteht eine Möglichkeit darin, den letzten Teil durchBEGIN INSERT INTO [dbo].[applicant_marriage_info]([dom]) SELECT 'abc' FROM inserted WHERE marital_status = 'married' END
ypercubeᵀᴹ
Ich habe den Beispielcode ein wenig geändert, um dies zu berücksichtigen. Sie brauchen das IF EXISTS-Bit nicht mehr. Führen Sie die Abfrage einfach gegen eingefügt aus und laden Sie diese Daten in die andere Tabelle. Sie werden wahrscheinlich mehr Spalten benötigen, als ich gezeigt habe, wahrscheinlich eine Art ID, aber Sie haben wahrscheinlich die Idee.
Mrdenny