SQL Server ПОСЛЕ ВСТАВКИ триггер

10

Я хочу, чтобы этот триггер был запущен после вставки с текстом marriedв marital_statusстолбце, это то, что я до сих пор

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
источник

Ответы:

11

Проблема, с которой вы здесь столкнетесь, связана с тем, что в SQL Server нет триггеров «FOR EACH ROW», как в Oracle. Вы должны написать свои триггеры для обработки многострочных изменений, то есть виртуальные таблицы INSERTED или DELETED могут содержать более одной строки.

Если такое обновление произойдет, ваш триггер завершится ошибкой, поскольку (SELECT [marital_status] FROM inserted)вернет несколько строк, а подзапросы должны вернуть одно значение, которое будет использовано при прямом сравнении.

Вероятно, триггер должен выглядеть примерно так:

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
источник
8

Так что этот триггер на самом деле довольно близок к тому, что вам нужно. Теперь проблема заключается в том, что только одна строка будет вставлена ​​в Applicant_marriage_info, если есть какие-либо строки во вставке. Это то, что вы на самом деле хотите? Что произойдет, если будет вставлено несколько строк одновременно?

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

Возможно, вам понадобится больше столбцов, чем я показал.

mrdenny
источник
Это следует делать каждый раз, когда вводятся эти данные
kabuto178
2
Тогда один из способов - заменить последнюю часть наBEGIN INSERT INTO [dbo].[applicant_marriage_info]([dom]) SELECT 'abc' FROM inserted WHERE marital_status = 'married' END
ypercubeᵀᴹ
Я немного изменил пример кода, чтобы учесть это. Вам не нужно, если бит EXISTS больше. Просто запустите запрос для вставленных и загрузите эти данные в другую таблицу. Возможно, вам понадобится больше столбцов, чем я показал, возможно, какой-то идентификатор, но вы, вероятно, поняли идею.
13