Eu configurei um service broker pela primeira vez e testei... Parece bom. Toda vez que uma operação DML acontece em uma tabela específica; Digamos a Tabela de Preços, uma trigger chama uma stored procedure passando para ela as tabelas inseridas e deletadas como parâmetros XML que vão enviar a mensagem (contendo os 2 XMLs) para a fila.
O procedimento de ativação processa a fila e insere as alterações feitas na tabela inicial em uma tabela de auditoria... Funciona muito bem.
O Problema ocorre quando a atualização da tabela Price é massiva. No meu caso, testei uma atualização de alteração de preço em 105.000 itens. As variáveis XML inseridas e excluídas contêm 1,3 milhão de linhas cada... O que causa grandes problemas: TempDB cresce infinitamente e o processador sobe para 95%, o que é compreensível... mas nunca parece concluir a operação.
O código para o Trigger é Price_TAB_Audit_trig . O gatilho chama o procedimento SendMsgServiceBroker para enviar a mensagem para a Fila. Veja os comentários abaixo para o procedimento de ativação.
Estou tentando descobrir como posso dividir as variáveis inseridas e excluídas (mensagens) em XMLs menores. Minhas perguntas/pensamentos são: Posso criar variáveis de tabela e passar isso na mensagem em vez de XML? Se sim, como criar tabelas de variáveis em uma trigger? Devo criar tabelas temporárias exclusivas globais e referenciá-las na mensagem?
Qualquer outra sugestão, é bem vinda. Desde já agradeço JG
Você pode enviar os dados xml em blocos predefinidos usando algo como o gatilho na configuração a seguir.
Crie o testbed no tempdb:
O gatilho:
Insira alguns dados de teste para ver o que o gatilho faz:
Mostrar resultados:
A título de exemplo para usar um parâmetro com valor de tabela para passar os detalhes em seu procedimento armazenado, dê uma olhada nisso:
Limpe os objetos do ambiente de teste, se eles já existirem:
Crie objetos de teste:
Teste o gatilho/processo armazenado:
Veja o que está nas tabelas de destino:
Isso provavelmente ainda será bastante problemático se o espaço for um prêmio e você decidir atualizar muitas linhas, pois o SQL Server precisará alocar espaço na variável de tabela para todos os dados presentes em
inserted
edeleted
.No entanto, esta é uma maneira elegante de abordar o problema, pelo menos do ponto de vista da legibilidade do código.