Menyalin data dari dan ke Salesforce V1 menggunakan Azure Data Factory atau Azure Synapse Analytics
BERLAKU UNTUK: Azure Data Factory
Azure Synapse Analytics
Tip
Cobalah Data Factory di Microsoft Fabric, solusi analitik all-in-one untuk perusahaan. Microsoft Fabric mencakup semuanya mulai dari pergerakan data hingga ilmu data, analitik real time, kecerdasan bisnis, dan pelaporan. Pelajari cara memulai uji coba baru secara gratis!
Artikel ini menguraikan cara menggunakan Aktivitas Salin di Azure Data Factory dan alur Azure Synapse untuk menyalin data dari dan ke Salesforce. Artikel tersebut dibuat berdasarkan artikel Gambaran umum Salin Aktivitas yang menyajikan gambaran umum aktivitas salin.
Penting
Konektor Salesforce V2 menyediakan dukungan Salesforce asli yang ditingkatkan. Jika Anda menggunakan konektor Salesforce V1 dalam solusi Anda, Anda disarankan untuk meningkatkan konektor Salesforce Anda dengan mudah. Lihat bagian ini untuk detail tentang perbedaan antara V2 dan V1.
Kemampuan yang didukung
Konektor Salesforce ini didukung untuk kemampuan berikut:
Kemampuan yang didukung | IR |
---|---|
Salin aktivitas (sumber/sink) | (1) (2) |
Aktivitas pencarian | (1) (2) |
① Runtime integrasi Azure ② Runtime integrasi yang dihost sendiri
Untuk daftar penyimpanan data yang didukung sebagai sumber dan sink, lihat tabel penyimpanan data yang didukung.
Secara khusus, konektor Salesforce ini mendukung:
- Pengembang Salesforce, Profesional, Enterprise, atau edisi Unlimited.
- Menyalin data dari dan ke produksi Salesforce, kotak pasir, dan domain kustom.
Catatan
Fungsi ini mendukung salinan skema apa pun dari lingkungan Salesforce yang disebutkan di atas, termasuk Nonprofit Success Pack (NPSP).
Konektor Salesforce dibangun di atas Salesforce REST/Bulk API. Saat menyalin data dari Salesforce, konektor secara otomatis memilih antara REST dan API Massal berdasarkan ukuran data - ketika kumpulan hasil besar, API Massal digunakan untuk performa yang lebih baik; Anda dapat secara eksplisit mengatur versi API yang digunakan untuk membaca/menulis data melalui apiVersion
properti di layanan tertaut. Saat menyalin data ke Salesforce, konektor menggunakan BULK API v1.
Catatan
Konektor tidak lagi menyetel versi default untuk API Salesforce. Untuk kompatibilitas mundur, jika versi API default telah disetel sebelumnya, versi tersebut tetap berfungsi. Nilai default adalah 45,0 untuk sumber, dan 40,0 untuk sink.
Prasyarat
Izin API harus diaktifkan di Salesforce.
Batas permintaan Salesforce
Salesforce memiliki batasan untuk permintaan API total dan permintaan API bersamaan. Perhatikan poin berikut:
- Jika jumlah permintaan bersama melebihi batas, pembatasan terjadi dan Anda melihat kegagalan acak.
- Jika jumlah total permintaan melebihi batas, akun Salesforce diblokir selama 24 jam.
Anda mungkin juga menerima pesan kesalahan "REQUEST_LIMIT_EXCEEDED" di kedua skenario. Untuk informasi selengkapnya, lihat bagian “API request limits” di Salesforce developer limits.
Memulai
Untuk melakukan aktivitas Salin dengan alur, Anda dapat menggunakan salah satu alat atau SDK berikut:
- Alat Penyalinan Data
- Portal Microsoft Azure
- SDK .NET
- SDK Python
- Azure PowerShell
- REST API
- Templat Azure Resource Manager
Membuat layanan tertaut ke Salesforce menggunakan antarmuka pengguna
Gunakan langkah-langkah berikut untuk membuat layanan tertaut ke Salesforce di antarmuka pengguna portal Microsoft Azure.
Telusuri ke tab Kelola di ruang kerja Azure Data Factory atau Synapse Anda dan pilih Layanan Tertaut, lalu klik Baru:
Cari Salesforce dan pilih konektor Salesforce.
Konfigurasikan detail layanan, uji koneksi, dan buat layanan tertaut baru.
Detail konfigurasi konektor
Bagian berikut memberikan detail tentang properti yang digunakan untuk menentukan entitas khusus untuk konektor Salesforce.
Properti layanan tertaut
Properti berikut ini didukung untuk layanan tertaut Salesforce.
Properti | Deskripsi | Wajib |
---|---|---|
jenis | Properti jenis harus disetel ke Salesforce. | Ya |
environmentUrl | Tentukan URL instans Salesforce. - Defaultnya adalah "https://login.salesforce.com" . - Untuk menyalin data dari kotak pasir, tentukan "https://test.salesforce.com" . - Untuk menyalin data dari domain kustom, tentukan, misalnya, "https://[domain].my.salesforce.com" . |
No |
Nama pengguna | Tentukan nama pengguna untuk akun pengguna. | Ya |
kata sandi | Tentukan kata sandi untuk akun pengguna. Tandai bidang ini sebagai SecureString untuk menyimpannya dengan aman, atau mereferensikan rahasia yang disimpan di Azure Key Vault. |
Ya |
keamananToken | Tentukan token keamanan untuk akun pengguna. Untuk mempelajari tentang token keamanan secara umum, lihat Keamanan dan API. Token hanya dapat dilewati jika Anda menambahkan IP Integration Runtime ke daftar alamat IP tepercaya di Salesforce. Saat menggunakan Azure runtime integrasi, lihat Alamat IP Azure Integration Runtime. Untuk petunjuk tentang cara mendapatkan dan mengatur ulang token, lihat Mendapatkan token. Tandai bidang ini sebagai SecureString untuk menyimpannya dengan aman, atau mereferensikan rahasia yang disimpan di Azure Key Vault. |
No |
apiVersion | Tentukan versi Salesforce REST/Bulk API yang akan digunakan, misalnya 52.0 . |
No |
connectVia | Runtime integrasi yang akan digunakan untuk menyambungkan ke penyimpanan data. Jika tidak ditentukan, Azure Integration Runtime default akan digunakan. | No |
Contoh: Info masuk Microsoft Store
{
"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"
}
}
}
Menyimpan info masuk di Key Vault
{
"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"
}
}
}
Contoh: Menyimpan kredensial di Key Vault, serta environmentUrl dan nama pengguna
Perhatikan bahwa dengan melakukannya, Anda tidak akan lagi dapat menggunakan UI untuk mengedit pengaturan. Kotak centang Tentukan konten dinamis dalam format JSON akan dicentang, dan Anda harus mengedit konfigurasi ini sepenuhnya dengan tangan. Keuntungannya adalah Anda dapat memperoleh semua pengaturan konfigurasi dari Key Vault alih-alih membuat parameter apa pun di sini.
{
"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"
}
}
}
Properti himpunan data
Untuk daftar lengkap bagian dan properti yang tersedia untuk menentukan himpunan data, lihat artikel Himpunan Data. Bagian ini menyediakan daftar properti yang didukung oleh himpunan data Salesforce.
Untuk menyalin data dari dan ke Salesforce, setel properti jenis himpunan data ke SalesforceObject. Properti berikut ini didukung.
Properti | Deskripsi | Wajib |
---|---|---|
jenis | Properti jenis harus disetel ke Salesforce. | Ya |
objectApiName | Nama objek Salesforce untuk diambil datanya. | Tidak untuk sumber, Ya untuk sink |
Penting
Bagian "__c" dari Nama API diperlukan untuk objek kustom apa pun.
Contoh:
{
"name": "SalesforceDataset",
"properties": {
"type": "SalesforceObject",
"typeProperties": {
"objectApiName": "MyTable__c"
},
"schema": [],
"linkedServiceName": {
"referenceName": "<Salesforce linked service name>",
"type": "LinkedServiceReference"
}
}
}
Catatan
Untuk kompatibilitas mundur: Saat Anda menyalin data dari Salesforce, jika Anda menggunakan himpunan data jenis "RelasionalTable" sebelumnya, data akan terus berfungsi saat Anda melihat saran untuk beralih ke jenis "SalesforceObject" baru.
Properti | Deskripsi | Wajib |
---|---|---|
jenis | Properti jenis himpunan data harus disetel ke RelationalTable. | Ya |
tableName | Nama tabel di Salesforce. | Tidak (jika "kueri" dalam sumber aktivitas ditentukan) |
Properti aktivitas salin
Untuk daftar lengkap bagian dan properti yang tersedia untuk menentukan aktivitas, lihat artikel Alur. Bagian ini menyediakan daftar properti yang didukung oleh sumber dan sink Salesforce.
Salesforce sebagai jenis sumber
Untuk menyalin data dari Salesforce, atur jenis sumber dalam aktivitas penyalinan ke SalesforceSource. Properti berikut ini didukung di bagian sumber aktivitas salin.
Properti | Deskripsi | Wajib |
---|---|---|
jenis | Properti jenis sumber aktivitas penyalinan harus diatur ke SalesforceSource. | Ya |
pertanyaan | Gunakan kueri kustom untuk membaca data. Anda bisa menggunakan kueri Salesforce Object Query Language (SOQL) atau kueri SQL-92. Lihat tips lainnya di bagian tips kueri. Jika kueri tidak ditentukan, semua data objek Salesforce yang ditentukan dalam "objectApiName" dalam himpunan data akan diambil. | Tidak (jika "objectApiName" dalam himpunan data ditentukan) |
readBehavior | Menunjukkan apakah akan mengkueri rekaman yang sudah ada, atau mengkueri semua rekaman termasuk yang dihapus. Jika tidak ditentukan, perilaku default adalah yang pertama. Nilai yang diperbolehkan: kueri (default), semuaKueri. |
No |
Penting
Bagian "__c" dari Nama API diperlukan untuk objek kustom apa pun.
Contoh:
"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>"
}
}
}
]
Catatan
Untuk kompatibilitas mundur: Saat Anda menyalin data dari Salesforce, jika Anda menggunakan himpunan data jenis "RelasionalTable" sebelumnya, data akan terus berfungsi saat Anda melihat saran untuk beralih ke jenis "SalesforceObject" baru.
Catatan
Sumber Salesforce tidak mendukung pengaturan proksi dalam runtime integrasi yang dihost sendiri, tetapi sink mendukungnya.
Salesforce sebagai jenis sink
Untuk menyalin data ke Salesforce, atur jenis sink dalam aktivitas penyalinan ke SalesforceSink. Properti berikut ini didukung di bagian sink aktivitas salin.
Properti | Deskripsi | Wajib |
---|---|---|
jenis | Properti jenis sink aktivitas salin harus disetel ke SalesforceSink. | Ya |
writeBehavior | Perilaku penulisan untuk operasi. Nilai yang diperbolehkan Sisipkan dan Upsert. |
Tidak (defaultnya adalah sisipkan) |
NamaBidangEksternal | Nama bidang ID eksternal untuk operasi upsert. Bidang yang ditentukan harus didefinisikan sebagai "External ID Field" di objek Salesforce. Ini tidak dapat memiliki nilai NULL dalam data input yang sesuai. | Ya untuk "Upsert" |
writeBatchSize | Jumlah baris data yang ditulis ke Salesforce di setiap batch. | Tidak (defaultnya adalah 5.000) |
ignoreNullValues | Menunjukkan apakah akan mengabaikan nilai NULL dari data input selama operasi tulis. Nilai yang diperbolehkan adalah true dan false. - Benar: Biarkan data di objek tujuan tanpa perubahan saat Anda melakukan operasi upsert atau pembaruan. Sisipkan nilai default yang ditentukan saat Anda melakukan operasi sisipan. - Salah: Perbarui data di objek tujuan ke nilai NULL saat Anda melakukan operasi upsert atau pembaruan. Sisipkan nilai NULL saat Anda melakukan operasi sisipan. |
Tidak (default adalah salah) |
maxConcurrentConnections | Batas atas koneksi bersamaan yang ditetapkan ke penyimpanan data selama eksekusi aktivitas. Menentukan nilai hanya saat Anda ingin membatasi koneksi bersamaan. | Tanpa |
Contoh: Sink Salesforce dalam aktivitas salin
"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
}
}
}
]
Tips kueri
Mengambil data dari laporan Salesforce
Anda dapat mengambil data dari laporan Salesforce dengan menentukan kueri sebagai {call "<report name>"}
. Contohnya "query": "{call \"TestReport\"}"
.
Mengambil rekaman yang dihapus dari Keranjang Sampah Salesforce
Untuk mengkueri rekaman yang dihapus sementara dari Keranjang Sampah Salesforce, Anda bisa menentukan readBehavior
sebagai queryAll
.
Perbedaan antara SOQL dan SQL sintaks kueri
Saat menyalin data dari Salesforce, Anda dapat menggunakan kueri SOQL atau kueri SQL. Perhatikan bahwa keduanya memiliki dukungan sintaks dan fungsionalitas yang berbeda, jangan mencampurnya. Anda disarankan untuk menggunakan kueri SOQL, yang secara asli didukung oleh Salesforce. Tabel berikut ini mencantumkan perbedaan utama:
Sintaks | Mode SOQL | Mode SQL |
---|---|---|
Pilihan kolom | Perlu menghitung bidang yang akan disalin dalam kueri, misalnya SELECT field1, filed2 FROM objectname |
SELECT * didukung selain pilihan kolom. |
Tanda kutip | Nama berkas/objek tak bisa dikutip. | Nama bidang/objek dapat dikutip, misalnya SELECT "id" FROM "Account" |
Format tanggalwaktu | Lihat detail di sini dan sampel di bagian berikutnya. | Lihat detail di sini dan sampel di bagian berikutnya. |
Nilai Boolean | Diwakili sebagai False dan True , misalnya SELECT … WHERE IsDeleted=True . |
Diwakili sebagai 0 atau 1, misalnya SELECT … WHERE IsDeleted=1 . |
Penggantian nama kolom | Tidak didukung. | Didukung, misalnya: SELECT a AS b FROM … . |
Hubungan | Didukung, misalnya Account_vod__r.nvs_Country__c . |
Tidak didukung. |
Mengambil data dengan menggunakan klausul di kolom TanggalWaktu
Saat Anda menentukan kueri SOQL atau SQL, perhatikan perbedaan format TanggalWaktu. Contohnya:
-
Sampel 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')}
-
Sampel 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')}'}
Kesalahan MALFORMED_QUERY: Truncated
Jika Anda menekan kesalahan "MALFORMED_QUERY: Truncated", biasanya karena Anda memiliki kolom jenis JunctionIdList dalam data dan Salesforce memiliki batasan untuk mendukung data tersebut dengan jumlah baris yang besar. Untuk mengurangi, coba kecualikan kolom JunctionIdList atau batasi jumlah baris yang akan disalin (Anda dapat mempartisi ke beberapa aktivitas salin yang dijalankan).
Pemetaan jenis data untuk Salesforce
Saat Anda menyalin data dari Salesforce, pemetaan berikut digunakan dari jenis data Salesforce ke jenis data sementara dalam layanan secara internal. Untuk mempelajari bagaimana aktivitas salin memetakan skema sumber dan jenis data ke sink, lihat Pemetaan skema dan jenis data.
Jenis data Salesforce | Jenis data sementara layanan |
---|---|
Nomor Otomatis | String |
Kotak centang | Boolean |
Mata Uang | Decimal |
Date | DateTime |
Tanggal/Waktu | DateTime |
String | |
ID | String |
Hubungan Pencarian | String |
Multi-Select Picklist | String |
Number | Decimal |
Persen | Decimal |
Nomor | String |
Daftar pilihan | String |
SMS | String |
Bidang Teks | String |
Area Teks (Panjang) | String |
Area Teks (Kaya) | String |
Teks (Terenkripsi) | String |
URL | String |
Catatan
Jenis Nomor Salesforce adalah pemetaan ke Jenis desimal dalam alur Azure Data Factory dan Azure Synapse sebagai jenis data sementara layanan. Jenis desimal menggunakan presisi dan skala yang ditentukan. Untuk data yang tempat desimalnya melebihi skala yang ditentukan, nilainya akan dibulatkan dalam data pratinjau dan salinan. Untuk menghindari kehilangan presisi tersebut dalam alur Azure Data Factory dan Azure Synapse, pertimbangkan untuk meningkatkan tempat desimal ke nilai yang cukup besar di halaman Edit Definisi Bidang Kustom Salesforce.
Properti aktivitas pencarian
Untuk mempelajari detail tentang properti, lihat Aktivitas pencarian.
Langkah berikutnya
Untuk daftar penyimpanan data yang didukung sebagai sumber dan sink oleh aktivitas salin, lihat Penyimpanan data yang didukung.