id.geologyidea.com
Lagi

Transformasi Data FME dan Tabel Gabungan dalam DB tanpa Kunci dari Akses ke SQL

Transformasi Data FME dan Tabel Gabungan dalam DB tanpa Kunci dari Akses ke SQL


We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.


Saya telah dapat melakukan konversi (di FME2013) dari Access DB ke SQL Express DB (di Desktop Workbench), menambahkan beberapa transformer untuk mengambil data dari tiga tabel, dua di antaranya memiliki kunci utama, dan menjalankan SQL pelaksana kueri Saya dapat mengisi tabel baru; menanyakan informasi yang diperlukan dari ketiganya, (atau gabungan dalam keduanya dengan kunci) ini semua dilakukan satu DB pada satu waktu karena kunci utama berulang.

Saya sekarang ingin mengambil beberapa Access DB sekaligus dan melakukan hal yang sama hanya mengelompokkannya berdasarkan DB yang berasal dari menambahkan bidang kunci utama baru yang berisi nama file Access DB di bidang itu.

Ketika saya menggunakan Atribut Nama File Lengkap dari FilemnamePartExtractor, ini menggabungkan semua nama file yang dipilih dengan menambahkan karakter khusus (“,**) Saya telah menghapusnya menggunakan StringReplacer. Saya berada pada titik di mana saya tampaknya tidak dapat bergerak maju dengan sukses, karena pengalaman saya yang terbatas bekerja dengan FME.

Saya juga bertanya-tanya apakah ini pendekatan yang benar atau adakah metode yang lebih mudah?

Dalam penulis pertama dan ketiga saya menggunakan FilemnamePartExtractor, StringReplacer, StringConcatenator dan BulkAttributeRenamer dan menjatuhkan nilai ke bidang SourceData… baru.


Setelah bolak-balik dengan FME dan menjadi lebih akrab dengan Workbench-nya, saya menemukan solusi berikut.

Saya memecahkan masalah ini dengan hanya menggunakan inline query dan Batch Deploy… terletak di bawah menu File; menjalankan Batch Deploy menginisialisasi wizard tempat menjalankan kueri dan penulis hingga selesai pada setiap input DB satu per satu.

Menghasilkan output yang diinginkan berikut. Hasilnya: Di mana bidang SEGMENTID sekarang ditetapkan dan digunakan sebagai pengidentifikasi untuk setiap klasifikasi bidang DISPLAY_NAME.


Masukkan ke dalam Tabel dengan mengabaikan nilai duplikat

Saya mengalami kentut otak untuk mencari tahu ini. Saya memiliki dua Tabel berikut:

part_temp adalah tabel sementara saya yang berisi data dari file CSV, itulah sebabnya hanya satu kolom yang disetel menjadi NOT NULL . Saya perlu memasukkan data dari part_temp ke parts .

Saya telah membersihkan data dalam tabel dengan benar sehingga tidak ada nilai nol yang mencoba dimasukkan ke dalam baris yang memerlukan nilai. Namun masalah saya adalah dengan batasan UNIK saya untuk kolom part_number saya di tabel bagian. Ada nilai duplikat di dalam tabel part_temp jadi saya perlu cara untuk dapat melewatinya selama penyisipan saya. Inilah yang saya coba sejauh ini, tetapi tidak berhasil:

Ini adalah tabel yang termasuk dalam gabungan yang tidak tercantum di atas

Apa yang salah dengan permintaan INSERT saya?

Kesalahan spesifik yang saya dapatkan adalah:

Pesan 2627, Level 14, Status 1, Baris 1

Pelanggaran batasan KUNCI UNIK. Tidak dapat menyisipkan kunci duplikat di objek 'dbo.parts'. Nilai kunci duplikat adalah (31335A11)

part_num 31335A11 muncul di file csv lebih dari sekali. Karena itu muncul di tabel part_temp lebih dari sekali. Akan mudah jika hanya entri ini, tetapi saya memiliki lebih dari 1.000 entri berulang, jadi perlu waktu lama untuk menghapus semua duplikat. Tidak ada yang ada di beberapa bagian karena ini adalah tabel kosong baru yang saya coba masukkan nilainya.


4 Jawaban 4

Saya tidak melihat gunanya menggunakan RSA untuk hashing kata sandi. Menggunakan SHA dan RSA tidak akan membuat serangan bruteforce menjadi lebih lambat. Serangan besar-besaran GPU/ASIC akan tetap bekerja jika kita menganggap kunci publik $(e,n)$ diketahui. Itulah mengapa kita membutuhkan fungsi hard memori untuk membuat serangan lebih lambat. Menempel standar masih lebih baik seperti menggunakan Argon2id ( Argon2 adalah pemenang Kompetisi Password Hashing 2015). Garam unik juga membantu menghilangkan tabel pelangi. Tabel pelangi sudah mati untuk sistem kata sandi yang menyebarkan garam unik!.

Poin kecil adalah bahwa seseorang tidak perlu menyimpan kunci pribadi RSA $(d,n)$ karena seseorang tidak dapat membalikkan SHAx. Jadi tidak ada gunanya.

Kembali ke Pelangi

dalam hal perlindungan terhadap tabel pelangi, orang perlu memastikan bahwa setiap kata sandi memerlukan pemisahan domain. Ini dicapai dengan garam unik untuk semua. Jika Anda ingin menggunakan RSA maka Anda perlu menggunakan padding OAEP atau PKCS#1 v1.5. lapisan. Keduanya adalah skema enkripsi probabilistik yang selama Anda memiliki sumber angka acak yang baik seperti /dev/urandom maka jika Anda mengenkripsi pesan yang sama berulang kali Anda akan mendapatkan hasil yang berbeda, hingga batas yang sangat besar tentunya (ukuran $r $ di OAEP). Orang dapat menganggap garam sebagai pengacakan ini.

Catatan samping: lada, yang merupakan garam unik untuk setiap server aplikasi, digunakan untuk memisahkan domain aplikasi jika terkena garam yang sama untuk pengguna yang sama. Juga, Jika penyerang mengunduh tabel pengguna hanya dengan injeksi SQL, maka mereka tidak dapat menerapkan bahkan brute force tanpa lada server.

Catatan 2: Menurut daftar Hashcat, hanya OpenSSH yang menggunakan RSA dalam mode gabungan RSA/DSA/EC/OpenSSH

Bagian ini berdasarkan komentar dari @fgrieu jika @marcus mempertimbangkannya

Di sini padding deterministik adalah singkatan dari padding pesan untuk enkripsi RSA, tetapi secara deterministik, seperti RSASSA-PKCS1-v1_5.

Jelas bahwa jika garam itu unik untuk setiap pengguna maka itu sudah aman terhadap tabel pelangi. Cracker kata sandi jika mengakses hash kata sandi, tidak dapat mengujinya tanpa sepengetahuan kunci pribadi.

Masalah terbesar adalah perlindungan kunci pribadi RSA. Pendekatan yang biasa digunakan adalah menggunakan HSM untuk menangani enkripsi-enkripsi tempat kunci RSA disimpan, juga, namun, untuk sistem yang berat, ini mungkin menjadi penghambat kecepatan. Ini bukan perbandingan nyata, dan saran yang biasa untuk algoritma hashing kata sandi adalah menyesuaikan iterasi sehingga dibutuhkan sekitar 1 detik per pengguna. Ini untuk keramahan pengguna. yaitu pengguna umum mungkin tidak ingin menunggu terlalu lama untuk proses login.

Mengetahui kunci publik $(n,e)$ tidak akan membantu penyerang karena mereka, sepengetahuan publik, tidak dapat merusak RSA > 829-bit. Lihat catatan terkini tentang Seberapa besar kunci RSA dianggap aman hari ini?

Kita dapat menganggap operasi RSA ini sebagai lada dari server aplikasi juga. Selain itu, sebagai ganti RSA, seseorang dapat menggunakan HMAC-SHA256 untuk penggunaan yang sama, yang memiliki ukuran kunci lebih rendah.

Pendeknya, jika kunci dapat dilindungi, ia memiliki lebih banyak perlindungan terhadap pendekatan biasa.

Apa yang Anda gambarkan disebut lada.

Apa yang Anda lakukan hanyalah menggunakan RSA sebagai fungsi hash kriptografis. Itu mungkin mengurangi kinerja dan membuat sistem Anda lebih rumit.

Umumnya, orang memasang nomor acak langsung ke program sebagai literal. Aman selama kode sumber dan biner Anda aman. Anda dapat menggunakannya sebagai kunci RSA, tetapi cara yang lebih efisien adalah menambahkan lada dengan cara yang sama seperti menambahkan garam. (petunjuk ada di nama.)

Pada dasarnya, Anda mengambil kata sandi, menambahkan garam, menambahkan merica, dan menggabungkannya.

Tabel pelangi pada dasarnya adalah serangan kamus yang dioptimalkan, yang bergantung pada dua asumsi:

  • Bahwa dua aplikasi yang berbeda akan meng-hash input yang sama ke output yang sama, mis. kata sandi "Password123" akan selalu di-hash ke "42f749ade7f9e195bf475f37a44cafcb". Hal ini memungkinkan penyerang untuk menggunakan kembali database tabel pelangi untuk menyerang beberapa target.
  • Itu dua entri yang berbeda dalam satu aplikasi akan hash input yang sama ke output yang sama, mis. dua pengguna berbeda dengan sandi "Password123" akan menyimpan hash yang sama. Ini memungkinkan penyerang untuk menghitung hash berdasarkan kamus dan mencobanya terhadap semua entri sekaligus.

Menambahkan langkah tambahan ke proses hashing - menambahkan global "pepper", double-hashing, enkripsi-lalu-hashing - umumnya akan merusak pertama asumsi: hash Anda untuk "Password123" sekarang tidak lagi terlihat seperti hash saya untuk "Password123".

Namun, untuk memecahkan kedua asumsi, Anda perlu melakukan sesuatu yang berbeda untuk setiap entri dalam aplikasi Anda, dan itulah yang memberikan garam. Satu-satunya cara langkah enkripsi akan melakukan fungsi yang sama adalah jika kebetulan mengandung garamnya sendiri, dengan enkripsi pada dasarnya tidak relevan.

Secara umum, adalah ide yang buruk untuk menggulung algoritma kripto Anda sendiri, atau menggabungkannya dengan cara yang tidak diinginkan, tanpa pengetahuan yang benar-benar kuat tentang teori yang mendasarinya, jadi Anda lebih baik berpegang pada fungsi hash yang dipahami dengan baik ( kata sandi + per -pengguna-garam + per-aplikasi-lada ).

Baik hash (seperti SHA-1) dan cipher (seperti RSA) dirancang untuk tidak dapat dibalik. Artinya, mengingat output mereka (digest atau ciphertext) seharusnya tidak layak untuk mengetahui apa inputnya.

Nilai dari garam tidak mempersulit untuk mengetahui apa kata sandi itu dari kata sandi yang di-hash. Kata sandi seringkali mudah ditebak. Garam mempersulit penyerang untuk menebak, karena garam berbeda untuk setiap pengguna. Dengan demikian, penyerang harus menebak pengguna individu ("user 3198721 memiliki kata sandi 'qwerty'") daripada menebak seluruh database sekaligus ("beberapa pengguna dalam database ini memiliki kata sandi 'qwerty'").

Ini secara signifikan meningkatkan jumlah tebakan yang harus dibuat, dan dengan demikian waktu yang dibutuhkan untuk berhasil mengkompromikan pengguna, terutama ketika fungsi hash dipilih menjadi mahal untuk dihitung karena semua fungsi hash kata sandi yang baik. Sistem yang dirancang dengan baik tidak akan pernah menggunakan SHA, melainkan sesuatu seperti bcrypt, scrypt, atau PBKDF2.

Menambahkan enkripsi RSA ke dalam campuran tidak dengan sendirinya mencapai apa yang dilakukan garam. Mungkin dengan enkripsi RSA, intisari dari "qwerty" bukanlah "63edc12362821bd115f7" melainkan "ee69076c5a27c1c476". Tapi itu masih sama untuk setiap pengguna, jadi satu tebakan dapat diperiksa terhadap semua pengguna di database.

Ada beberapa keuntungan bahwa penyerang juga harus mengkompromikan kunci enkripsi, dan itu sesuatu yang berharga. Namun ini biasanya dilakukan dengan menyimpan seluruh basis data pengguna dalam penyimpanan terenkripsi, daripada mengenkripsi setiap kata sandi satu per satu sebelum melakukan hashing. Salah satu alasannya: itu memungkinkan memutar kunci enkripsi.

Namun, beberapa skema enkripsi menggunakan vektor inisialisasi (IV), yang mirip dengan garam karena merupakan nilai acak. RSA tidak selalu menggunakan IV, tetapi bisa, dalam hal ini skema yang Anda usulkan pada dasarnya akan mengasinkan kata sandi dengan nama yang berbeda.


Ada beberapa cara untuk melakukan ini, tergantung pada apa yang Anda Betulkah mau. Tanpa kolom umum, Anda perlu memutuskan apakah Anda ingin memperkenalkan kolom umum atau mendapatkan produk.

Katakanlah Anda memiliki dua tabel:

Lupakan kolom yang sebenarnya karena kemungkinan besar Anda akan melakukannya memiliki hubungan pelanggan/pesanan/bagian dalam hal ini saya baru saja menggunakan kolom tersebut untuk mengilustrasikan cara melakukannya.

Produk kartesius akan mencocokkan setiap baris di tabel pertama dengan setiap baris di tabel kedua:

Itu mungkin bukan yang Anda inginkan karena 1000 bagian dan 100 pelanggan akan menghasilkan 100.000 baris dengan banyak informasi duplikat.

Atau, Anda dapat menggunakan gabungan untuk hanya menampilkan data, meskipun tidak berdampingan (Anda harus memastikan jenis kolom kompatibel di antara dua pilihan, baik dengan membuat kolom tabel kompatibel atau memaksanya dalam pilihan ):

Di beberapa database, Anda dapat menggunakan kolom rowid/rownum atau pseudo-column untuk mencocokkan record secara berdampingan, seperti:

Kodenya akan menjadi seperti:

Itu tetap Suka produk kartesius tetapi klausa where membatasi bagaimana baris digabungkan untuk membentuk hasil (jadi bukan produk kartesius sama sekali, sungguh).

Saya belum menguji SQL itu untuk ini karena ini adalah salah satu keterbatasan DBMS pilihan saya, dan memang demikian, saya tidak percaya itu pernah diperlukan dalam skema yang dipikirkan dengan benar. Karena SQL tidak menjamin urutan yang menghasilkan data, pencocokan dapat berubah setiap kali Anda melakukan kueri kecuali Anda memiliki spesifik hubungan atau urutan dengan klausa.

Saya pikir hal yang ideal untuk dilakukan adalah menambahkan kolom ke kedua tabel yang menentukan apa hubungannya. Jika tidak ada hubungan nyata, maka Anda mungkin tidak punya urusan untuk mencoba menempatkannya berdampingan dengan SQL.

Jika Anda hanya ingin mereka ditampilkan berdampingan dalam laporan atau di halaman web (dua contoh), alat yang tepat untuk melakukannya adalah apa pun yang menghasilkan laporan atau halaman web Anda, ditambah dengan dua Mandiri Kueri SQL untuk mendapatkan dua tabel yang tidak terkait. Misalnya, kisi dua kolom di BIRT (atau Crystal atau Jasper) masing-masing dengan tabel data terpisah, atau tabel dua kolom HTML (atau CSS) masing-masing dengan tabel data terpisah.


Langkah 2) Transformasi

Data yang diekstraksi dari server sumber adalah mentah dan tidak dapat digunakan dalam bentuk aslinya. Oleh karena itu perlu dibersihkan, dipetakan dan diubah. Faktanya, ini adalah langkah kunci di mana proses ETL menambah nilai dan mengubah data sehingga laporan BI yang berwawasan dapat dihasilkan.

Ini adalah salah satu konsep ETL penting di mana Anda menerapkan serangkaian fungsi pada data yang diekstraksi. Data yang tidak memerlukan transformasi disebut sebagai gerakan langsung atau melewati data.

Pada langkah transformasi, Anda dapat melakukan operasi yang disesuaikan pada data. Misalnya, jika pengguna menginginkan pendapatan jumlah penjualan yang tidak ada dalam database. Atau jika nama depan dan nama belakang dalam sebuah tabel berada di kolom yang berbeda. Dimungkinkan untuk menggabungkannya sebelum memuat. Masalah Integrasi Data

  1. Ejaan yang berbeda dari orang yang sama seperti Jon, John, dll.
  2. Ada beberapa cara untuk menunjukkan nama perusahaan seperti Google, Google Inc.
  3. Penggunaan nama yang berbeda seperti Cleaveland, Cleveland.
  4. Mungkin ada kasus bahwa nomor rekening yang berbeda dihasilkan oleh berbagai aplikasi untuk pelanggan yang sama.
  5. Dalam beberapa data, file yang diperlukan tetap kosong
  6. Produk tidak valid yang dikumpulkan di POS sebagai entri manual dapat menyebabkan kesalahan.
  • Pemfilteran – Pilih hanya kolom tertentu untuk dimuat
  • Menggunakan aturan dan tabel pencarian untuk Standardisasi data
  • Konversi Set Karakter dan penanganan penyandian
  • Konversi Satuan Pengukuran seperti Konversi Tanggal Waktu, konversi mata uang, konversi numerik, dll.
  • Pemeriksaan validasi ambang batas data. Misalnya, usia tidak boleh lebih dari dua digit.
  • Validasi aliran data dari staging area ke tabel perantara.
  • Bidang yang wajib diisi wajib diisi.
  • Pembersihan (misalnya, memetakan NULL ke 0 atau Gender Pria ke "M" dan Wanita ke "F" dll.)
  • Pisahkan kolom menjadi beberapa dan gabungkan beberapa kolom menjadi satu kolom.
  • Transposisi baris dan kolom,
  • Gunakan pencarian untuk menggabungkan data
  • Menggunakan validasi data kompleks apa pun (misalnya, jika dua kolom pertama dalam satu baris kosong, maka baris tersebut secara otomatis ditolak untuk diproses)

Bekerja dengan Kudu Terintegrasi dengan Hive Metastore

Mulai dari Kudu 1.10 dan Impala 3.3, Impala mendukung layanan Kudu yang terintegrasi dengan Hive Metastore (HMS). Lihat dokumentasi integrasi HMS untuk detail selengkapnya tentang integrasi Hive Metastore Kudu.

  • Saat Kudu terintegrasi dengan Hive Metastore, Impala harus dikonfigurasi untuk menggunakan HMS yang sama dengan Kudu.
  • Karena mungkin tidak ada pemetaan satu-ke-satu antara tabel Kudu dan tabel eksternal, hanya tabel internal yang disinkronkan secara otomatis.
  • Saat Anda membuat tabel di Kudu, Kudu akan membuat entri HMS untuk tabel tersebut dengan tipe tabel internal.
  • Saat layanan Kudu terintegrasi dengan HMS, entri tabel internal akan dibuat secara otomatis di HMS saat tabel dibuat di Kudu tanpa Impala. Untuk mengakses tabel ini melalui Impala, jalankan pernyataan INVALIDATE METADATA sehingga Impala mengambil metadata terbaru.

Blog kami

Salah satu klien kami memiliki tumpukan aplikasi berbasis Java di Linux yang terhubung ke versi SQL Server yang cukup lama di Windows. Kami ingin memigrasikan seluruh sistem ke tumpukan terpadu yang lebih konsisten yang digunakan oleh pengembang secara efisien, dan itu terkini sehingga menerima pembaruan rutin.

Kami memutuskan untuk memigrasi database dari SQL Server ke PostgreSQL di Linux karena porting database, meskipun tidak sepenuhnya cepat atau sederhana, masih jauh lebih sederhana daripada port aplikasi ke .NET/C#. Menulis ulang aplikasi akan memakan waktu jauh lebih lama, jauh lebih berisiko bagi bisnis, dan lebih mahal.

Saya bereksperimen dengan beberapa pendekatan untuk migrasi dan memutuskan untuk pergi dengan proses migrasi skema dan kemudian pendekatan migrasi data yang dirujuk pada wiki Postgres. Mari kita berjalan melalui proses migrasi langkah demi langkah.

Migrasi Skema

Skema tabel dan tampilan database SQL Server perlu diekspor untuk melakukan konversi skema. Langkah-langkah berikut akan menunjukkan cara mengekspor skema.

Ekspor Skema Database SQL Server

Di SQL Management Studio, klik kanan pada database dan pilih Tasks → Generate Scripts.

Pilih "Pilih objek database tertentu" dan periksa hanya Tabel skema aplikasi Anda (hapus centang objek skema dbo dan lainnya jika ada).

Pastikan bahwa "Jenis data ke skrip" dalam opsi lanjutan diatur ke "Skema saja".

Tinjau dan simpan tabel database file skema tables.sql. Gunakan WinSCP dan autentikasi kunci publik untuk mentransfer tables.sql ke server Linux.

Konversi Skema dari SQL Server ke Postgres

sqlserver2pgsql adalah alat migrasi yang baik yang ditulis dalam Perl untuk mengonversi skema SQL Server ke skema Postgres. Kloning dari GitHub ke server database Anda dan jalankan perintah berikut untuk mengonversi skema tabel:

Skema yang dikonversi akan tersedia di tables-before.sql dan pernyataan untuk membuat batasan akan ada di tables-after.sql untuk dieksekusi setelah migrasi data. Cukup tinjau tabel-tidak yakin.sql dan lakukan apa yang diperlukan jika ada tabel yang tidak dikonversi oleh alat. Jika Anda ingin mengubah nama skema apa pun di Postgres, Anda dapat mengganti namanya sekarang di file SQL, mis .:

Siapkan Basis Data Postgres:

Mudah-mudahan, database Postgres Anda sudah siap di server Anda. Jika tidak, instal Postgres versi terbaru di server Anda. Kemudian buat pengguna dan database Postgres dengan izin yang diberikan kepada pengguna.

Setelah database dan akun pengguna siap, muat skrip tables-before.sql yang dikonversi ke dalam database Anda untuk membuat tabel. Kemudian kita dapat melanjutkan dengan migrasi data.

Migrasi data

Migrasi data melalui pembuangan dan pemulihan data membuat proses menjadi rumit, dengan proses manual yang sangat besar, ketidakcocokan tipe data, format tanggal, dll. Adalah bijaksana untuk menggunakan sistem stabil yang ada daripada menginvestasikan lebih banyak waktu ke dalamnya.

Integrasi Data Pentaho

Pentaho menawarkan berbagai produk data-centric yang stabil. Pentaho Data Integration (PDI) adalah alat ETL yang memberikan dukungan besar untuk migrasi data antara database yang berbeda tanpa intervensi manual. PDI edisi komunitas sudah cukup baik untuk menjalankan tugas kita di sini. Itu perlu membuat koneksi ke database sumber dan tujuan. Kemudian akan melakukan sisa pekerjaan pada migrasi data dari SQL server ke database Postgres dengan menjalankan pekerjaan PDI.

Unduh Pentaho Data Integration Community Edition dan ekstrak tarball di lingkungan lokal Anda. Lihat:

Jalankan spoon.sh untuk membuka aplikasi GUI di lingkungan lokal Anda.

Buat koneksi ke database SQL Server dan Postgres di PDI.

2. Buat Koneksi Basis Data Sumber.

Klik Lihat di bilah sisi kiri → Klik Kanan ‘Koneksi Basis Data’ → Pilih Baru → Berikan detail koneksi SQL Server

3. Buat Koneksi Database Tujuan.

Klik Lihat di bilah sisi kiri → Klik Kanan ‘Koneksi Basis Data’ → Pilih Baru → Berikan detail koneksi Postgres

4. Dari menu Wizard, pilih Copy Tables Wizard.

Alat → Wizard → Salin Tabel

5. Pilih database Sumber dan Tujuan.

6. Pilih daftar tabel yang akan dimigrasikan.

7. Maju untuk memilih jalur untuk file pekerjaan dan transformasi.

8. Transformasi dibuat untuk menyalin data dari database sumber ke database tujuan.

9. Salin tarball Pentaho Data Integration dan pekerjaan dengan transformasi ke server Postgres untuk menghindari latensi jaringan pada migrasi data.

10. Periksa server Postgres ke akses database SQL Server (berdasarkan desain arsitektur di akhir Anda).

Buat tunneling SSH untuk terhubung ke SQL Server melalui server aplikasi.

Pelaksanaan Tugas PDI

Jalankan pekerjaan PDI menggunakan utilitas dapur Pentaho di server database. Tambahkan konfigurasi ketel untuk menghindari Pentaho mempertimbangkan nilai kosong sebagai nilai NULL yang memengaruhi batasan NOT NULL.

Konfirmasikan alamat IP untuk koneksi server database dan jalankan pekerjaan menggunakan kitchen.sh , utilitas baris perintah untuk menjalankan pekerjaan PDI.

Proses migrasi data memakan waktu sekitar 30 menit untuk menyalin 10GB data dari SQL Server ke database Postgres melalui jaringan.

Kami mengalami masalah ruang saat menyalin tabel besar dan menanganinya dengan mengurangi jumlah ukuran baris dalam file transformasi tabel yang sesuai. Berikut pembahasan masalahnya.

Setelah migrasi data selesai, jalankan skrip migrasi skema tables-after.sql untuk menerapkan batasan.

Migrasi Tampilan

Ikuti langkah yang sama untuk mengonversi skema views.sql. Klik kanan pada database dan klik Tasks → Generate Script → Export only views.

Migrasi Fungsi

Migrasi fungsi membutuhkan keterampilan dan kesadaran sintaks dari SQL Server dan Postgres. Fungsi perlu divalidasi dan diuji dengan benar setelah menulis ulang untuk Postgres. Tempatkan semua fungsi yang ditulis ulang ke dalam postgres-function.sql dan muat ke dalam database sebagai bagian dari proses migrasi.

Kesalahan Paling Umum

KESALAHAN: kesalahan sintaks pada atau di dekat "["
Hapus tanda kurung siku SQL Server yang mengutip nama kolom dan tabel.
PILIH [id_pengguna] → PILIH id_pengguna

KESALAHAN: operator tidak ada: karakter bervariasi = bilangan bulat
Ketik casting pada perbandingan
AND column_name in (1, -1) → AND column_name in (Ƈ', '-1')

KESALAHAN: kesalahan sintaks pada atau di dekat ","
Konversi tipe data
convert(varchar(10),column_name) → column_name::text

ERROR: kolom "user_id" dari relasi "user" tidak ada
Tidak ada tanda kutip ganda pada nama kolom kasus campuran (kecuali digunakan di mana-mana)
INSERT INTO user ("user_id") NILAI (1) → INSERT INTO user (user_id) NILAI (1)

KESALAHAN: kolom "mm" tidak ada
TANGGAL → INTERVAL
TANGGAL(mm,-6,GETDATE()) → TANGGAL_CURRENT - INTERVAL ƌ bulan'

KESALAHAN: kolom "varchar" tidak ada
Konversikan tanggal ke format AS
convert(varchar, tc_agreeed_dt, 101) → to_char(CURRENT_TIMESTAMP, 'MM/DD/YYYY')

Hasil

Setelah migrasi, kami melakukan pengujian ekstensif pada aplikasi dan mengoptimalkan kueri dalam berbagai modul. Kami juga melakukan uji benchmark pada kecepatan dan kinerja antara sistem baru dan lama. Migrasi terbayar dengan hasil yang menjanjikan dari keuntungan rata-rata 40% pada keseluruhan kinerja aplikasi. Itu mencerminkan perangkat keras server yang lebih baru serta pekerjaan pengoptimalan kueri, bukan hanya perpindahan ke Postgres.


Anda dapat membuat string menggunakan tampilan katalog, misalnya:

Tentu saja ada potensi gotcha, misalnya jika tabel ini memiliki hubungan kunci asing, Anda harus menghapusnya terlebih dahulu, atau mengatur output untuk meletakkan tabel dalam urutan tertentu.

Untuk mendapatkan daftar tabel, gunakan:

Saya menjalankan kueri ini lalu menempelkan hasilnya kembali ke jendela kueri untuk menghapus semua tabel:

Jika Anda ingin menghapus semua tabel tetapi tetap menyimpannya dengan nama yang dimulai dengan A, B, C atau D:

Ini memungkinkan Anda untuk menghapus lebih banyak tabel.

Saya suka yang saya tulis ini:

Ini dapat dilakukan dengan menggunakan eksekusi sebagai berikut:

Jalankan kueri di atas dan simpan hasilnya ke dalam csv. Kemudian buka CSV itu di notepad. Kemudian lakukan Ctrl + H untuk mengganti skema dengan DROP TABLE SCHEMA yang akan memberi Anda semua kueri drop, salin dan tempel sql besar ini ke alat sql Anda dan jalankan


Kunci utama SQLite dan tabel rowid

Saat Anda membuat tabel tanpa menentukan opsi TANPA ROWID, SQLite menambahkan kolom implisit yang disebut rowid yang menyimpan integer bertanda 64-bit. Kolom rowid adalah kunci yang secara unik mengidentifikasi baris dalam tabel. Tabel yang memiliki kolom rowid disebut tabel rowid.

Jika sebuah tabel memiliki kunci utama yang terdiri dari satu kolom, dan kolom tersebut didefinisikan sebagai INTEGER maka kolom kunci utama ini menjadi alias untuk kolom rowid.

Perhatikan bahwa jika Anda menetapkan tipe integer lain seperti BIGINT dan UNSIGNED INT ke kolom kunci utama, kolom ini tidak akan menjadi alias untuk kolom rowid.

Karena tabel rowid mengatur datanya sebagai B-tree, kueri dan pengurutan data tabel rowid sangat cepat. Ini lebih cepat daripada menggunakan kunci utama yang bukan merupakan alias dari rowid .

Catatan penting lainnya adalah jika Anda mendeklarasikan kolom dengan tipe INTEGER dan klausa PRIMARY KEY DESC, kolom ini tidak akan menjadi alias untuk kolom rowid:


Meringkas dan Mengelompokkan Data dalam SQL

Anda dapat gunakan BERBEDA untuk menghilangkan nilai duplikat dalam perhitungan fungsi agregat lihat “Menghilangkan Baris Duplikat dengan BERBEDA” di Bab 4. Sintaks umum dari fungsi agregat adalah:

agg_func adalah MIN, MAKSIMAL, JUMLAH, AVG, atau MENGHITUNG. expr adalah nama kolom, literal, atau ekspresi. SEMUA menerapkan fungsi agregat untuk semua nilai, dan BERBEDA menentukan bahwa setiap nilai unik dipertimbangkan. SEMUA adalah default dan jarang terlihat dalam praktik.

Dengan JUMLAH(), AVG(), dan MENGHITUNG(expr), BERBEDA menghilangkan nilai duplikat sebelum jumlah, rata-rata, atau hitungan dihitung. BERBEDA tidak berarti dengan MIN() dan MAKS () Anda dapat menggunakannya, tetapi itu tidak akan mengubah hasilnya. Anda tidak dapat menggunakan BERBEDA dengan MENGHITUNG(*).

Untuk menghitung jumlah dari sekumpulan nilai yang berbeda:

expr adalah nama kolom, literal, atau ekspresi numerik. Tipe data hasil paling tidak setepat tipe data paling presisi yang digunakan di ekspr.

Untuk menghitung rata-rata dari sekumpulan nilai yang berbeda:

expr adalah nama kolom, literal, atau ekspresi numerik. Tipe data hasil paling tidak setepat tipe data paling presisi yang digunakan di ekspr.

Untuk menghitung baris non-null yang berbeda:

expr adalah nama kolom, literal, atau ekspresi. Hasilnya adalah bilangan bulat yang lebih besar atau sama dengan nol.

Pertanyaan dalam Daftar 6.6 mengembalikan hitungan, jumlah, dan rata-rata harga buku. non-BERBEDA dan BERBEDA menghasilkan Gambar 6.6 berbeda karena BERBEDA hasil menghilangkan duplikat harga $12,99 dan $19,95 dari perhitungan.

Daftar 6.6 Beberapa BERBEDA kueri agregat. Lihat Gambar 6.6 untuk hasilnya.

Gambar 6.6 Hasil Listing 6.6.

BERBEDA di sebuah PILIH klausa danBERBEDA dalam fungsi agregat tidak mengembalikan hasil yang sama.

Tiga pertanyaan dalam Daftar 6.7 hitung ID penulis dalam tabeljudul_penulis. Gambar 6.7 menunjukkan hasil. Kueri pertama menghitung semua ID penulis dalam tabel. Kueri kedua mengembalikan hasil yang sama dengan kueri pertama karena MENGHITUNG() sudah melakukan pekerjaannya dan mengembalikan nilai dalam satu baris sebelumnya BERBEDA diterapkan. Pada pertanyaan ketiga, BERBEDA diterapkan ke ID penulis sebelumnya MENGHITUNG() mulai menghitung.

Daftar 6.7 BERBEDA di sebuah PILIH klausa dan BERBEDA dalam fungsi agregat berbeda dalam arti. Lihat Gambar 6.7 untuk hasilnya.

Gambar 6.7 Hasil Listing 6.7.

Pencampuran non-BERBEDA dan BERBEDA agregat yang sama PILIH klausa dapat menghasilkan hasil yang menyesatkan.

Empat pertanyaan dalam Daftar 6.8 (Halaman berikut) menunjukkan empat kombinasi non-BERBEDA dan BERBEDA jumlah dan hitungan. Dari empat hasil di Gambar 6.8 (halaman berikut) , hanya hasil pertama (tidak ada BERBEDAs) dan hasil akhir (semua BERBEDAs) konsisten secara matematis, yang dapat Anda verifikasi dengan AVG(harga) dan AVG(harga BERBEDA). Dalam kueri kedua dan ketiga (campuran non-BERBEDApasir BERBEDAs), Anda tidak dapat menghitung rata-rata yang valid dengan membagi jumlah dengan hitungan.

Daftar 6.8 Pencampuran non-BERBEDA dan BERBEDA agregat yang sama PILIH klausa dapat menghasilkan hasil yang menyesatkan. Lihat Gambar 6.8 untuk hasilnya.

Gambar 6.8 Hasil Listing 6.8.

akses microsoft tidak mendukung BERBEDA fungsi agregat. Pernyataan ini, misalnya, ilegal di Access:

Tetapi Anda dapat mereplikasinya dengan subkueri ini (lihat Tips di “Menggunakan Subkueri sebagai Ekspresi Kolom” di Bab 8):

Solusi Access ini tidak akan membiarkan Anda mencampur non-BERBEDA dan BERBEDA agregat, namun, seperti pada kueri kedua dan ketiga dalam Daftar 6.8.

Di dalam Microsoft SQL Server, jika Anda menggunakan BERBEDA, expr harus berupa nama kolom saja. Itu tidak dapat menyertakan ekspresi aritmatika:

MySQL mendukung COUNT(BERBEDA expr) tapi tidak SUM(BERBEDA expr) dan AVG(BERBEDA expr). Daftar 6.6 dan 6.8 tidak akan berjalan di MySQL.