Implementando gatilhos DML

Antes de criar um gatilho DML, considere isto:

  • A instrução CREATE TRIGGER deve ser a primeira instrução no lote. Todas as outras instruções nesse lote serão interpretadas como parte da definição da primeira instrução CREATE TRIGGER.

  • Permissão para criar gatilhos DML é padrão para o proprietário da tabela, que não pode transferir isso a outros usuários.

  • Gatilhos DML são objetos de banco de dados e os seus nomes devem seguir as regras para identificadores.

  • Você pode criar um gatilho DML apenas no banco de dados atual, apesar de um gatilho DML poder referenciar objetos fora do banco de dados atual.

  • Um gatilho DML não pode ser criado em uma tabela temporária ou do sistema, embora os gatilhos DML possam fazer referência a tabelas temporárias. Tabelas do sistema não devem ser referenciadas; em vez disso, use Exibições de Informação de Esquema.

  • Os gatilhos INSTEAD OF DELETE e INSTEAD OF UPDATE não podem ser definidos em uma tabela que tenha uma chave estrangeira definida com uma ação DELETE ou UPDATE.

  • Embora a instrução TRUNCATE TABLE seja como uma instrução DELETE sem a cláusula WHERE (exclui todas as linhas), ela não causa o acionamento de gatilhos DELETE, porque a instrução TRUNCATE TABLE não é registrada.

  • A instrução WRITETEXT não causa o acionamento dos gatilhos INSERT ou UPDATE.

Observação importanteImportante

A habilidade de retornar conjuntos de resultados de gatilhos será removida na próxima versão do SQL Server. Os gatilhos que retornam conjuntos de resultados podem causar um comportamento inesperado em aplicativos que não são projetados para trabalhar com eles. Evite retornar conjuntos de resultados de gatilhos em novos trabalhos de desenvolvimento e planeje a modificação de aplicativos que atualmente fazem isto. Para evitar que os gatilhos retornem conjuntos de resultados no SQL Server, defina Opção disallow results from triggers como 1. A configuração padrão dessa opção será 1 em uma versão futura do SQL Server.

Ao criar um gatilho DML, especifique:

  • O nome.

  • A tabela na qual o gatilho está definido.

  • Quando o gatilho é acionado.

  • As instruções de modificação de dados que ativam o gatilho. As opções válidas são INSERT, UPDATE ou DELETE. Mais de uma instrução de modificação de dados pode ativar o mesmo gatilho. Por exemplo, um gatilho pode ser ativado pelas instruções INSERT e UPDATE.

  • As instruções de programação que executam a ação de gatilho.

Vários gatilhos DML

Uma tabela pode ter vários gatilhos AFTER de um determinado tipo contanto que tenham nomes diferentes; cada gatilho pode executar várias funções. Entretanto, cada gatilho pode ser aplicado a apenas uma tabela, apesar de um único gatilho poder ser aplicado a qualquer subconjunto de três ações de usuário (UPDATE, INSERT e DELETE).

Uma tabela pode ter só um gatilho INSTEAD OF de um determinado tipo.

Permissões e propriedade de gatilho

Gatilhos são criados no esquema da tabela ou na exibição na qual eles estão definidos. Por exemplo, se o gatilho Trigger1 for criado na tabela HumanResources.Employee, o nome qualificado pelo esquema do gatilho será HumanResources.

O padrão das permissões CHECKPOINT para proprietários da tabela na qual o gatilho está definido, a função de servidor fixa sysadmin e os membros das funções de banco de dados fixas db_owner e db_backupoperator não são transferíveis.

Se um gatilho INSTEAD OF for criado em uma exibição, a cadeia de propriedade será quebrada se o proprietário da exibição não tiver tabelas base referenciadas por exibição e gatilho. Para uma tabela base que não seja de propriedade do proprietário da exibição, o proprietário da tabela deve conceder as permissões necessárias separadamente a qualquer um que esteja lendo ou atualizando a exibição. Se o mesmo usuário tiver a exibição e as tabelas base subjacentes, eles terão de conceder permissões a outros usuários apenas na exibição, não nas tabelas base individuais. Para obter mais informações, consulte Cadeias de propriedade.

Para criar um gatilho