Execução do gatilho DML
Os gatilhos AFTER jamais são executados em caso de uma violação de restrição; por isso, estes gatilhos não podem ser usados em processamentos que possam evitar as violações de restrição.
São executados gatilhos INSTEAD OF em lugar da ação de gatilho. Esses gatilhos são executados após as tabelas inserted e deleted, que refletem as alterações na tabela base, serem criadas; mas, antes de qualquer outra ação ser tomada. Eles são executados antes de qualquer restrição, assim podem executar o pré-processamento que complementa as ações de restrição.
Se um gatilho INSTEAD OF definido em uma tabela executar uma instrução na tabela que normalmente acionaria o gatilho INSTEAD OF novamente, o gatilho não será chamado de forma recorrente. Em vez disso, a instrução será processada como se a tabela não tivesse o gatilho INSTEAD OF, e iniciará a cadeia de operações de restrições e de execuções do gatilho AFTER. Por exemplo, se um gatilho DML estiver definido como INSTEAD OF INSERT para uma tabela, e o gatilho executar uma instrução INSTEAD OF na mesma tabela, a instrução INSERT executada pelo gatilho INSTEAD OF não chamará o gatilho novamente. A instrução INSERT executada pelo gatilho inicia o processo de efetuar as ações de restrição e acionar todos os gatilhos AFTER INSERT definidos para a tabela.
Se um gatilho INSTEAD OF definido em uma exibição executar uma instrução na exibição que normalmente acionaria o gatilho INSTEAD OF novamente, ele não será chamado de forma recorrente. Pelo contrário, a instrução será solucionada como as modificações nas tabelas de base subjacentes à exibição. Nesse caso, a definição da exibição deve cumprir todas as restrições de uma exibição atualizável. Para uma definição sobre exibições atualizáveis, consulte Modificando dados por meio de uma exibição. Por exemplo, se um gatilho DML estiver definido como INSTEAD OF UPDATE, para uma exibição, e o gatilho executar uma instrução UPDATE referenciando a mesma exibição, a instrução INSERT executada pelo gatilho INSTEAD OF não chamará o gatilho novamente. A instrução UPDATE executada pelo gatilho será processada na exibição como se ela não tivesse um gatilho INSTEAD OF. As colunas alteradas pela UPDATE devem ser solucionadas como uma única tabela base. Toda modificação em uma tabela base subjacente inicia a cadeia de aplicações de restrição, e aciona os gatilhos AFTER INSERT definidos para a tabela.
A sobrecarga de desempenho do gatilho DML geralmente é baixa. O tempo envolvido na execução de um gatilho DML é decorrido, principalmente, para fazer referência a outras tabelas, o que pode se dar tanto na memória como no dispositivo de banco de dados. As tabelas deteted e inserted estão sempre na memória. O local de outras tabelas referenciadas pelo gatilho determina a extensão de tempo exigida pela operação.
Observação |
---|
O uso de cursores em gatilhos DML não é recomendado, devido ao impacto potencialmente negativo no desempenho. Use a lógica baseada em conjunto de linhas em lugar de cursores, para projetar um gatilho DML que afeta diversas linhas. |
Execução do gatilho DML e exibições particionadas
A maneira como os gatilhos UPDATE e DELETE são acionados nas tabelas que compõem uma exibição particionada sofreu alteração em relação à maneira como são acionados no SQL Server 2000. No SQL Server 2000, quando uma instrução UPDATE ou DELETE é emitida em uma exibição particionada, local ou distribuída, todo o gatilho UPDATE ou DELETE definido nas tabelas de base da exibição é acionado. Isso inclui os gatilhos nas tabelas que não são afetadas pela operação de atualização nem de exclusão. No SQL Server 2008 e no SQL Server 2005, um gatilho UPDATE ou DELETE é acionado somente se a tabela base na qual o gatilho está definido for afetada pela operação de atualização ou exclusão. Esse comportamento é o mesmo para os gatilhos AFTER e INSTEAD OF.
Por exemplo, considere uma exibição particionada PV que consiste de campos de tabelas T1 e T2. Além disso, T1 e T2 têm gatilhos UPDATE definidos neles. No SQL Server 2000, uma instrução UPDATE emitida contra PV que afeta somente as linhas em T1 desencadeia o acionamento dos gatilhos UPDATE de T1 e T2. No SQL Server 2008 e no SQL Server 2005, somente o gatilho UPDATE definido em T1 é acionado.
As tabelas a seguir resumem as mudanças de comportamento.
Operação de inserção, atualização ou exclusão em uma exibição local particionada
|
SQL Server 2000 |
Versão atual |
---|---|---|
INSERT TRIGGER |
Aciona somente em tabelas afetadas. |
Aciona somente em tabelas afetadas. |
UPDATE TRIGGER |
Aciona para todas as tabelas subjacentes à exibição particionada nas quais esse tipo de gatilho está definido. |
Aciona somente em tabelas afetadas. |
DELETE TRIGGER |
Aciona para todas as tabelas subjacentes à exibição particionada nas quais esse tipo de gatilho está definido. |
Aciona somente em tabelas afetadas. |
Operação de inserção, atualização ou exclusão em uma exibição particionada distribuída
|
SQL Server 2000 |
Versão atual |
---|---|---|
INSERT TRIGGER |
Aciona somente nas tabelas afetadas da exibição particionada distribuída. Os gatilhos definidos nas tabelas na instância local e remota poderão ser acionados, se as tabelas forem afetadas. |
Aciona somente nas tabelas afetadas da exibição particionada distribuída. Os gatilhos definidos nas tabelas nas instâncias local e remota podem ser acionados, se as tabelas forem afetadas. |
UPDATE TRIGGER |
Aciona para todas as tabelas subjacentes à exibição particionada nas quais esse tipo de gatilho está definido. |
Aciona para todas as tabelas na instância remota nas quais esse tipo de gatilho está definido. Aciona somente em tabelas afetadas na instância local. |
DELETE TRIGGER |
Aciona para todas as tabelas subjacentes à exibição particionada nas quais esse tipo de gatilho está definido. |
Aciona para todas as tabelas na instância remota nas quais esse tipo de gatilho está definido. Aciona somente em tabelas afetadas na instância local. |
Consulte também