Tutorial: Membuat alur dengan Aktivitas Salin menggunakan .NET API
Catatan
Artikel ini berlaku untuk versi 1 dari Azure Data Factory. Jika Anda menggunakan versi saat ini dari layanan Azure Data Factory, lihat tutorial aktivitas salin.
Dalam artikel ini, Anda mempelajari cara menggunakan .NET API untuk membuat pabrik data dengan alur yang menyalin data dari penyimpanan blob Azure ke Azure SQL Database. Jika Anda baru menggunakan Azure Data Factory, baca artikel Pengenalan Azure Data Factory sebelum melakukan tutorial ini.
Dalam tutorial ini, Anda membuat alur dengan satu aktivitas di dalamnya: Aktivitas Salin. Aktivitas salin menyalin data dari penyimpanan data yang didukung ke penyimpanan data sink yang didukung. Untuk daftar penyimpanan data yang didukung sebagai sumber dan sink, lihat penyimpanan data yang didukung. Aktivitas ini didukung oleh layanan yang tersedia secara global yang dapat menyalin data antara berbagai penyimpanan data dengan cara yang aman, andal, dan dapat diskalakan. Untuk informasi selengkapnya tentang Aktivitas Salin, lihat Aktivitas Pergerakan Data.
Sebuah alur dapat memiliki lebih dari satu aktivitas. Selain itu, Anda dapat merangkai dua aktivitas (menjalankan satu demi satu aktivitas) dengan mengatur himpunan data output dari satu aktivitas sebagai himpunan data input aktivitas lainnya. Untuk informasi selengkapnya, lihat beberapa aktivitas dalam alur.
Catatan
Untuk dokumentasi lengkap tentang .NET API for Data Factory, lihat Referensi Data Factory .NET API .
Alur data dalam tutorial ini menyalin data dari penyimpanan data sumber ke penyimpanan data tujuan. Untuk tutorial tentang cara mengubah data menggunakan Azure Data Factory, lihat Tutorial: Membangun alur untuk mengubah data menggunakan kluster Hadoop.
Prasyarat
Catatan
Artikel ini menggunakan modul Azure Az PowerShell, yang merupakan modul PowerShell yang direkomendasikan untuk berinteraksi dengan Azure. Untuk mulai menggunakan modul Az PowerShell, lihat Menginstal Azure PowerShell. Untuk mempelajari cara bermigrasi ke modul Az PowerShell, lihat Memigrasikan Azure PowerShell dari AzureRM ke Az.
- Pergi melalui Tutorial Gambaran Umum dan Prasyarat untuk mendapatkan gambaran umum tutorial dan menyelesaikan langkah-langkah prasyarat.
- Visual Studio 2012 atau 2013 atau 2015
- Unduh dan instal Azure .NET SDK
- Azure PowerShell. Ikuti instruksi dalam artikel Cara menginstal dan mengkonfigurasi Azure PowerShell untuk menginstal versi terbaru Azure PowerShell di komputer Anda. Anda menggunakan Azure PowerShell untuk membuat aplikasi Azure Active Directory.
Membuat aplikasi di Azure Active Directory
Buat aplikasi Azure Active Directory, buat perwakilan layanan untuk aplikasi, dan tetapkan ke peran Kontributor Data Factory.
Luncurkan PowerShell.
Jalankan perintah berikut dan masukkan nama pengguna serta kata sandi yang Anda gunakan untuk masuk ke portal Microsoft Azure.
Connect-AzAccountJalankan perintah berikut untuk menampilkan semua langganan untuk akun ini.
Get-AzSubscriptionJalankan perintah berikut untuk memilih langganan yang ingin Anda kerjakan. Ganti <NameOfAzureSubscription> dengan nama langganan Azure Anda.
Get-AzSubscription -SubscriptionName <NameOfAzureSubscription> | Set-AzContextPenting
Catat SubscriptionId dan TenantId dari output perintah ini.
Buat grup sumber daya Azure bernama ADFTutorialResourceGroup dengan menjalankan perintah berikut ini di PowerShell.
New-AzResourceGroup -Name ADFTutorialResourceGroup -Location "West US"Jika grup sumber daya sudah ada, Anda menentukan apakah akan memperbaruinya (Y) atau menyimpannya sebagai (N).
Jika Anda menggunakan grup sumber daya yang berbeda, Anda perlu menggunakan nama grup sumber daya Anda sebagai pengganti ADFTutorialResourceGroup dalam tutorial ini.
Buat aplikasi Azure Active Directory.
$azureAdApplication = New-AzADApplication -DisplayName "ADFCopyTutotiralApp" -HomePage "https://www.contoso.org" -IdentifierUris "https://www.adfcopytutorialapp.org/example" -Password "Pass@word1"Jika Anda mendapatkan kesalahan berikut, tentukan URL lain dan jalankan perintah lagi.
Another object with the same value for property identifierUris already exists.Buat perwakilan layanan AD.
New-AzADServicePrincipal -ApplicationId $azureAdApplication.ApplicationIdTambahkan perwakilan layanan ke peran Kontributor Data Factory.
New-AzRoleAssignment -RoleDefinitionName "Data Factory Contributor" -ServicePrincipalName $azureAdApplication.ApplicationId.GuidDapatkan ID aplikasi.
$azureAdApplicationCatat ID aplikasi (applicationID) dari output.
Anda harus memiliki empat nilai berikut dari langkah-langkah ini:
- ID Penyewa
- ID Langganan
- ID aplikasi
- Kata sandi (ditentukan dalam perintah pertama)
Walkthrough
Menggunakan Visual Studio 2012/2013/2015, buat aplikasi konsol C# .NET.
- Luncurkan Visual Studio 2012/2013/2015.
- Klik File, arahkan ke Baru, dan klik Proyek.
- Perluas Templat, dan pilih Visual C# . Dalam panduan ini, Anda menggunakan C#, tetapi Anda dapat menggunakan bahasa .NET.
- Pilih Aplikasi Konsol dari daftar jenis proyek di sebelah kanan.
- Masukkan DataFactoryAPITestApp untuk Nama.
- Pilih C:\ADFGetStarted untuk Lokasi.
- Pilih OK untuk membuat proyek.
Klik Alat, arahkan keManajer Paket NuGet, , dan klik Konsol Manajer Paket.
Di Konsol Manajer Paket, masukkan perintah berikut:
- Jalankan perintah berikut untuk menginstal paket Data Factory:
Install-Package Microsoft.Azure.Management.DataFactories - Jalankan perintah berikut untuk menginstal paket Azure Active Directory (Anda menggunakan Active Directory API dalam kode):
Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory -Version 2.19.208020213
- Jalankan perintah berikut untuk menginstal paket Data Factory:
Tambahkan bagian appSetttings berikut ke fileApp.config. Pengaturan ini digunakan oleh metode pembantu: GetAuthorizationHeader.
Ganti nilai untuk <ID Aplikasi,> , <Kata Sandi> , <Langganan ID> , dan <ID penyewa> dengan nilai Anda sendiri.
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="ActiveDirectoryEndpoint" value="https://login.microsoftonline.com/" /> <add key="ResourceManagerEndpoint" value="https://management.azure.com/" /> <add key="WindowsManagementUri" value="https://management.core.windows.net/" /> <add key="ApplicationId" value="your application ID" /> <add key="Password" value="Password you used while creating the AAD application" /> <add key="SubscriptionId" value= "Subscription ID" /> <add key="ActiveDirectoryTenantId" value="Tenant ID" /> </appSettings> </configuration>Tambahkan pernyataan penggunaan berikut ke file sumber (Program.cs) dalam proyek.
using System.Configuration; using System.Collections.ObjectModel; using System.Threading; using System.Threading.Tasks; using Microsoft.Azure; using Microsoft.Azure.Management.DataFactories; using Microsoft.Azure.Management.DataFactories.Models; using Microsoft.Azure.Management.DataFactories.Common.Models; using Microsoft.IdentityModel.Clients.ActiveDirectory;Tambahkan kode berikut yang membuat instans kelas DataPipelineManagementClient ke metode Utama. Anda menggunakan objek ini untuk membuat pabrik data, kumpulan data layanan, input, dan output yang ditautkan, dan pipeline. Anda juga menggunakan objek ini untuk memantau irisan kumpulan data pada runtime.
// create data factory management client string resourceGroupName = "ADFTutorialResourceGroup"; string dataFactoryName = "APITutorialFactory"; TokenCloudCredentials aadTokenCredentials = new TokenCloudCredentials( ConfigurationManager.AppSettings["SubscriptionId"], GetAuthorizationHeader().Result); Uri resourceManagerUri = new Uri(ConfigurationManager.AppSettings["ResourceManagerEndpoint"]); DataFactoryManagementClient client = new DataFactoryManagementClient(aadTokenCredentials, resourceManagerUri);Penting
Ganti nilai resourceGroupName dengan nama grup sumber daya Azure Anda.
Perbarui nama pabrik data (dataFactoryName) menjadi unik. Nama pabrik data harus unik secara global. Lihat topik Data Factory - Aturan Penamaan untuk penamaan aturan untuk artefak Data Factory.
Tambahkan kode berikut yang membuat pabrik data ke metode Utama.
// create a data factory Console.WriteLine("Creating a data factory"); client.DataFactories.CreateOrUpdate(resourceGroupName, new DataFactoryCreateOrUpdateParameters() { DataFactory = new DataFactory() { Name = dataFactoryName, Location = "westus", Properties = new DataFactoryProperties() } } );Pabrik data dapat memiliki satu atau beberapa alur. Alur dapat memiliki satu atau beberapa aktivitas di dalamnya. Misalnya, Aktivitas Salin untuk menyalin data dari sumber ke penyimpanan data tujuan dan aktivitas HDInsight Apache Hive untuk menjalankan skrip Apache Hive untuk mengubah data input ke data output produk. Mari kita mulai dengan membuat pabrik data dalam langkah ini.
Tambahkan kode berikut yang membuat layanan tertaut Azure Storage ke metode Utama.
Penting
Ganti storageaccountname dan accountkey dengan nama dan kunci akun Azure Storage Anda.
// create a linked service for input data store: Azure Storage Console.WriteLine("Creating Azure Storage linked service"); client.LinkedServices.CreateOrUpdate(resourceGroupName, dataFactoryName, new LinkedServiceCreateOrUpdateParameters() { LinkedService = new LinkedService() { Name = "AzureStorageLinkedService", Properties = new LinkedServiceProperties ( new AzureStorageLinkedService("DefaultEndpointsProtocol=https;AccountName=<storageaccountname>;AccountKey=<accountkey>") ) } } );Anda membuat layanan tertaut di pabrik data untuk menautkan penyimpanan data dan layanan komputasi ke pabrik data. Dalam tutorial ini, Anda tidak menggunakan layanan komputasi apa pun seperti Azure HDInsight atau Azure Data Lake Analytics. Anda menggunakan dua jenis penyimpanan data Azure Storage (sumber) dan Azure SQL Database (tujuan).
Oleh karena itu, Anda membuat dua jenis layanan tertaut bernama AzureStorageLinkedService dan AzureSqlLinkedService: AzureStorage dan AzureSqlDatabase.
AzureStorageLinkedService menautkan akun penyimpanan Azure Anda ke pabrik data. Akun penyimpanan ini adalah salah satu tempat Anda membuat kontainer dan mengunggah data sebagai bagian dari prasyarat.
Tambahkan kode berikut yang membuat layanan tertaut Azure SQL ke metode Utama.
Penting
Ganti nama server, nama database, nama pengguna, dan kata sandi dengan nama server, database, pengguna, dan kata sandi Anda.
// create a linked service for output data store: Azure SQL Database Console.WriteLine("Creating Azure SQL Database linked service"); client.LinkedServices.CreateOrUpdate(resourceGroupName, dataFactoryName, new LinkedServiceCreateOrUpdateParameters() { LinkedService = new LinkedService() { Name = "AzureSqlLinkedService", Properties = new LinkedServiceProperties ( new AzureSqlDatabaseLinkedService("Data Source=tcp:<servername>.database.windows.net,1433;Initial Catalog=<databasename>;User ID=<username>;Password=<password>;Integrated Security=False;Encrypt=True;Connect Timeout=30") ) } } );AzureSqlLinkedService menautkan Azure SQL Database ke pabrik data. Data yang disalin dari penyimpanan blob disimpan dalam database ini. Anda membuat tabel emp dalam database ini sebagai bagian dari prasyarat.
Tambahkan kode berikut yang membuat himpunan data input dan output ke metode Utama.
// create input and output datasets Console.WriteLine("Creating input and output datasets"); string Dataset_Source = "InputDataset"; string Dataset_Destination = "OutputDataset"; Console.WriteLine("Creating input dataset of type: Azure Blob"); client.Datasets.CreateOrUpdate(resourceGroupName, dataFactoryName, new DatasetCreateOrUpdateParameters() { Dataset = new Dataset() { Name = Dataset_Source, Properties = new DatasetProperties() { Structure = new List<DataElement>() { new DataElement() { Name = "FirstName", Type = "String" }, new DataElement() { Name = "LastName", Type = "String" } }, LinkedServiceName = "AzureStorageLinkedService", TypeProperties = new AzureBlobDataset() { FolderPath = "adftutorial/", FileName = "emp.txt" }, External = true, Availability = new Availability() { Frequency = SchedulePeriod.Hour, Interval = 1, }, Policy = new Policy() { Validation = new ValidationPolicy() { MinimumRows = 1 } } } } }); Console.WriteLine("Creating output dataset of type: Azure SQL"); client.Datasets.CreateOrUpdate(resourceGroupName, dataFactoryName, new DatasetCreateOrUpdateParameters() { Dataset = new Dataset() { Name = Dataset_Destination, Properties = new DatasetProperties() { Structure = new List<DataElement>() { new DataElement() { Name = "FirstName", Type = "String" }, new DataElement() { Name = "LastName", Type = "String" } }, LinkedServiceName = "AzureSqlLinkedService", TypeProperties = new AzureSqlTableDataset() { TableName = "emp" }, Availability = new Availability() { Frequency = SchedulePeriod.Hour, Interval = 1, }, } } });Pada langkah sebelumnya, Anda membuat layanan tertaut untuk menautkan akun Azure Storage dan Azure SQL Database ke pabrik data Anda. Dalam langkah ini, Anda menentukan dua himpunan data bernama InputDataset dan OutputDataset yang mewakili data input dan output yang disimpan di penyimpanan data yang masing-masing dirujuk oleh AzureStorageLinkedService dan AzureSqlLinkedService.
Layanan tertaut penyimpanan Azure menentukan string koneksi yang digunakan layanan Data Factory pada durasi untuk menyambungkan ke akun penyimpanan Azure Anda. Dan, himpunan data blob input (InputDataset) menentukan kontainer dan folder yang berisi data input.
Demikian pula, layanan tertaut Azure SQL Database menentukan string koneksi yang digunakan layanan Data Factory pada durasi untuk menyambungkan ke database Anda. Dan, himpunan data tabel SQL output (OututDataset) menentukan tabel dalam database tempat data dari penyimpanan blob disalin.
Dalam langkah ini, Anda membuat himpunan data bernama InputDataset yang menunjuk ke file blob (emp.txt) di folder akar kontainer blob (adftutorial) di Azure Storage yang diwakili oleh layanan tertaut AzureStorageLinkedService. Jika Anda tidak menentukan nilai untuk fileName (atau melewatinya), data dari semua blob di folder input akan disalin ke tujuan. Dalam tutorial ini, Anda menentukan nilai untuk fileName.
Dalam langkah ini, Anda membuat himpunan data output bernama OutputDataset. Himpunan data ini menunjuk ke tabel SQL di Azure SQL Database yang diwakili oleh AzureSqlLinkedService.
Tambahkan kode berikut yang membuat dan mengaktifkan alur ke metode Utama. Dalam langkah ini, Anda membuat alur dengan aktivitas salin yang menggunakan InputDataset sebagai input dan OutputDataset sebagai output.
// create a pipeline Console.WriteLine("Creating a pipeline"); DateTime PipelineActivePeriodStartTime = new DateTime(2017, 5, 11, 0, 0, 0, 0, DateTimeKind.Utc); DateTime PipelineActivePeriodEndTime = new DateTime(2017, 5, 12, 0, 0, 0, 0, DateTimeKind.Utc); string PipelineName = "ADFTutorialPipeline"; client.Pipelines.CreateOrUpdate(resourceGroupName, dataFactoryName, new PipelineCreateOrUpdateParameters() { Pipeline = new Pipeline() { Name = PipelineName, Properties = new PipelineProperties() { Description = "Demo Pipeline for data transfer between blobs", // Initial value for pipeline's active period. With this, you won't need to set slice status Start = PipelineActivePeriodStartTime, End = PipelineActivePeriodEndTime, Activities = new List<Activity>() { new Activity() { Name = "BlobToAzureSql", Inputs = new List<ActivityInput>() { new ActivityInput() { Name = Dataset_Source } }, Outputs = new List<ActivityOutput>() { new ActivityOutput() { Name = Dataset_Destination } }, TypeProperties = new CopyActivity() { Source = new BlobSource(), Sink = new BlobSink() { WriteBatchSize = 10000, WriteBatchTimeout = TimeSpan.FromMinutes(10) } } } } } } });Perhatikan poin berikut:
- Di bagian aktivitas, hanya ada satu aktivitas yang jenisnya diatur ke Salin. Untuk informasi selengkapnya tentang aktivitas salin, lihat aktivitas pergerakan data. Dalam solusi Data Factory, Anda juga dapat menggunakan aktivitas transformasi data.
- Input untuk aktivitas diatur ke InputDataset dan output untuk aktivitas diatur ke OutputDataset.
- Di bagian typeProperties, BlobSource ditentukan sebagai jenis sumber dan SqlSink ditentukan sebagai jenis sink. Untuk daftar lengkap penyimpanan data yang didukung oleh aktivitas salin sebagai sumber dan sink, lihat penyimpanan data yang didukung. Untuk mempelajari cara menggunakan penyimpanan data tertentu yang didukung sebagai sumber/sink, klik link dalam tabel.
Saat ini, himpunan data output adalah apa yang mendorong jadwal. Dalam tutorial ini, himpunan data output dikonfigurasi untuk menghasilkan potongan satu jam sekali. Alur memiliki waktu mulai dan waktu selesai yang terpisah satu hari, yaitu 24 jam. Oleh karena itu, 24 potongan himpunan data output diproduksi oleh alur.
Tambahkan kode berikut ke metode Utama untuk mendapatkan status potongan data dari himpunan data output. Hanya ada potongan yang diharapkan dalam sampel ini.
// Pulling status within a timeout threshold DateTime start = DateTime.Now; bool done = false; while (DateTime.Now - start < TimeSpan.FromMinutes(5) && !done) { Console.WriteLine("Pulling the slice status"); // wait before the next status check Thread.Sleep(1000 * 12); var datalistResponse = client.DataSlices.List(resourceGroupName, dataFactoryName, Dataset_Destination, new DataSliceListParameters() { DataSliceRangeStartTime = PipelineActivePeriodStartTime.ConvertToISO8601DateTimeString(), DataSliceRangeEndTime = PipelineActivePeriodEndTime.ConvertToISO8601DateTimeString() }); foreach (DataSlice slice in datalistResponse.DataSlices) { if (slice.State == DataSliceState.Failed || slice.State == DataSliceState.Ready) { Console.WriteLine("Slice execution is done with status: {0}", slice.State); done = true; break; } else { Console.WriteLine("Slice status is: {0}", slice.State); } } }Tambahkan kode berikut untuk menjalankan detail untuk potongan data ke metode Utama.
Console.WriteLine("Getting run details of a data slice"); // give it a few minutes for the output slice to be ready Console.WriteLine("\nGive it a few minutes for the output slice to be ready and press any key."); Console.ReadKey(); var datasliceRunListResponse = client.DataSliceRuns.List( resourceGroupName, dataFactoryName, Dataset_Destination, new DataSliceRunListParameters() { DataSliceStartTime = PipelineActivePeriodStartTime.ConvertToISO8601DateTimeString() } ); foreach (DataSliceRun run in datasliceRunListResponse.DataSliceRuns) { Console.WriteLine("Status: \t\t{0}", run.Status); Console.WriteLine("DataSliceStart: \t{0}", run.DataSliceStart); Console.WriteLine("DataSliceEnd: \t\t{0}", run.DataSliceEnd); Console.WriteLine("ActivityId: \t\t{0}", run.ActivityName); Console.WriteLine("ProcessingStartTime: \t{0}", run.ProcessingStartTime); Console.WriteLine("ProcessingEndTime: \t{0}", run.ProcessingEndTime); Console.WriteLine("ErrorMessage: \t{0}", run.ErrorMessage); } Console.WriteLine("\nPress any key to exit."); Console.ReadKey();Tambahkan metode pembantu berikut yang digunakan oleh metode Utama ke kelas Program.
Catatan
Saat Anda menyalin dan menempelkan kode berikut, pastikan bahwa kode yang disalin berada pada tingkat yang sama dengan metode Utama.
public static async Task<string> GetAuthorizationHeader() { AuthenticationContext context = new AuthenticationContext(ConfigurationManager.AppSettings["ActiveDirectoryEndpoint"] + ConfigurationManager.AppSettings["ActiveDirectoryTenantId"]); ClientCredential credential = new ClientCredential( ConfigurationManager.AppSettings["ApplicationId"], ConfigurationManager.AppSettings["Password"]); AuthenticationResult result = await context.AcquireTokenAsync( resource: ConfigurationManager.AppSettings["WindowsManagementUri"], clientCredential: credential); if (result != null) return result.AccessToken; throw new InvalidOperationException("Failed to acquire token"); }Di Penjelajah Solusi, perluas proyek (DataFactoryAPITestApp), klik kanan Referensidan klik Tambahkan Referensi. Pilih kotak centang untuk assemblySystem.Configuration. dan klik OK.
Bangun aplikasi konsol. Klik Bangun pada menu dan klik Bangun Solusi.
Konfirmasikan bahwa setidaknya ada satu file dalam wadah adftutorial di penyimpanan blob Azure Anda. Jika tidak, buat file Emp.txt di Notepad dengan konten berikut dan unggah ke wadah adftutorial.
John, Doe Jane, DoeJalankan sampel dengan mengeklik Debug ->Mulai Penelusuran Kesalahan pada menu. Saat Anda melihat detail Menjalankan irisan data, tunggu beberapa menit, dan tekan ENTER.
Gunakan portal Microsoft Azure untuk memverifikasi bahwa pabrik data APITutorialFactory dibuat dengan artefak berikut:
- Layanan tertaut: LinkedService_AzureStorage
- Himpunan data: InputDataset dan OutputDataset.
- Alur: PipelineBlobSample
Verifikasi bahwa dua catatan karyawan dibuat dalam tabel emp dalam database yang ditentukan.
Langkah berikutnya
Untuk dokumentasi lengkap tentang .NET API for Data Factory, lihat Referensi Data Factory .NET API .
Dalam tutorial ini, Anda menggunakan penyimpanan blob Azure sebagai penyimpanan data sumber dan Azure SQL Database sebagai penyimpanan data tujuan dalam operasi salinan. Tabel berikut ini menyediakan daftar penyimpanan data yang didukung sebagai sumber dan tujuan oleh aktivitas salin:
| Kategori | Penyimpanan data | Didukung sebagai sumber | Didukung sebagai sink |
|---|---|---|---|
| Azure | Azure Blob Storage | ✓ | ✓ |
| Azure Cosmos DB (SQL API) | ✓ | ✓ | |
| Azure Data Lake Storage Gen1 | ✓ | ✓ | |
| Azure SQL Database | ✓ | ✓ | |
| Azure Synapse Analytics | ✓ | ✓ | |
| Indeks Azure Cognitive Search | ✓ | ||
| Penyimpanan Tabel Azure | ✓ | ✓ | |
| Database | Amazon Redshift | ✓ | |
| DB2* | ✓ | ||
| MySQL* | ✓ | ||
| Oracle* | ✓ | ✓ | |
| PostgreSQL* | ✓ | ||
| SAP Business Warehouse* | ✓ | ||
| SAP HANA* | ✓ | ||
| SQL Server* | ✓ | ✓ | |
| Sybase* | ✓ | ||
| Teradata* | ✓ | ||
| NoSQL | Cassandra* | ✓ | |
| MongoDB* | ✓ | ||
| File | Amazon S3 | ✓ | |
| Sistem File* | ✓ | ✓ | |
| FTP | ✓ | ||
| HDFS* | ✓ | ||
| SFTP | ✓ | ||
| Lainnya | HTTP Generik | ✓ | |
| OData Generik | ✓ | ||
| ODBC Generik* | ✓ | ||
| Salesforce | ✓ | ||
| Tabel Web (tabel dari HTML) | ✓ |
Untuk mempelajari tentang cara menyalin data ke/dari penyimpanan data, klik tautan untuk penyimpanan data dalam tabel.