Controlando execução do gatilho ao importar dados em massa
Um gatilho é um formulário especial de procedimento armazenado que é executado automaticamente quando um usuário modifica dados em uma tabela ou exibição. A execução de gatilhos pode afetar o desempenho de uma operação de importação em massa. Por exemplo, um gatilho que envia uma mensagem de email a cada momento em que um registro é importado reduz a velocidade de uma operação de importação em massa e cria inúmeros emails.
Ao importar dados em massa, pode-se controlar se os gatilhos são executados (disparados) pela operação de importação em massa. Uma operação da importação em massa deve executar gatilhos somente para uma tabela com gatilhos INSERT e INSTEAD OF que ofereça suporte a inserções de várias linhas. Para obter mais informações sobre esses gatilhos, consulte Gatilhos DML.
Importante |
---|
Quando gatilhos são desabilitados, um bloqueio de modificação de esquema deve ser efetuado para atualizar os metadados. Isso pode interferir em outros comandos (como uma montagem de índice online) ou transações. Por exemplo, uma transação de isolamento de instantâneo que acessa a tabela de destino pode falhar devido a alterações de DDL simultâneas. |
Se gatilhos forem desabilitados, eles serão executados uma vez para cada lote.
Durante uma operação de importação em massa, o comportamento depende do comando usado para a operação. Por padrão, o comando bcp e a instrução BULK INSERT (Transact-SQL) desabilitam gatilhos. Por outro lado, para a instrução INSERT... SELECT * FROM OPENROWSET(BULK...), o padrão é executar gatilhos.
A tabela a seguir resume o comportamento padrão.
Comando de importação em massa |
Comportamento padrão |
---|---|
bcp |
Desabilitar gatilhos |
BULK INSERT |
Desabilitar gatilhos |
INSERT ... SELECT * FROM OPENROWSET(BULK...) |
Executar gatilhos |
Cada um dos comandos de importação em massa fornece um qualificador que lhe permite alterar a maneira como os gatilhos são controlados, conforme descrição nas seções a seguir.
Executando gatilhos com bcp ou BULK INSERT
Por padrão, o comando bcp e a instrução BULK INSERT não executam gatilhos. Porém, você pode habilitar gatilhos usando os seguintes qualificadores:
Comando |
Qualificador |
Tipo de qualificador |
---|---|---|
bcp |
-h"FIRE_TRIGGERS" |
Dica |
BULK INSERT |
FIRE_TRIGGERS |
Argumento |
Se FIRE_TRIGGERS estiver especificado para uma operação de importação em massa, ele executa qualquer gatilho INSERT e INSTEAD OF que estiver definido na tabela para todas as linhas inseridas na tabela.
Para obter mais informações, consulte Utilitário bcp e BULK INSERT (Transact-SQL).
Desabilitando gatilhos em INSERT... SELECT * FROM OPENROWSET(BULK...)
Por padrão, o provedor de conjunto de linhas em massa OPENROWSET executa gatilhos. Você pode desabilitar gatilhos usando o seguinte qualificador:
Comando |
Qualificador |
Tipo de qualificador |
---|---|---|
INSERT ... SELECT * FROM OPENROWSET(BULK...) |
WITH (IGNORE_TRIGGERS) |
Dica de tabela |
Se essa dica for especificada, gatilhos não serão executados pelo provedor de conjunto de linhas em massa OPENROWSET. Para obter mais informações sobre a dica IGNORE_TRIGGERS, consulte Dicas de tabela (Transact-SQL).
Importando lotes grandes com gatilhos habilitados
O SQL Server 2005 e versões posteriores usam controle de versão de linha para gatilhos e armazenam as versões de linha no armazenamento de versão em tempdb. Antes de poder executar uma importação em massa de um lote grande de registros de dados que usam gatilhos, você pode precisar expandir o tamanho de tempdb para acomodar o impacto dos gatilhos no armazenamento de versão. Para obter mais informações, consulte Uso do recurso de controle de versão de linha.