Estou trabalhando em um grande projeto de ETL e DW onde usamos TFS/source control junto com SSIS e 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 um SSDT Schema Compare com esse banco de dados. Isso é lamentável, pois alguns de nossos pacotes levam muito tempo para serem concluídos. Queremos usar a função Schema Compare para detectar alterações na estrutura do banco de dados para salvá-las em nosso projeto SSDT para controle de versão do banco de dados.
Analisando um pouco mais sobre isso, descobri que a função Schema Compare no SSDT executa um script SQL que chama a OBJECTPROPERTY()
função do sistema nas tabelas do banco de dados. Especificamente no meu caso, qualquer chamada para OBJECTPROPERTY(<object_id>, N'IsEncrypted')
parece estar bloqueada, quando <object_id>
se refere a uma tabela que está sendo inserida em massa.
No Visual Studio, o SSDT Schema Compare simplesmente expira depois de um tempo e afirma 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, talvez haja alguma maneira de fazer essa inserção sem bloquear OBJECTPROPERTY
as chamadas na tabela? Edit: Em SSIS OLE DB Destinations, 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.
A
OBJECTPROPERTY
chamada requer um bloqueio de estabilidade de esquema (Sch-S), que só é incompatível com um bloqueio de modificação de esquema (Sch-M).O
BULK INSERT
terá um bloqueio Sch-M em algumas circunstâncias. Eles estão listados na seção "Tabela de bloqueio e registro durante a importação em massa" das Diretrizes para otimizar a importação em massa nos manuais on-line:Se a tabela de destino estiver agrupada, você pode achar útil habilitar o sinalizador de rastreamento 610 . Leia toda a série dessas postagens e o Guia de desempenho de carregamento de dados e teste minuciosamente se decidir seguir esse caminho.
Não tenho ideia de 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.