Gatilho AFTER INSERT do SQL Server

10

Eu quero que esse gatilho seja acionado depois que uma inserção for feita com o texto marriedna marital_statuscoluna, é isso que eu tenho até agora

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
fonte

Respostas:

11

O problema que você encontrará aqui vem do fato de o SQL Server não possuir os gatilhos "FOR EACH ROW" que o Oracle possui. Você precisa escrever seus gatilhos para lidar com alterações de várias linhas, ou seja, as tabelas virtuais INSERTED ou DELETED podem ter mais de uma linha.

Se tal atualização acontecer, seu gatilho falhará, pois (SELECT [marital_status] FROM inserted)retornará várias linhas e as subconsultas deverão retornar um único valor para serem usadas em uma comparação direta.

O gatilho provavelmente teria que se parecer com isso:

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
fonte
8

Portanto, esse gatilho é realmente muito próximo do que você precisa. Agora, o problema aqui é que apenas uma linha será inserida em candidate_marriage_info se houver alguma linha inserida. É isso que você realmente quer? O que acontece se houver várias linhas inseridas ao mesmo tempo?

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

Você provavelmente precisará de mais colunas do que eu mostrei.

Mrdenny
fonte
Deve ser feito cada vez que esses dados são inseridos
kabuto178
2
Então é uma maneira de substituir a última parte comBEGIN INSERT INTO [dbo].[applicant_marriage_info]([dom]) SELECT 'abc' FROM inserted WHERE marital_status = 'married' END
ypercubeᵀᴹ
Alterei um pouco o código de exemplo para explicar isso. Você não precisa mais do bit IF EXISTS. Basta executar a consulta no inserido e carregar esses dados na outra tabela. Você provavelmente precisará de mais colunas do que mostrei, provavelmente algum tipo de ID, mas provavelmente entendeu a ideia.
mrdenny