Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Método mais eficiente para detectar alteração de coluna no MS SQL Server


Vamos começar com eu nunca e quero dizer nunca invocar um proc armazenado em um gatilho. Para contabilizar uma inserção de várias linhas, você teria que passar o cursor pelo proc. Isso significa que as 200.000 linhas que você acabou de carregar por meio de uma consulta baseada em conjunto (digamos, atualizando todos os preços em 10%) podem bloquear a tabela por horas enquanto o gatilho tenta corajosamente lidar com a carga. Além disso, se algo mudar no proc, você pode quebrar todas as inserções na mesa ou até mesmo desligar completamente a mesa. Eu acredito firmemente que o código do gatilho não deve chamar mais nada fora do gatilho.

Pessoalmente, prefiro simplesmente fazer a minha tarefa. Se eu escrevi as ações que quero fazer corretamente no gatilho, ele apenas atualizará, excluirá ou inserirá onde as colunas foram alteradas.

Exemplo:suponha que você deseja atualizar o campo last_name que está armazenando em dois locais devido a uma desnormalização colocada lá por motivos de desempenho.
update t
set lname = i.lname
from table2 t 
join inserted i on t.fkfield = i.pkfield
where t.lname <>i.lname

Como você pode ver, ele atualizaria apenas os lnames que são diferentes do que está atualmente na tabela que estou atualizando.

Se você quiser fazer auditoria e registrar apenas as linhas que foram alteradas, faça a comparação usando todos os campos algo como i.field1 <> d.field1 ou i.field2 <> d.field3 (etc através de todos os campos)