Veel

FME andmetransformatsiooni ja kokkulangemise tabelid DB -s ilma võtmeta juurdepääsult SQL -ile

FME andmetransformatsiooni ja kokkulangemise tabelid DB -s ilma võtmeta juurdepääsult SQL -ile


Olen suutnud teisendada (FME2013 -s) Access DB -st SQL Express DB -ks (Desktop Workbenchis), lisades mõned trafod andmete hankimiseks kolmest tabelist, millest kahel on primaarvõtmed, ja käitan SQL -i päringu täitja Ma saan uue tabeli täita; vajaliku teabe pärimine kõigilt kolmelt (või nende kahe sisemine ühendamine võtmega) toimub kõik ükshaaval, sest esmased võtmed korduvad.

Tahaksin nüüd haarata korraga mitu Accessi andmebaasi ja teha sama asja, rühmitades need kokku ainult nende andmebaaside põhjal, mis nad pärinevad, lisades sellele väljale uue esmase võtme välja, mis sisaldab Access DB failinime.

Kui kasutan FilemnamePartExtractori täielikku failinime atribuuti, ühendab see kõik valitud failinimed, lisades erimärke (“, **), olen need StringReplacer abil eemaldanud. Olen hetkel, kus FME -ga töötamise piiratud kogemuste tõttu ei saa ma edukalt edasi liikuda.

Mind huvitab ka see, kas see on õige lähenemisviis või on mõni lihtsam meetod?

Esimeses ja kolmandas kirjutajas kasutan FilemnamePartExtractor, StringReplacer, StringConcatenator ja BulkAttributeRenamer ning panen väärtused uude SourceData… väljale.


Pärast FME -ga edasi -tagasi liikumist ja selle Workbenchi tundmaõppimist olen välja pakkunud järgmise lahenduse.

Lahendasin selle probleemi, kasutades ainult sisemist päringut ja Batch Deploy…, mis asub menüü File all; Batch Deploy käivitamine käivitab viisardi, kus see käivitab päringu (d) ja kirjutajad iga sisend -DB ükshaaval.

Järgmise soovitud väljundi loomine. Tulemus: kus väli SEGMENTID on nüüd määratud ja seda kasutatakse iga DISPLAY_NAME välja klassifikatsiooni identifikaatorina.


Sisestage tabelisse duplikaatväärtusi ignoreerides

Mul on selle pärast selgeks tegemine ajupurt. Mul on järgmised kaks tabelit:

part_temp on minu ajutine tabel, mis sisaldab andmeid CSV -failist, mistõttu on ainult üks veerg seatud olekuks NOT NULL. Pean sisestama andmed part_temp osadesse.

Olen tabeli andmed korralikult puhastanud, nii et ühtegi väärtust nõudvatesse ridadesse ei üritata sisestada tühiväärtusi. Minu probleem on aga minu ainulaadse piiranguga osade tabeli veergudele part_number. Tabelis part_temp on topeltväärtusi, nii et mul on vaja võimalust nende sisestamise ajal vahele jätta. Seda olen siiani proovinud, kuid see ei tööta:

Need on ülalloetletud liitmike tabelid

Mis on minu INSERT -päringuga valesti?

Konkreetne viga, mille ma saan, on järgmine:

Sõnum 2627, tase 14, olek 1, rida 1

UNIKAALSE VÕTME piirangu rikkumine. Dubleerivat võtit ei saa objekti „dbo.parts” sisestada. Võtme duplikaadi väärtus on (31335A11)

part_num 31335A11 ilmub csv -faili rohkem kui üks kord. Sellisena ilmub see tabelis part_temp rohkem kui üks kord. Oleks lihtne, kui see oleks just see kirje, aga mul on üle 1000 korduva kirje, nii et kõikide duplikaatide eemaldamine võtaks igavesti. Midagi pole osade kaupa olemas, kuna see on täiesti uus tühi laud, kuhu üritan väärtusi panna.


4 vastust 4

Ma ei näe mõtet RSA -d parooli räsimiseks kasutada. SHA ja RSA kasutamine ei muuda bruteforce'i rünnakut aeglasemaks. Massiivsed GPU/ASIC rünnakud toimivad endiselt, kui eeldame, et avalik võti $ (e, n) $ on teada. Seetõttu vajame rünnakute aeglustamiseks mälupulgaga funktsioone. Standardi järgimine on ikka parem nagu Argon2id (Argon2 võitis 2015. aastal paroolide räsimise konkursi). Unikaalne sool aitab ka vikerkaarelaudu kõrvaldada. Vikerkaare tabelid on unikaalseid sooli kasutava paroolisüsteemi jaoks surnud !.

Väike punkt on see, et RSA privaatvõtit $ (d, n) $ ei pea salvestama, kuna SHAx -i ei saa tagasi pöörata. Nii et see on kasutu.

Tagasi Vikerkaare juurde

vikerkaare tabelite eest kaitsmisel tuleb veenduda, et iga parool vajab domeeni eraldamist. See saavutatakse ainulaadse soolaga kõigile. Kui soovite RSA -d kasutada, peate kasutama OAEP -polsterdust või PKCS#1 v1.5. polsterdus. Mõlemad on tõenäoline krüpteerimisskeem, mille kohaselt, kui teil on hea juhuslike numbrite allikas, nagu /dev /urandom, saate sama sõnumi ikka ja jälle krüptimisel erinevaid tulemusi, muidugi kuni tohutu piirini (suurus $ $ $ OAEP -is). Soolast võib mõelda kui sellest randomiseerimisest.

Kõrvalmärkus: pipart, mis on iga rakendusserveri jaoks ainulaadne sool, kasutatakse rakenduste domeenide eraldamiseks, kui sama kasutaja saab sama soola. Samuti, kui ründaja laadib kasutajate tabeli alla ainult SQL-i süstiga, ei saa nad ilma serveripiprata isegi toorest jõudu rakendada.

Märkus 2: Hashcati loendi kohaselt kasutab RSA -d kombineeritud režiimis ainult OpenSSH RSA/DSA/EC/OpenSSH

See osa põhineb @fgrieu kommentaaridel juhul, kui @marcus neid kaalus

Deterministlik polster tähistab siin RSA krüpteerimise sõnumi täitmist, kuid deterministlikult, nagu RSASSA-PKCS1-v1_5.

On ilmne, et kui sool on iga kasutaja jaoks ainulaadne, on see juba vikerkaarelaudade vastu kaitstud. Kui paroolide räsi juurde pääseb, ei saa paroolid lõhkuda ilma privaatvõtme teadmata.

Suurim probleem on RSA privaatvõtme kaitse. Tavaline lähenemisviis on HSM -i kasutamine nende krüpteerimiste jaoks, kuhu on salvestatud RSA -võti, kuid raskete süsteemide puhul võib see olla kiiruse kitsaskoht. See pole tõeline võrdlus ja paroolide räsimisalgoritmide tavaline nõuanne on iteratsiooni reguleerimine nii, et see võtab umbes 1 sekund kasutaja kohta. See on kasutajasõbralikkuse huvides. st tavakasutaja ei pruugi soovida sisselogimisprotsessi liiga palju oodata.

Avaliku võtme $ (n, e) $ tundmine ei aita ründajaid, kuna nad ei saa avalikkuse teada RSA & gt 829-bitist murda. Vaadake praeguseid andmeid selle kohta, kui suurt RSA -võtit peetakse täna turvaliseks?

Võime seda RSA -toimingut pidada ka rakendusserveri pipraks. Samuti saab RSA asemel kasutada samal otstarbel HMAC-SHA256, mille võtme suurus on väiksem.

Lühidalt, kui võtit saab kaitsta, on sellel tavapärase lähenemise eest rohkem kaitset.

Seda, mida te kirjeldate, nimetatakse pipraks.

See, mida teete, on lihtsalt RSA kasutamine krüptograafilise räsifunktsioonina. See tõenäoliselt vähendab jõudlust ja muudab teie süsteemi keerukamaks.

Üldiselt installivad inimesed juhusliku numbri otse programmisse sõnasõnalisena. See on ohutu seni, kuni teie lähtekood ja binaar on ohutud. Võite seda kasutada RSA -võtmena, kuid tõhusam viis on lisada pipart samamoodi nagu soola. (vihje on nimes.)

Põhimõtteliselt võtate parooli, lisate soola, lisate pipra ja räsite need kokku.

Rainbow tabelid on sisuliselt optimeeritud sõnastikurünnak, mis põhineb kahel eeldusel:

  • Et kahel erineval rakendusel on sama väljundiga sama sisend, nt. parool & quot; Parool123 & quot; on alati räsitud & quot42f749ade7f9e195bf475f37a44cafcb & quot. See võimaldab ründajal vikerkaartabeli andmebaasi uuesti kasutada mitme sihtmärgi ründamiseks.
  • Et kaks erinevat sissekannet ühe rakenduse piires räsib sama sisendi samale väljundile, nt. kahele erinevale kasutajale parooliga & quot; Parool123 & quot; salvestatakse sama räsi. See võimaldab ründajal arvutada sõnastiku põhjal räsid ja proovida neid kõigi kirjete vastu korraga.

Räsimisprotsessile lisatoimingute lisamine-globaalse "pipra" lisamine, kahekordne räsimine, krüptimine ja seejärel räsimine-rikub tavaliselt esimene eeldus: teie räsimine & quot; Parool123 & quot

Siiski, et murda teine eeldusel peate tegema midagi teisiti iga kande kohta teie rakendusesja seda annab soola lisamine. Ainus viis, kuidas krüpteerimisetapp sama funktsiooni täidaks, on see, kui see juhtus sisaldama oma soola, kusjuures krüptimine on sisuliselt ebaoluline.

Üldiselt on halb mõte oma krüptoalgoritme rullida või neid tahtmatul viisil kombineerida ilma selle aluseks oleva teooria tõeliste teadmisteta, nii et parem on jääda hästi arusaadava räsifunktsiooni juurde (parool + per -kasutaja-sool + rakenduse kohta-pipar).

Nii räsi (nagu SHA-1) kui ka šifr (nagu RSA) on kavandatud nii, et neid ei saa tagasi pöörata. See tähendab, et nende väljundeid (kokkuvõtet või šifreeritud teksti) arvestades ei peaks olema võimalik välja selgitada, milline sisend oli.

Soola väärtus ei muuda räsitud paroolist välja selgitamist, mis parool oli. Paroole on sageli lihtne ära arvata. Sool raskendab ründaja äraarvamist, sest sool on iga kasutaja jaoks erinev. Seega peab ründaja oletama üksikuid kasutajaid (& quotuser 3198721 omab parooli „qwerty”), mitte arvama kogu andmebaasi korraga (& andmebaasi kasutajal on parool „qwerty”).

See suurendab oluliselt eelduste arvu, mis tuleb teha, ja seega aega, mis kulub kasutaja edukaks kompromiteerimiseks, eriti kui räsifunktsioon on arvutuslikult kallis, nagu kõik head parooliräsifunktsioonid. Hästi kavandatud süsteem ei kasutaks kunagi SHA -d, vaid midagi sellist nagu bcrypt, scrypt või PBKDF2.

RSA krüpteerimise lisamine segule ei saavuta iseenesest seda, mida sool teeb. Võib -olla RSA -krüpteerimise korral ei ole & quotqwerty & quot; kokkuvõte & quot Kuid see on ikkagi iga kasutaja jaoks sama ja seega saab ühe oletuse kontrollida kõigi andmebaasi kasutajate suhtes.

Sellest on kasu, sest ründaja peab samuti krüptimisvõtme ohtu seadma ja see on midagi väärt. Tavaliselt saavutatakse see aga kogu kasutajaandmebaasi krüptitud salvestusruumi salvestamisega, selle asemel et iga parooli eraldi enne räsimist krüptida. Üks põhjus: see võimaldab krüptimisvõtme pööramist.

Kuid mõned krüpteerimisskeemid kasutavad initsialiseerimisvektorit (IV), mis on soolaga sarnane, kuna see on juhuslik väärtus. RSA ei kasuta alati IV -d, kuid võiks kasutada, sellisel juhul oleks teie pakutud skeem sisuliselt paroolide soolamine teise nimega.


Sõltuvalt sellest, mida teete, on selleks mitmeid viise tõesti taha. Ühiste veergude puudumisel peate otsustama, kas soovite kasutusele võtta ühise veeru või hankida toote.

Oletame, et teil on kaks tabelit:

Unustage tegelikud veerud, kuna tõenäoliselt on kliendi/tellimuse/osa suhe, sel juhul kasutasin just neid veerge, et illustreerida selle tegemise viise.

Descartes'i toode sobib esimese tabeli iga rea ​​ja teise reaga:

See pole ilmselt see, mida soovite, sest 1000 osa ja 100 kliendi tulemuseks oleks 100 000 rida, kus on palju dubleeritud teavet.

Teise võimalusena võite andmete liitmiseks kasutada liitu, kuigi mitte kõrvuti (peate veenduma, et veerutüübid on kahe valiku vahel ühilduvad, muutes tabeli veerud ühilduvateks või sundides neid ):

Mõnes andmebaasis saate kirjete kõrvuti sobitamiseks kasutada ridade/rownumide veerge või pseudoveerge, näiteks:

Kood oleks umbes selline:

See on ikka veel meeldib Descartes'i toode, kuid kus -klausel piirab ridade kombineerimise tulemuste moodustamiseks (seega ei ole see tegelikult karteesia toode).

Ma ei ole seda SQL-i selle jaoks testinud, kuna see on üks minu valitud DBMS-i piirangutest ja õigustatult ei usu ma, et seda on korralikult läbimõeldud skeemi puhul kunagi vaja. Kuna SQL ei garanteeri andmete tootmise järjekorda, võib sobitamine muutuda iga päringu tegemise ajal, kui teil pole a konkreetne suhe või korraldus klausliga.

Ma arvan, et ideaalne oleks lisada mõlemale tabelile veerg, milles täpsustatakse, milline on seos. Kui tegelikku suhet pole, siis pole sul tõenäoliselt mingit pistmist neid SQL-iga kõrvuti asetada.

Kui soovite, et neid kuvataks aruandes või veebilehel kõrvuti (kaks näidet), on selleks õige tööriist, mis teie aruande või veebilehe koos kahega koos loob sõltumatu SQL -päringud kahe sõltumatu tabeli saamiseks. Näiteks kahe veeruga ruudustik BIRT-is (või Crystal või Jasper), igaühel eraldi andmetabel või HTML-i kaheveeruline tabel (või CSS), igaühel eraldi andmetabel.


Samm 2) Teisendamine

Allikaserverist väljavõetud andmed on toored ja ei ole algsel kujul kasutatavad. Seetõttu tuleb seda puhastada, kaardistada ja muuta. Tegelikult on see peamine samm, kus ETL -protsess lisab väärtust ja muudab andmeid nii, et saab genereerida arusaadavaid BI -aruandeid.

See on üks olulisi ETL -ideid, kus rakendate ekstraheeritud andmetele funktsioonide komplekti. Andmeid, mis ei vaja ümberkujundamist, nimetatakse kui otsene käik või andmeid läbi viia.

Teisendamisetapis saate andmetega kohandatud toiminguid teha. Näiteks kui kasutaja soovib müügisummat, mida andmebaasis pole. Või kui tabeli ees- ja perekonnanimi on erinevates veergudes. Neid on võimalik enne laadimist ühendada. Andmete integreerimise probleemid

  1. Sama isiku erinevad kirjapildid nagu Jon, John jne.
  2. Ettevõtte nime tähistamiseks on mitu võimalust, näiteks Google, Google Inc.
  3. Erinevate nimede kasutamine, nagu Cleaveland, Cleveland.
  4. Võib juhtuda, et sama kliendi erinevad rakendused genereerivad erinevaid kontonumbreid.
  5. Mõne andmete puhul jäävad nõutavad failid tühjaks
  6. POS -is käsitsi sisestamiseks sobimatu toode võib põhjustada vigu.
  • Filtreerimine - valige ainult teatud veerud, mida soovite laadida
  • Reeglite ja otsingutabelite kasutamine andmete standardimiseks
  • Märgikomplekti teisendamine ja kodeerimine
  • Mõõtühikute, näiteks kuupäeva ja kellaaja teisendamine, valuuta teisendamine, numbriline teisendamine jne.
  • Andmete läve valideerimise kontroll. Näiteks ei tohi vanus olla pikem kui kaks numbrit.
  • Andmevoo valideerimine peatamisalalt vahetabelitesse.
  • Kohustuslikud väljad ei tohi tühjaks jääda.
  • Puhastamine (näiteks NULL -i kaardistamine väärtuseks 0 või sugu Mees väärtuseks "M" ja naissoost "F" jne)
  • Jagage veerg mitmeks ja ühendage mitu veergu üheks veeruks.
  • Ridade ja veergude ülevõtmine,
  • Andmete ühendamiseks kasutage otsinguid
  • Mis tahes keeruka andmete valideerimise kasutamine (nt kui rea kaks esimest veergu on tühjad, lükkab see rea automaatselt töötlemisest tagasi)

Töö Kuduga Integreeritud Hive Metastore'iga

Alates versioonist Kudu 1.10 ja Impala 3.3 toetab Impala Hudu Metastore'i (HMS) integreeritud Kudu teenuseid. Kudu Hive Metastore integreerimise kohta leiate lisateavet HMS -i integreerimise dokumentatsioonist.

  • Kui Kudu on Hive Metastore'iga integreeritud, tuleb Impala konfigureerida kasutama sama HMS -i nagu Kudu.
  • Kuna Kudu tabelite ja väliste tabelite vahel ei pruugi olla üks-ühele kaardistamist, sünkroonitakse automaatselt ainult sisetabeleid.
  • Kui loote tabeli Kudu, loob Kudu selle tabeli jaoks sisemise tabelitüübiga HMS -kirje.
  • Kui Kudu teenus on integreeritud HMS -iga, luuakse sisemised tabelikirjed HMS -is automaatselt, kui tabelid luuakse Kudu ilma Impalata. Nende tabelite juurde pääsemiseks Impala kaudu käivitage käsk INVALIDATE METADATA, nii et Impala võtab vastu uusimad metaandmed.

Meie ajaveeb

Ühel meie kliendil oli Linuxis Java-põhine rakenduste virn, mis ühendati Windowsi SQL Serveri päris vana versiooniga. Tahtsime kogu süsteemi üle viia ühtsemale ühtsele virnale, millega arendajad on tõhusad ja mis on praegune, nii et see saab regulaarselt värskendusi.

Otsustasime andmebaasi üle viia SQL Serverist Linuxi PostgreSQL -i, kuna andmebaasi teisaldamine, ehkki mitte päris kiire ega lihtne, oli siiski palju lihtsam kui rakenduse .NET/C# teisaldamine. Taotluse ümberkirjutamine oleks võtnud palju kauem aega, olnud ettevõttele palju riskantsem ja maksnud palju rohkem.

Katsetasin mõningaid lähenemisviise migratsioonile ja otsustasin minna skeemide migreerimise protsessi ja seejärel andmete migreerimise lähenemisviisiga, millele viidatakse Postgresi wikis. Käime samm -sammult läbi rändamisprotsessi.

Skeemi ränne

Skeemi teisendamiseks tuleb eksportida SQL Serveri andmebaasi tabelite ja vaadete skeem. Järgmised sammud näitavad teile, kuidas skeemi eksportida.

Ekspordi SQL Serveri andmebaasiskeem

SQL Management Studio paremklõpsake andmebaasi ja valige Tasks → Generate Scripts.

Valige „Valige konkreetsed andmebaasi objektid” ja kontrollige ainult oma rakendusskeemide tabeleid (tühjendage dbo -skeemi objektid ja muud, kui neid on).

Veenduge, et täpsemate suvandite suvand „Skripti andmetüübid” on seatud väärtusele „Ainult skeem”.

Vaadake üle ja salvestage andmebaasi tabelite skeemifailid tables.sql. Tabelite.sql Linuxi serverisse ülekandmiseks kasutage WinSCP -d ja avaliku võtme autentimist.

Teisendage skeem SQL Serverist Postgresiks

sqlserver2pgsql on hea Perlis kirjutatud migratsioonitööriist SQL Serveri skeemide teisendamiseks Postgres -skeemideks. Kloonige see GitHubist oma andmebaasiserverisse ja täitke tabelite skeemi teisendamiseks järgmised käsud:

Teisendatud skeem on saadaval tabelites-enne.sql ja piirangute loomiseks mõeldud avaldused on tabelites-pärast.sql, et neid pärast andmete üleviimist täita. Vaadake lihtsalt üle tabelid-unsure.sql ja tehke vajalikke toiminguid, kui mõni tabel pole tööriista abil teisendatud. Kui soovite Postgresi skeeminimesid muuta, saate need nüüd SQL -failis ümber nimetada, näiteks:

Postgresi andmebaasi seadistamine:

Loodetavasti on teie Postgresi andmebaas teie serveris valmis. Kui ei, installige oma serverisse Postgresi uusim versioon. Seejärel looge kasutajale antud õigustega Postgresi kasutaja ja andmebaas.

Kui andmebaas ja kasutajakonto on valmis, laadige tabelite loomiseks teisendatud tabelid-enne.sql skript oma andmebaasi. Siis saame andmete migreerimisega edasi liikuda.

Andmete migreerimine

Andmete teisaldamine andmete tühjendamise ja taastamise kaudu muudab protsessi tülikaks, kuna sellel on tohutu käsitsi protsess, andmetüüpide mittevastavus, kuupäevavormingud jne. Mõistlik on kasutada olemasolevaid stabiilseid süsteeme selle asemel, et sellesse rohkem aega investeerida.

Pentaho andmete integreerimine

Pentaho pakub erinevaid stabiilseid andmekeskseid tooteid. Pentaho andmete integreerimine (PDI) on ETL -tööriist, mis pakub suurepärast tuge andmete teisaldamiseks erinevate andmebaaside vahel ilma käsitsi sekkumata. PDI kogukonna väljaanne on meie ülesande täitmiseks piisavalt hea. See peab looma ühenduse nii lähte- kui sihtandmebaasidega. Seejärel teeb ta ülejäänud töö andmete üleviimisel SQL -serverist Postgresi andmebaasi, täites PDI -töö.

Laadige alla Pentaho Data Integration Community Edition ja pakkige tarball oma kohalikus keskkonnas välja. Vaata:

Käivitage spoon.sh, et avada GUI rakendus oma kohalikus keskkonnas.

Looge PDI -s ühendusi nii SQL Serveri kui ka Postgresi andmebaasidega.

2. Looge lähteandmebaasi ühendus.

Klõpsake vasakul külgribal nuppu Vaade → Paremklõpsake „Andmebaasiühendused” → Valige Uus → Esitage SQL Serveri ühenduse üksikasjad

3. Looge sihtkoha andmebaasi ühendus.

Klõpsake vasakul külgribal nuppu Vaade → Paremklõpsake nuppu „Andmebaasiühendused” → Valige Uus → Esitage Postgresi ühenduse üksikasjad

4. Valige viisardi menüüst Kopeeri tabelite viisard.

Tööriistad → Nõustaja → Kopeeri tabeleid

5. Valige andmebaasid Allikas ja Sihtkoht.

6. Valige migreeritavate tabelite loend.

7. Liikuge edasi, et valida töö- ja teisendusfailide tee.

8. Teisendused loodi andmete kopeerimiseks lähteandmest andmebaasi.

9. Kopeerige Pentaho Data Integration tarbekott ja teisendustega töö Postgresi serverisse, et vältida võrgu latentsust andmete migreerimisel.

10. Kontrollige Postgresi serverit SQL Serveri andmebaasi juurdepääsule (põhineb teie arhitektuuri kujundusel).

Rakendusserveri kaudu SQL Serveriga ühenduse loomiseks looge SSH -tunnel.

PDI töö teostamine

Käivitage PDI -töö, kasutades andmebaasiserveris Pentaho köögiutiliiti. Lisage veekeetja konfiguratsioon, et vältida Pentaho tühjade väärtuste käsitlemist NULL -väärtustena, mis ei mõjuta NOT NULL -piiranguid.

Kinnitage andmebaasiserverite ühenduste IP-aadress ja täitke töö PDI-tööde käsurea utiliidi Kitchen.sh abil.

Andmete migratsiooniprotsess võttis 10 GB andmete kopeerimiseks SQL Serverist Postgresi andmebaasi võrgu kaudu aega umbes 30 minutit.

Suure tabeli kopeerimisel tekkis tühikuprobleem ja saime sellega hakkama, vähendades vastava tabeli teisendusfaili ridade arvu. Siin on arutelu probleemist.

Kui andmete üleviimine on lõpule viidud, täitke piirangute rakendamiseks tabeli-after.sql skeemi- migratsiooni skript.

Vaadete teisaldamine

Skeemi views.sql teisendamiseks järgige samu samme. Paremklõpsake andmebaasi ja klõpsake Ülesanded → Loo skript → Ekspordi ainult vaateid.

Migreerimisfunktsioonid

Funktsioonide migreerimine nõuab nii SQL Serveri kui ka Postgresi oskusi ja süntaksiteadlikkust. Funktsioonid tuleb pärast Postgresi jaoks ümberkirjutamist korralikult kinnitada ja testida. Asetage kõik ümberkirjutatud funktsioonid postgres-function.sql-sse ja laadige migratsiooniprotsessi käigus andmebaasi.

Kõige tavalisemad vead

VIGA: süntaksiviga & quot; või selle lähedal
Eemaldage SQL Serveri nurksulud, mis tsiteerivad veergude ja tabelite nimesid.
VALI [kasutaja_id] → VALI kasutajatunnus

VIGA: operaatorit pole olemas: märk varieeruv = täisarv
Tüüp casting võrdluse alusel
JA veeru_nimi (1, -1) → JA veeru_nimi (Ƈ ', '-1 ')

VIGA: süntaksiviga & quot; või selle lähedal
Andmetüübi teisendamine
teisendada (varchar (10), veeru_nimi) → veeru_nimi :: tekst

VIGA: veeru & quotuser_id & quot; seose & quotuser & quot & quot; ei ole olemas
Segatähtedega veerunimedel ei ole topelt jutumärke (kui neid ei kasutata kõikjal)
INSERT INTO user (& quotuser_id & quot) VALUES (1) → INSERT INTO user (user_id) VALUES (1)

VIGA: veergu & quotmm & quot ei ole olemas
DATEADD → INTERVAL
DATEADD (mm, -6, GETDATE ()) → CURRENT_DATE - INTERVAL ƌ kuud '

VIGA: veergu "varchar" pole olemas
Teisenda kuupäev USA vormingusse
teisendada (varchar, tc_agreed_dt, 101) → to_char (CURRENT_TIMESTAMP, 'MM/DD/YYYY ')

Tulemus

Pärast migratsiooni tegime rakenduses ulatuslikke teste ja optimeerisime päringuid erinevates moodulites. Samuti viisime läbi uue ja vana süsteemi kiiruse ja jõudluse võrdlustesti. Üleminek tasus end paljutõotava tulemusega, milleks oli rakenduse üldise toimivuse keskmine kasv 40%. See peegeldab uuemat serveririistvara ja päringute optimeerimise tööd, mitte ainult Postgresile üleminekut.


Stringi saate luua kataloogivaadete abil, näiteks:

Muidugi on potentsiaalseid hankimisi, näiteks kui nendel tabelitel on välisvõti seosed, peate need kõigepealt loobuma või korraldama väljundi tabelite teatud järjekorras mahajätmiseks.

Tabelite loendi hankimiseks kasutage järgmist:

Käivitasin selle päringu ja kleepisin tulemused tagasi päringuaknasse, et kõik tabelid maha jätta:

Kui soovite kustutada kõik tabelid, kuid jätta need, mille nimed algavad tähtedega A, B, C või D:

See võimaldab kustutada palju suurema arvu tabeleid.

Mulle meeldib see, mille ma kirjutasin:

Seda saab teha, kasutades käivitamist järgmiselt:

Käivitage päringu kohal ja salvestage tulemused csv -faili. Seejärel avage see CSV märkmikus. Seejärel tehke klahvikombinatsioon Ctrl+H, et asendada skeem DROP TABLE SCHEMA -ga, mis annab teile kõik loobumispäringud, kopeerige ja kleepige see suur SQL -i oma SQL -i tööriista ja käivitage


SQLite esmane võti ja ridade tabel

Kui loote tabeli ilma suvandita WITHOUT ROWID määramata, lisab SQLite kaudse veeru rowid, mis salvestab 64-bitise allkirjaga täisarvu. Veerg rowid on võti, mis tuvastab tabeli read unikaalselt. Tabeleid, millel on ridade veerud, nimetatakse ridatabeliteks.

Kui tabelis on esmane võti, mis koosneb ühest veerust ja see veerg on määratletud kui INTEGER, muutub see primaarvõtme veerg teise nimega ridade veeru jaoks.

Pange tähele, et kui määrate primaarvõtme veerule mõne muu täisarvu tüübi, näiteks BIGINT ja UNSIGNED INT, ei ole see veerg ridade veeru varjunimi.

Kuna rowid tabel korraldab oma andmed B-puuna, on rowid tabeli andmete päring ja sortimine väga kiire. See on kiirem kui primaarvõtme kasutamine, mis ei ole rida alias.

Veel üks oluline märkus on see, et kui deklareerite veeru, milles on klausel INTEGER ja PRIMARY KEY DESC, ei muutu see veerg ridade veeru varjunimeks:


Andmete kokkuvõtmine ja rühmitamine SQL -is

Sa võid kasutada DISTINCT dubleerivate väärtuste kõrvaldamiseks funktsioonide koondarvutustes vt “Korduvate ridade kõrvaldamine DISTINCT” 4. peatükis. Koondfunktsiooni üldine süntaks on järgmine:

agg_func on MIN, MAX, SUM, AVGvõi COUNT. väljend on veeru nimi, sõnasõnaline või väljend. KÕIK rakendab liitfunktsiooni kõikidele väärtustele ja DISTINCT täpsustab, et arvesse võetakse iga kordumatut väärtust. KÕIK on vaikimisi ja seda näeb praktikas harva.

Koos SUM (), AVG ()ja COUNT (väljend), DISTINCT kõrvaldab dubleerivad väärtused enne summa, keskmise või arvu arvutamist. DISTINCT ei ole tähenduslik koos MIN () ja MAX () saate seda kasutada, kuid see ei muutnud tulemust. Sa ei saa kasutada DISTINCT koos COUNT (*).

Erinevate väärtuste komplekti summa arvutamiseks toimige järgmiselt.

väljend on veeru nimi, sõnasõnaline või numbriline avaldis. Tulemuse andmetüüp on vähemalt sama täpne kui kõige täpsem andmetüüp, mida kasutatakse väljend

Erinevate väärtuste komplekti keskmise arvutamiseks toimige järgmiselt.

väljend on veeru nimi, sõnasõnaline või numbriline avaldis. Tulemuse andmetüüp on vähemalt sama täpne kui kõige täpsem andmetüüp, mida kasutatakse väljend

Eri nulliväliste ridade loendamiseks tehke järgmist.

väljend on veeru nimi, sõnasõnaline või väljend. Tulemuseks on täisarv nullist suurem või sellega võrdne.

Päringud sisse Loetelu 6.6 tagastab raamatute hindade arvu, summa ja keskmise. Mitte-DISTINCT ja DISTINCT tulemuseks Joonis 6.6 erinevad, sest DISTINCT tulemused kõrvaldavad arvutustest 12,99 ja 19,95 dollari hindade duplikaadid.

Loetelu 6.6 Mõned DISTINCT koondpäringud. Vaadake tulemusi joonisel 6.6.

Joonis 6.6 Loetlemise tulemused 6.6.

DISTINCT sees VALI klausel jaDISTINCT koondfunktsioonis ärge tagastage sama tulemust.

Kolm päringut Loetelu 6.7 loendage tabelis autori ID -dpealkiri_autorid. Joonis 6.7 näitab tulemusi. Esimene päring loeb kõik tabelis olevad autori ID -d. Teine päring tagastab sama tulemuse nagu esimene päring, sest COUNT () on juba teinud oma töö ja tagastanud ühe rea väärtuse varem DISTINCT rakendatakse. Kolmandas päringus DISTINCT rakendatakse autori ID -dele varem COUNT () hakkab lugema.

Loetelu 6.7 DISTINCT sees VALI klausel ja DISTINCT koondfunktsioonis erinevad tähenduses. Vaadake tulemusi joonisel 6.7.

Joonis 6.7 Loetlemise tulemused 6.7.

Segamine mitte-DISTINCT ja DISTINCT agregaadid samas VALI klausel võib anda eksitavaid tulemusi.

Neli päringut Loetelu 6.8 (järgmine lehekülg) näitavad nelja kombinatsiooni mitte-DISTINCT ja DISTINCT summad ja loeb. Neljast tulemusest aastal Joonis 6.8 (järgmisel lehel), ainult esimene tulemus (nr DISTINCTs) ja lõpptulemus (kõik DISTINCTs) on matemaatiliselt järjepidevad, mida saate kontrollida AVG (hind) ja AVG (DISTINCTprice). Teises ja kolmandas päringus (segatud mitte-DISTINCTs ja DISTINCTs), ei saa te kehtivat keskmist arvutada, jagades summa loendusega.

Kirje 6.8 Mitte segamineDISTINCT ja DISTINCT agregaadid samas VALI klausel võib anda eksitavaid tulemusi. Vaadake tulemusi joonisel 6.8.

Joonis 6.8 Loetlemise tulemused 6.8.

Microsofti juurdepääs ei toeta DISTINCT koondfunktsioonid. See väide on näiteks Accessis ebaseaduslik:

Kuid saate seda selle alampäringuga kopeerida (vaadake 8. peatüki nõuandeid “Alampäringute kasutamine veeruväljenditena ”):

See Accessi lahendus ei võimalda teil segada mitte-DISTINCT ja DISTINCT agregaate, aga nagu loendi 6.8 teises ja kolmandas päringus.

Sisse Microsofti SQL Server, kui kasutate DISTINCT, väljend peab olema ainult veeru nimi. See ei saa sisaldada aritmeetilist avaldist:

MySQL toetab COUNT (DISTINCT väljend) kuid mitte SUMMA (DISTINCT väljend) ja AVG (DISTINCT väljend). Kirjed 6.6 ja 6.8 ei jookse MySQL -is.