Wyzwalacz SQL Server PO WSTAWIENIU

10

Chcę, aby ten wyzwalacz był uruchamiany po wstawieniu wstawki z tekstem marriedw marital_statuskolumnie, oto co mam do tej pory

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
źródło

Odpowiedzi:

11

Problem, na który natkniesz się tutaj, wynika z faktu, że SQL Server nie ma wyzwalaczy „FOR EACH ROW”, które ma Oracle. Musisz napisać swoje wyzwalacze, aby obsłużyć zmiany w wielu wierszach, tj. Tabele wirtualne WSTAWIONE lub USUWANE mogą zawierać w nich więcej niż jeden wiersz.

Jeśli taka aktualizacja miałaby się zdarzyć, wyzwalacz nie powiódłby się, ponieważ (SELECT [marital_status] FROM inserted)zwróciłoby wiele wierszy, a podzapytania musiałyby zwrócić jedną wartość, aby mogła zostać użyta do bezpośredniego porównania.

Spust prawdopodobnie musiałby wyglądać mniej więcej tak:

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
źródło
8

Tak więc ten wyzwalacz jest naprawdę bardzo blisko tego, czego potrzebujesz. Problem polega na tym, że tylko jeden wiersz zostanie wstawiony do info_marriage_info, jeśli wstawiono jakieś wiersze. Czy tego właśnie chcesz? Co się stanie, jeśli zostanie wstawionych wiele wierszy jednocześnie?

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

Prawdopodobnie będziesz potrzebować więcej kolumn niż pokazałem.

mrdenny
źródło
Należy to robić za każdym razem, gdy wprowadzane są te dane
kabuto178
2
Następnie jednym ze sposobów jest zastąpienie ostatniej częściBEGIN INSERT INTO [dbo].[applicant_marriage_info]([dom]) SELECT 'abc' FROM inserted WHERE marital_status = 'married' END
ypercubeᵀᴹ
Zmieniłem nieco przykładowy kod, aby to uwzględnić. Nie potrzebujesz już więcej IF IFISTS. Wystarczy uruchomić zapytanie względem wstawionego i załadować te dane do drugiej tabeli. Prawdopodobnie będziesz potrzebować więcej kolumn, niż mi pokazano, prawdopodobnie jakiś identyfikator, ale prawdopodobnie masz pomysł.
mrdenny,