É sábio usar o gatilho para atualizar outra tabela?

8

Eu tenho uma Objecttabela que é preenchida a partir de um serviço Integrado ( que eu posso alterar se necessário ) de outro banco de dados. Em certos pontos, precisamos adicionar manualmente as postagens em outra tabela, ObjectObjectGroup (ObjectId, ObjectGroupId)que é necessária se Object.ObjectTypetiver um determinado valor inteiro. Como o serviço de integração não lida com esse tipo de atualização, estou pensando em adicionar um gatilho à tabela Object, que no pseudo-código seria o seguinte:

if Object.ObjectType = 10
    begin
        if Object.ObjectNumber like '<string pattern>'
        begin
            insert into ObjectObjectGroup values...
        end
    end

Essa configuração é sensata ou existe uma maneira melhor em termos de desempenho?

Benny Skogberg
fonte

Respostas:

9

Principalmente Copiar / colar minha resposta desta pergunta no stackoverflow

Os gatilhos podem ser muito atraentes, quando você começa a usá-los, eles parecem uma bala mágica para todos os tipos de problemas. Mas eles fazem coisas "mágicas" acontecerem; se você não conhece o banco de dados de dentro para fora, pode parecer coisas realmente estranhas acontecerem (como inserções em outras tabelas, alteração de dados de entrada etc.). Antes de implementar as coisas como um gatilho, eu consideraria seriamente impor o uso de uma API ao redor do esquema (de preferência no banco de dados, mas fora, se não puder).

Algumas coisas para as quais eu ainda usaria gatilhos

  • Acompanhar os campos "date_created" e "date_last_edit"
  • Inserindo "ID" 's (no oracle, onde não há campo de identificação automática)
  • Mantendo o histórico de alterações

Coisas para as quais você não gostaria de usar gatilhos

  • regras de negócios / lógica
  • qualquer coisa que se conecte fora do banco de dados (por exemplo, uma chamada de serviço da web)
  • Controle de acesso
  • Qualquer coisa que não seja transacional (qualquer coisa que você faça no gatilho DEVE ser capaz de reverter com a transação)
Matthew Watson
fonte
4

Sim, é sábio. Esse é o objetivo de um gatilho, na verdade, executar as ações necessárias após uma operação de inserção / atualização / exclusão em uma tabela.

Você precisa levar em consideração o fato de que um gatilho no MS SQL não tratará cada linha separadamente, mas tratará todas as linhas da transação atual de uma só vez. Portanto, se uma operação inserir 10 linhas ao mesmo tempo, você precisará pensar no código do gatilho para tratar todas as linhas ao mesmo tempo.

Marian
fonte
11
Contanto que o serviço que está preenchendo o banco de dados não esteja fazendo tudo o que o homem precisa e contanto que ele não possa alterar o serviço (esse é o meu sentimento após a descrição), e a pergunta está aqui no DBA.SE, não nos programadores , Direi que um gatilho bem documentado não deve ser problema. Ele disse que está fazendo algumas coisas manualmente, de modo alteração de código não poderia ser envolvido pelo que eu entendo ..
Marian
11
Nesse caso, pode ser a única opção viável, que não o torna sábio. A melhor coisa a fazer seria empurrar o desenvolvedor de aplicativos e fazê-lo inserir corretamente nas duas tabelas.
Matthew Watson
tosse . Eu vejo para onde isso está indo. Desculpe por não estar claro na minha pergunta acima. Eu tenho a possibilidade de alterar o serviço de integração, mesmo que não seja "de propriedade" de mim. Pelo que posso ler, é melhor alterar o serviço de integração e usar apenas gatilhos para serviços de auditoria / registro de histórico.
Benny Skogberg
3

Os gatilhos são uma ferramenta poderosa e, como qualquer outra ferramenta, você precisa ter cuidado ao usá-los.

  1. Quando você cometer um erro em um gatilho, as coisas podem dar errado DRASTICAMENTE e, a menos que você esteja executando traços, não perceberá ...

  2. Eles 'magicamente' alteram / inserem / excluem dados que o usuário do banco de dados (o aplicativo atual / qualquer aplicativo futuro / um desenvolvedor fazendo uma atualização única) não realizou / pretendeu.

O grande problema é que, depois que você criou o gatilho, não é óbvio para outros desenvolvedores / usuários que um gatilho está lá e o que ele faz.

Dito isto, eles são uma ótima ferramenta para manter a integridade de seus dados e para uma verdadeira auditoria de alterações.

Você precisa se perguntar se a lógica que deseja colocar no gatilho se encaixa melhor no (s) aplicativo (s) ou no banco de dados, ponderando os riscos de ambos os lados (o que acontece se um novo aplicativo aparecer e não aplicar isso? regra?)

Andrew Bickerton
fonte