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

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

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.