Я работаю над большим проектом ETL и DW, где мы используем TFS / контроль исходного кода вместе с SSIS и SSDT.
Сегодня я обнаружил, что хотя пакет служб SSIS выполняет BULK INSERT в таблице базы данных, невозможно выполнить сравнение схемы SSDT с этой базой данных. Это прискорбно, так как некоторые из наших пакетов занимают достаточно много времени. Мы хотим использовать функцию сравнения схем для обнаружения изменений в структуре базы данных, чтобы сохранить их в нашем проекте SSDT для контроля версий базы данных.
Посмотрев немного подробнее, я обнаружил, что функция сравнения схем в SSDT выполняет сценарий SQL, который вызывает OBJECTPROPERTY()
системную функцию для таблиц в базе данных. В частности, в моем случае любые вызовы, по- OBJECTPROPERTY(<object_id>, N'IsEncrypted')
видимому, блокируются, когда <object_id>
речь идет о таблице, которая в настоящее время массово вставляется.
В Visual Studio схема сравнения SSDT просто отключается через некоторое время и утверждает, что никаких различий не обнаружено.
Есть ли обходной путь к этой проблеме в SSDT, или я должен попытаться подать отчет об ошибке MS Connect?
В качестве альтернативы, поскольку BULK INSERT происходит из пакета OBJECTPROPERTY
служб SSIS, возможно, существует какой-либо способ сделать эту вставку без блокировки -calls на таблице? Редактировать: В пунктах назначения SSE OLE DB мы можем убрать галочку из «Таблицы блокировок», которая делает то, что говорит, но это может снизить производительность в некоторых ситуациях. Меня гораздо больше интересует решение, которое позволяет SSDT Schema Compare выполнять свою работу, даже если некоторые объекты заблокированы.
источник
Ответы:
Для
OBJECTPROPERTY
вызова требуется блокировка стабильности схемы (Sch-S), которая несовместима только с блокировкой модификации схемы (Sch-M).В
BULK INSERT
некоторых обстоятельствах будет взята блокировка Sch-M. Они перечислены в разделе «Блокировка таблиц и ведение журналов при массовом импорте» Руководства по оптимизации массового импорта в электронных книгах:Если таблица назначения кластеризована, вы можете найти включающий флаг трассировки 610 подсказок. Пожалуйста, прочитайте всю серию этих постов и Руководство по производительности загрузки данных и тщательно протестируйте, если вы решите пойти по этому пути.
Я понятия не имею, почему SSDT проверяет
IsEncrypted
свойство для таблиц. Я не могу представить сценарий, где это имеет смысл, но это вопрос для людей SSDT.источник