Копирование данных из Salesforce V1 с помощью Фабрика данных Azure или Azure Synapse Analytics
ОБЛАСТЬ ПРИМЕНЕНИЯ: Фабрика данных Azure
Azure Synapse Analytics
Совет
Попробуйте использовать фабрику данных в Microsoft Fabric, решение для аналитики с одним интерфейсом для предприятий. Microsoft Fabric охватывает все, от перемещения данных до обработки и анализа данных в режиме реального времени, бизнес-аналитики и отчетности. Узнайте, как бесплатно запустить новую пробную версию !
В этой статье описывается, как с помощью действия копирования в конвейерах Фабрики данных Azure и Azure Synapse копировать данные в Salesforce и обратно. Это продолжение статьи с обзором действия копирования, в которой представлены общие сведения о действии копирования.
Внимание
Соединитель Salesforce версии 2 обеспечивает улучшенную поддержку salesforce. Если вы используете соединитель Salesforce версии 1 в своем решении, рекомендуется обновить соединитель Salesforce в ближайшее время. Дополнительные сведения о различиях между версиями 2 и V1 см. в этом разделе .
Поддерживаемые возможности
Этот соединитель Salesforce поддерживается для следующих возможностей.
Поддерживаемые возможности | IR |
---|---|
Действие копирования (источник/приемник) | (1) (2) |
Действие поиска | (1) (2) |
① Среда выполнения интеграции Azure ② Локальная среда выполнения интеграции
Список хранилищ данных, которые поддерживаются в качестве источников или приемников, см. в таблице Поддерживаемые хранилища данных.
В частности, этот соединитель Salesforce поддерживает следующее.
- Выпуски Salesforce Developer, Professional, Enterprise и Unlimited.
- Копирование данных в рабочую среду, песочницу или личный домен Salesforce, а также из них.
Примечание.
Эта функция поддерживает копию любой схемы из указанных выше сред Salesforce, включая Nonprofit Success Pack (NPSP).
Соединитель Salesforce построен на основе API-интерфейса Salesforce REST/Bulk API. При копировании данных из Salesforce соединитель автоматически выбирает между REST и массовыми API на основе размера данных, если результирующий набор велик, массовый API используется для повышения производительности; Вы можете явно задать версию API, используемую для чтения и записи данных с помощью apiVersion
свойства в связанной службе. При копировании данных в Salesforce соединитель использует BULK API версии 1.
Примечание.
Соединитель больше не задает версию по умолчанию для API Salesforce. Для обеспечения обратной совместимости в том случае, если ранее была задана версия API по умолчанию, она продолжает работать. Значение по умолчанию — 45.0 для источника и 40.0 для приемника.
Необходимые компоненты
В Salesforce требуется включить разрешение API.
Ограничения запросов Salesforce
Для Salesforce установлены ограничения на общее число запросов API и одновременных запросов API. Обратите внимание на следующие аспекты:
- Если количество одновременных запросов превышает ограничение, выполняется регулирование и возникают случайные ошибки.
- В случае превышения ограничения на общее число запросов учетная запись Salesforce блокируется на 24 часа.
Кроме того, в обоих случаях вы можете получить сообщение об ошибке "REQUEST_LIMIT_EXCEEDED". Дополнительные сведения см. в разделе API request limits (Ограничения запросов API) руководства об ограничениях для разработчика Salesforce.
Начало работы
Чтобы выполнить действие копирования с конвейером, можно воспользоваться одним из приведенных ниже средств или пакетов SDK:
- средство копирования данных;
- Портал Azure
- Пакет SDK для .NET
- Пакет SDK для Python
- Azure PowerShell
- The REST API
- шаблон Azure Resource Manager.
Создание связанной службы для Salesforce с помощью пользовательского интерфейса
Выполните приведенные ниже действия, чтобы создать связанную службу для Salesforce с помощью пользовательского интерфейса на портале Azure.
Перейдите на вкладку "Управление" в рабочей области Фабрики данных Azure или Synapse и выберите "Связанные службы", после чего нажмите "Создать":
Выполните поиск по запросу "Salesforce" и выберите соединитель Salesforce.
Настройте сведения о службе, проверьте подключение и создайте связанную службу.
Сведения о конфигурации соединителя
Следующие разделы содержат сведения о свойствах, которые используются для определения сущностей, характерных для соединителя Salesforce.
Свойства связанной службы
Для связанной службы Salesforce поддерживаются следующие свойства.
Свойство | Описание: | Обязательное поле |
---|---|---|
type | Для свойства type нужно задать значение Salesforce. | Да |
environmentUrl | Укажите URL-адрес экземпляра Salesforce. Значение по умолчанию — "https://login.salesforce.com" . Чтобы скопировать данные из песочницы, укажите "https://test.salesforce.com" . Чтобы скопировать данные из пользовательского домена, укажите URL-адрес, например "https://[domain].my.salesforce.com" . |
No |
username | Укажите имя пользователя для учетной записи пользователя. | Да |
password | Укажите пароль для учетной записи пользователя. Пометьте это поле как SecureString, чтобы безопасно хранить его, или добавьте ссылку на секрет, хранящийся в Azure Key Vault. |
Да |
securityToken | Укажите маркер безопасности для учетной записи пользователя. Общие сведения о маркере безопасности см. в статье Security and the API (Безопасность и API). Маркер безопасности можно пропустить, только если добавить IP-адрес среды выполнения интеграции в список доверенных IP-адресов в Salesforce. При использовании Azure IR см. IP-адреса среды выполнения Azure. Инструкции по получению и сбросу маркера безопасности см. в Получение маркера безопасности. Пометьте это поле как SecureString, чтобы безопасно хранить его, или добавьте ссылку на секрет, хранящийся в Azure Key Vault. |
No |
версия_API | Укажите версию Salesforce REST/Bulk API для использования, например52.0 . |
No |
connectVia | Среда выполнения интеграции, используемая для подключения к хранилищу данных. Если не указано другое, по умолчанию используется интегрированная среда выполнения Azure. | No |
Пример хранения учетных данных
{
"name": "SalesforceLinkedService",
"properties": {
"type": "Salesforce",
"typeProperties": {
"username": "<username>",
"password": {
"type": "SecureString",
"value": "<password>"
},
"securityToken": {
"type": "SecureString",
"value": "<security token>"
}
},
"connectVia": {
"referenceName": "<name of Integration Runtime>",
"type": "IntegrationRuntimeReference"
}
}
}
Пример хранения учетных данных в хранилище ключей
{
"name": "SalesforceLinkedService",
"properties": {
"type": "Salesforce",
"typeProperties": {
"username": "<username>",
"password": {
"type": "AzureKeyVaultSecret",
"secretName": "<secret name of password in AKV>",
"store":{
"referenceName": "<Azure Key Vault linked service>",
"type": "LinkedServiceReference"
}
},
"securityToken": {
"type": "AzureKeyVaultSecret",
"secretName": "<secret name of security token in AKV>",
"store":{
"referenceName": "<Azure Key Vault linked service>",
"type": "LinkedServiceReference"
}
}
},
"connectVia": {
"referenceName": "<name of Integration Runtime>",
"type": "IntegrationRuntimeReference"
}
}
}
Пример. Хранение учетных данных в Key Vault, а также environmentUrl и имя пользователя
Обратите внимание, что при этом вы больше не сможете использовать пользовательский интерфейс для изменения параметров. Флажок "Указать динамическое содержимое в формате JSON" будет установлен, и вам придется полностью изменить эту конфигурацию вручную. Преимущество заключается в том, что вы можете наследить все параметры конфигурации из Key Vault, а не параметризовать все здесь.
{
"name": "SalesforceLinkedService",
"properties": {
"type": "Salesforce",
"typeProperties": {
"environmentUrl": {
"type": "AzureKeyVaultSecret",
"secretName": "<secret name of environment URL in AKV>",
"store": {
"referenceName": "<Azure Key Vault linked service>",
"type": "LinkedServiceReference"
},
},
"username": {
"type": "AzureKeyVaultSecret",
"secretName": "<secret name of username in AKV>",
"store": {
"referenceName": "<Azure Key Vault linked service>",
"type": "LinkedServiceReference"
},
},
"password": {
"type": "AzureKeyVaultSecret",
"secretName": "<secret name of password in AKV>",
"store":{
"referenceName": "<Azure Key Vault linked service>",
"type": "LinkedServiceReference"
}
},
"securityToken": {
"type": "AzureKeyVaultSecret",
"secretName": "<secret name of security token in AKV>",
"store":{
"referenceName": "<Azure Key Vault linked service>",
"type": "LinkedServiceReference"
}
}
},
"connectVia": {
"referenceName": "<name of Integration Runtime>",
"type": "IntegrationRuntimeReference"
}
}
}
Свойства набора данных
Полный список разделов и свойств, доступных для определения наборов данных, см. в статье о наборах данных. Этот раздел содержит список свойств, поддерживаемых набором данных Salesforce.
Чтобы скопировать данные в Salesforce, а также из Salesforce, для свойства type набора данных установите значение SalesforceObject. Поддерживаются следующие свойства.
Свойство | Описание: | Обязательное поле |
---|---|---|
type | Для свойства type нужно задать значение SalesforceObject. | Да |
objectApiName | Имя объекта Salesforce, из которого извлекаются данные. | "Нет" для источника, "Да" для приемника |
Внимание
Для любых настраиваемых объектов имя API должно содержать приставку "__c".
Пример:
{
"name": "SalesforceDataset",
"properties": {
"type": "SalesforceObject",
"typeProperties": {
"objectApiName": "MyTable__c"
},
"schema": [],
"linkedServiceName": {
"referenceName": "<Salesforce linked service name>",
"type": "LinkedServiceReference"
}
}
}
Примечание.
Для обеспечения обратной совместимости: если для копирования данных из Salesforce используется прежний тип набора данных (RelationalTable), он будет работать, пока не появится предложение переключиться на новый тип (SalesforceObject).
Свойство | Описание: | Обязательное поле |
---|---|---|
type | Свойство type для набора данных должно иметь значение RelationalTable. | Да |
tableName | Имя таблицы в Salesforce | Нет (если свойство query указано в источнике действия) |
Свойства действия копирования
Полный список разделов и свойств, используемых для определения действий, см. в статье Конвейеры и действия в фабрике данных Azure. Этот раздел содержит список свойств, поддерживаемых источником и приемником Salesforce.
Salesforce в качестве источника данных
Чтобы копировать данные из Salesforce, установите тип источника SalesforceSource в действии копирования. В разделе source действия копирования поддерживаются следующие свойства:
Свойство | Описание: | Обязательное поле |
---|---|---|
type | Свойство type источника действия копирования должно иметь значение SalesforceSource. | Да |
query | Используйте пользовательский запрос для чтения данных. Вы можете использовать запрос, написанный на объектно-ориентированном языке запросов Salesforce (SOQL), или запрос SQL-92. Дополнительные советы см. в разделе Советы по запросам. Если запрос не указан, будут извлечены все данные объекта Salesforce, заданного в наборе данных в свойстве objectApiName. | Нет (если в наборе данных задано свойство objectApiName) |
readBehavior | Указывает, следует ли запрашивать существующие записи или все записи, включая удаленные. Если значение не задано, по умолчанию используется первое значение. Допустимые значения: query (по умолчанию), queryAll. |
No |
Внимание
Для любых настраиваемых объектов имя API должно содержать приставку "__c".
Пример:
"activities":[
{
"name": "CopyFromSalesforce",
"type": "Copy",
"inputs": [
{
"referenceName": "<Salesforce input dataset name>",
"type": "DatasetReference"
}
],
"outputs": [
{
"referenceName": "<output dataset name>",
"type": "DatasetReference"
}
],
"typeProperties": {
"source": {
"type": "SalesforceSource",
"query": "SELECT Col_Currency__c, Col_Date__c, Col_Email__c FROM AllDataType__c"
},
"sink": {
"type": "<sink type>"
}
}
}
]
Примечание.
Для обеспечения обратной совместимости: если для копирования данных из Salesforce используется прежний тип источника (RelationalSource), он будет работать, пока не появится предложение переключиться на новый тип (SalesforceSource).
Примечание.
Источник Salesforce не поддерживает параметры прокси-сервера в локальной среде выполнения интеграции, а приемник поддерживает.
Salesforce в качестве типа приемника
Чтобы скопировать данные в Salesforce, установите тип приемника SalesforceSink в действии копирования. В разделе sink действия Copy поддерживаются следующие свойства.
Свойство | Описание: | Обязательное поле |
---|---|---|
type | Свойство type приемника действия копирования должно иметь значение SalesforceSink. | Да |
writeBehavior | Поведение операции при записи. Допустимые значения: Insert (Вставка) и Upsert (Вставка-обновление). |
Нет (по умолчанию используется Insert) |
externalIdFieldName | Имя поля для внешнего идентификатора при операции upsert. Это поле должно быть определено в объекте Salesforce как External Id Field (Поле внешнего идентификатора). Оно не может иметь значения NULL в соответствующих входных данных. | "Да" для операции Upsert (Вставка-обновление) |
writeBatchSize | Количество строк данных, записываемых в Salesforce одним пакетом. | Нет (значение по умолчанию — 5,000) |
ignoreNullValues | Указывает, следует ли игнорировать значения NULL из входных данных во время операции записи. Допустимые значения: true и false. - True: при выполнении операции upsert или обновления (update) оставьте данные в целевом объекте без изменений. При выполнении операции вставки (insert) вставьте определенное значение по умолчанию. - False: при выполнении операции upsert или обновления (update) обновите данные в целевом объекте до значения NULL. При выполнении операции вставки (insert) вставьте значение NULL. |
Нет (по умолчанию используется значение false) |
maxConcurrentConnections | Верхний предел одновременных подключений, установленных для хранилища данных при выполнении действия. Указывайте значение только при необходимости ограничить количество одновременных подключений. | Без |
Пример: приемник Salesforce в действии копирования
"activities":[
{
"name": "CopyToSalesforce",
"type": "Copy",
"inputs": [
{
"referenceName": "<input dataset name>",
"type": "DatasetReference"
}
],
"outputs": [
{
"referenceName": "<Salesforce output dataset name>",
"type": "DatasetReference"
}
],
"typeProperties": {
"source": {
"type": "<source type>"
},
"sink": {
"type": "SalesforceSink",
"writeBehavior": "Upsert",
"externalIdFieldName": "CustomerId__c",
"writeBatchSize": 10000,
"ignoreNullValues": true
}
}
}
]
Советы по запросам
Получение данных из отчета Salesforce
Вы можете извлекать данные из отчетов Salesforce, указывая запросы в формате {call "<report name>"}
. Например, "query": "{call \"TestReport\"}"
.
Получение удаленных записей из корзины Salesforce
Чтобы запросить обратимо удаленные записи из корзины Salesforce, укажите readBehavior
как queryAll
.
Различия между синтаксисом запросов SOQL и SQL
При копировании данных из Salesforce можно использовать SOQL или SQL-запрос. Обратите внимание, что эти два имеют разные синтаксис и функциональность, не смешивайте их. Рекомендуется использовать SOQL-запрос, который поддерживается корпорацией Salesforce. Главные различия показаны в следующей таблице.
Синтаксис | Режим SOQL | Режим SQL |
---|---|---|
Выбор столбцов | Необходимо переименовать поля, копируемые в запросе, например SELECT field1, filed2 FROM objectname |
SELECT * поддерживается в дополнении к выделенному фрагменту столбца. |
Кавычки | Имена полей или объектов не заключаются в кавычки. | Имена полей или объектов заключаются в кавычки, например SELECT "id" FROM "Account" |
Формат «Дата и время» | Подробнее см. здесь, а примеры — в следующем разделе. | Подробнее см. здесь, а примеры — в следующем разделе. |
Логические значения | Представленные в виде False и True , например SELECT … WHERE IsDeleted=True . |
Представленные в значении 0 или 1, например SELECT … WHERE IsDeleted=1 . |
Переименование столбцов | Не поддерживается. | Поддерживается, например, SELECT a AS b FROM … . |
Отношение | Поддерживается, например, Account_vod__r.nvs_Country__c . |
Не поддерживается. |
Извлечение данных с использованием предложения where для столбца даты и времени
При указании запроса SOQL или SQL обратите внимание на различие в формате даты и времени. Например:
-
Пример SOQL:
SELECT Id, Name, BillingCity FROM Account WHERE LastModifiedDate >= @{formatDateTime(pipeline().parameters.StartTime,'yyyy-MM-ddTHH:mm:ssZ')} AND LastModifiedDate < @{formatDateTime(pipeline().parameters.EndTime,'yyyy-MM-ddTHH:mm:ssZ')}
-
Пример SQL:
SELECT * FROM Account WHERE LastModifiedDate >= {ts'@{formatDateTime(pipeline().parameters.StartTime,'yyyy-MM-dd HH:mm:ss')}'} AND LastModifiedDate < {ts'@{formatDateTime(pipeline().parameters.EndTime,'yyyy-MM-dd HH:mm:ss')}'}
Ошибка MALFORMED_QUERY: усечено
Если вы столкнулись с ошибкой "MALFORMED_QUERY: truncated", обычно это связано с тем, что в данных имеется столбец типа JunctionIdList, а Salesforce имеет ограничение на поддержку таких данных с большим количеством строк. Чтобы устранить эту проблему, попробуйте исключить столбец JunctionIdList или ограничить число копируемых строк (можно разделить на несколько запусков действия копирования).
Сопоставление типов данных для Salesforce
При копировании данных из Salesforce для промежуточных типов данных службы используются следующие сопоставления из типов данных Salesforce. Дополнительные сведения о том, как действие копирования сопоставляет исходную схему и типы данных для приемника, см. в статье Сопоставление схем в действии копирования.
Тип данных Salesforce | Промежуточный тип данных службы |
---|---|
Автонумерация | Строка |
Флажок | Логический |
Валюта | Десятичное число |
Дата | Дата/время |
Дата и время | Дата/время |
Электронное письмо | Строка |
Идентификатор | Строка |
Связь для подстановки | Строка |
Список множественного выбора | Строка |
Число | Десятичн. |
Процент | Десятичное число |
Номер телефона | Строка |
Picklist | Строка |
Текст | Строка |
Область текста | Строка |
Текстовое поле (длинное) | Строка |
Текстовое поле (расширенное) | Строка |
Текст (зашифрованный) | Строка |
URL | Строка |
Примечание.
Числовой тип Salesforce сопоставляется с десятичным типом в конвейерах Фабрики данных Azure и Azure Synapse в качестве промежуточного типа данных службы. Десятичный тип учитывает определенную точность и масштаб. Для данных, десятичные разряды которых превышают определенный масштаб, значение будет округлено при предварительном просмотре и копировании данных. Чтобы избежать такой потери точности в конвейерах Фабрики данных Azure и Azure Synapse, рекомендуется увеличить десятичные разряды до достаточно большого значения на странице Custom Field Definition Edit (Изменения определения настраиваемого поля) в Salesforce.
Свойства действия поиска
Подробные сведения об этих свойствах см. в разделе Действие поиска.
Следующие шаги
Список хранилищ данных, поддерживаемых в рамках функции копирования в качестве источников и приемников, см. в разделе Поддерживаемые хранилища данных.