Estou trabalhando em um grande projeto ETL e DW, onde usamos o controle de fonte / TFS junto com o SSIS e o SSDT.
Hoje, descobri que, enquanto um pacote SSIS está executando um BULK INSERT em uma tabela de banco de dados, não é possível executar uma comparação de esquema SSDT nesse banco de dados. Isso é lamentável, pois alguns de nossos pacotes levam muito tempo para serem concluídos. Queremos usar a função Comparar esquema para detectar alterações na estrutura do banco de dados, a fim de salvá-las em nosso projeto SSDT para controle de versão do banco de dados.
Examinando um pouco mais isso, descobri que a função Comparação de Esquema no SSDT executa um script SQL que chama a OBJECTPROPERTY()
função do sistema nas tabelas no banco de dados. Especificamente no meu caso, qualquer chamada para OBJECTPROPERTY(<object_id>, N'IsEncrypted')
parece bloqueada, quando <object_id>
se refere a uma tabela que está sendo inserida em massa no momento.
No Visual Studio, o SSDT Schema Compare simplesmente excede o tempo limite e alega que nenhuma diferença foi detectada.
Existe uma solução alternativa para esse problema no SSDT ou devo tentar arquivar um relatório de bug do MS Connect?
Como alternativa, como o BULK INSERT ocorre a partir de um pacote SSIS, existe alguma maneira de fazer essa inserção sem bloquear as OBJECTPROPERTY
chamadas na tabela? Edit: Nos destinos SSIS OLE DB, podemos remover a marca de seleção de "Lock Table", que faz o que diz, mas isso pode prejudicar o desempenho em algumas situações. Estou muito mais interessado em uma solução que permita que o SSDT Schema Compare faça seu trabalho, mesmo que alguns objetos estejam bloqueados.
fonte
Respostas:
A
OBJECTPROPERTY
chamada requer um bloqueio de estabilidade do esquema (Sch-S), que é incompatível apenas com um bloqueio de modificação de esquema (Sch-M).O
BULK INSERT
bloqueio de Sch-M será necessário em algumas circunstâncias. Eles estão listados na seção "Bloqueio e registro de tabela durante a importação em massa" das Diretrizes para otimizar a importação em massa nos Manuais Online:Se a tabela de destino estiver em cluster, você poderá encontrar ajuda na ativação do sinalizador de rastreamento 610 . Leia toda a série dessas postagens e o Guia de desempenho para carregamento de dados e faça um teste completo se você decidir seguir esse caminho.
Não faço ideia por que o SSDT verifica a
IsEncrypted
propriedade em busca de tabelas. Não consigo imaginar um cenário em que isso faça sentido, mas essa é uma pergunta para o pessoal do SSDT.fonte