SQL Server DESPUÉS DE INSERTAR disparador


10

Quiero que este disparador se active después de que se haya insertado con el texto marrieden la marital_statuscolumna, esto es lo que tengo hasta ahora

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

Respuestas:


11

El problema con el que se encontrará aquí proviene del hecho de que SQL Server no tiene los activadores "FOR EACH ROW" que Oracle tiene. Debe escribir sus desencadenantes para manejar los cambios de varias filas, es decir, las tablas virtuales INSERTED o DELETED pueden tener más de una fila en ellas.

Si se produjera dicha actualización, su desencadenador fallaría, ya (SELECT [marital_status] FROM inserted)que devolvería varias filas, y las subconsultas tienen que devolver un solo valor para usar en una comparación directa.

El disparador probablemente tendría que verse así:

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

Por lo tanto, este desencadenante se acerca bastante a lo que necesita. Ahora, el problema aquí es que solo se insertará una fila en Applicator_marriage_info si hay alguna fila insertada. ¿Es esto lo que realmente quieres? ¿Qué sucede si hay varias filas insertadas a la vez?

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

Probablemente necesitará más columnas de las que he mostrado.


Debe hacerse cada vez que se ingresan estos datos
kabuto178

2
Entonces, una forma es reemplazar la última parte conBEGIN INSERT INTO [dbo].[applicant_marriage_info]([dom]) SELECT 'abc' FROM inserted WHERE marital_status = 'married' END
ypercubeᵀᴹ

He cambiado un poco el código de muestra para dar cuenta de esto. Ya no necesita el bit IF EXISTS. Simplemente ejecute la consulta contra insertada y cargue esos datos en la otra tabla. Probablemente necesitará más columnas de las que he mostrado, probablemente algún tipo de identificación, pero probablemente se haga una idea.
mrdenny
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.