.NET BulkCopy Attiva solo trigger su un solo inserto

.net c# sqlbulkcopy sql-server triggers

Domanda

Eseguo un trigger su ciascun inserto su un tavolo. Sto usando il bulkcopy per fare un inserto in serie in questa tabella. Leggo che FireTriggers spara il mio grilletto sul tavolo, ma lo fa solo una volta, non per ogni inserto. L'attivatore prende alcuni dati dall'elemento inserito e lo inserisce in un'altra tabella. Vedo solo una riga inserita nell'altra tabella e non più di una. Mi manca un'opzione?

var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default | SqlBulkCopyOptions.FireTriggers, transaction);

Risposta accettata

Stavo già assegnando un id di gruppo collettivo a tutti gli articoli. Ho realizzato questo con il seguente:

1. If item has bulk group id
2. If item is being inserted, not updated
3. Do a select into from a selection of items based on the bulk group id

grilletto

    IF(@BulkGroupInsertId IS NULL OR EXISTS (SELECT * FROM DELETED))
    BEGIN
        -- Do Single Insert
    END
    ELSE
    BEGIN

    -- Bulk Insert

        INSERT INTO TeamSubscription (DivisionTeamId, PhoneNumber, DateCreated)
        SELECT tc.TeamId, p.MobilePhone, GETDATE()
        FROM
            -- Commented Out
        WHERE 
            -- Commented Out
        GROUP BY
            -- Commented Out

    END 

Risposta popolare

"Per ogni inserto" o per ogni "riga"? Sembra che tu ti aspetti di vedere il grilletto per ogni fila.

Questo è un malinteso comune sui grilletti - che sparano una volta per fila. Non lo fanno. Sparano una volta per cambio. C'è una tabella virtuale chiamata "inserita" all'interno del corpo del trigger che contiene tutte le nuove righe inserite. Sembra molto che il trigger nel database stia leggendo solo una riga da questa tabella, non l'intera cosa. Questo, purtroppo, è un difetto di progettazione comune nel modo in cui molte persone implementano i trigger nei database di SQL Server.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow