Temos um fornecedor terceirizado tentando integrar 2 aplicativos diferentes, nos quais os dois bancos de dados residem em nossa instância do SQL Server com mais de 150 outros bancos de dados, e eles desejam criar um trabalho do MSDB para "sincronizar" os dois aplicativos diferentes a cada 5 minutos (no início eles queria executá-lo a cada minuto).
Meu palpite inicial é que eles deveriam fazer isso de alguma forma na camada de aplicativos com um trabalho agendado para Windows ou talvez até com um gatilho temido (ao qual normalmente recorremos em situações como essa).
Prefiro manter os trabalhos do MSDB reservados para as tarefas do DBA, tanto quanto possível, para reduzir a confusão e também ter uma consulta lenta do MSDB ao exibir históricos de trabalhos com trabalhos super ativos como este (que também afogam e eliminam históricos de trabalhos importantes de coisas mais importantes, como históricos de backup). Mas, novamente, talvez minhas preferências estejam erradas e eu precise abrir espaço para a camada Aplicativo no MSDB, arregaçar as mangas e corrigir problemas nos históricos de tarefas que demoram muito para carregar quando preciso reter muito mais entradas do histórico para capturar o coisas importantes, como backups (ou limpe as entradas de trabalho hiperativas).
Outro problema que tenho é que agora preciso conceder direitos de "sysadmin" a esse fornecedor, em vez de apenas "dbo", apenas em seus bancos de dados, quando eles executam suas atualizações por meio da GUI e esperam que não expliquem a instância em que minha missão é crítica Os DBs são (uma das desvantagens da consolidação).
Acho que posso colocá-los em outra instância "isolada" em que colocamos todos os fornecedores que não são bons, mas precisamos reconfigurar os aplicativos para apontar para a nova instância SQL ( suspiro infelizmente não é trivial neste caso).
O fornecedor já recusou minhas preocupações, falando sobre o quão ruim é o gatilho. Então, eu "pesquisei" um pouco sobre isso e vim vazio. Alguém viu algum link por aí com "aparência autoritária" de que essa é uma má idéia e eu posso encaminhá-la a ela? Ou devo abraçar a abordagem deles?
Eu não acredito que eu já tenha postado em um fórum sql antes de pedir ajuda, por isso espero que minha consulta esteja devidamente estruturada.
Edição: Estamos executando o SQL Server 2008 Enterprise R2 x64 SP1 (Obrigado por apontar que eu esqueci de mencionar a versão!). Hmmm, espero que eles não precisem alterar os scripts de atualização do MSDB quando formos para uma versão mais recente.
Obrigado pelo seu tempo! Rico
fonte
sysadmin
para permitir que modifiquem os trabalhos do agente SQL - consulte msdn.microsoft.com/en-us/library/ms188283(v=sql.105).aspxRespostas:
OMI seu fornecedor está realmente no caminho certo.
Um trabalho da camada de aplicativo exigiria que ele refizesse muitos recursos prontos do SQL Agent (por exemplo, lógica para não executar um trabalho que já esteja em execução, crie uma solução de armazenamento de segurança e credenciais, integre os resultados do trabalho com relatório de erros e rastreamento de resultados no SQL etc etc etc etc). E, o mais importante, forneça uma solução de backup / HA / DC para o agendamento. Você não deseja que sua história de recuperação de desastre seja 'e, após concluir a recuperação do servidor em espera, crie essas 50 tarefas do agendador do NT'. Portanto, ele está certo ao se opor ao uso do agendador do sistema, que não possui nada dos recursos e capacidades do Agente.
Ele tem ainda mais razão em recuar contra os gatilhos. Substituir um trabalho periódico por um gatilho síncrono aumenta a latência da solicitação, aumenta a coesão e o acoplamento (pense no esquema alterado ...), aumenta o risco de tempo de inatividade devido a problemas de sincronização (erro de gatilho-> erro de aplicativo vs. erro de trabalho-> corrigir e tentar novamente mais tarde) , aumenta drasticamente os problemas de conflito (devido a atualizações cruzadas entre rastreados / rastreados) e tem muitos outros problemas.
A solução mais fácil é realmente um trabalho de agente e não
msdb
é de forma alguma reservada aos DBAs. Uma solução mais sofisticada seria usar temporizadores de conversação e ativação interna , o que teria algumas vantagens sobre os trabalhos do agente, principalmente devido à contenção (tudo está dentro do banco de dados do aplicativo, pense em espelhar os cenários de failover), mas eu posso entender totalmente se o seu fornecedor está relutante em experimentar algo que requer um conhecimento muito específico. BTW, espero que você não signifique um trabalho a cada 5 minutos por DB .Quanto às permissões do sysadmin: o nome do jogo é assinatura de código . Você pode conceder qualquer permissão a procedimentos específicos, inspecionados e validados por você, assinando-os com seu certificado particular.
fonte
Minha preferência pessoal seria usar gatilhos para lidar com pelo menos uma parte da sincronização. Não ligo particularmente para a sincronização programada de pesquisas, já que você precisa lidar com conflitos em potencial, dados obsoletos, impacto no desempenho da tarefa repetida etc. Se eles quiserem fazer isso de maneira tão agressiva quanto 1 a 5 minutos, acho é para mitigar conflitos e staleness, e o imediatismo de um gatilho resolveria isso.
Se tudo estiver acontecendo no mesmo servidor, você provavelmente colocará o código de sincronização dentro dos gatilhos ou fará com que os gatilhos chamem um procedimento armazenado que sincronize cada registro afetado. Se a sincronização abranger servidores, ou você desejar garantir que ter um banco de dados offline não impeça a utilização do outro banco de dados, consulte o Service Broker para lidar com atualizações assíncronas. Fiz isso para sincronizar os números das entradas de vendas com os dados do CRM entre dois servidores diferentes, permitindo que um dos servidores seja colocado offline, sem afetar o outro aplicativo. Depois que o backup é feito, o Service Broker entrega as mensagens e atualiza os dados no servidor remoto.
E realmente não há nada inerentemente ruim nos gatilhos, mas, como na maioria dos aspectos do T-SQL, é muito possível escrever código que tenha um desempenho horrível. Eu escrevi um artigo sobre as armadilhas comuns dos gatilhos, se isso ajuda.
Escrevendo gatilhos bem comportados
fonte