Kodulehed
[385] - Andmebaasid II (ITI0207) (sügis 2023)
Esiletöstetud Kiirvalik
Lisainfo Kõige olulisemate tegevuste kiirvalik. Failide saatmiseks valige Vastamine alt sobiv ülesanne.
Üldist
Materjalid
LisainfoMaterjalide kataloogid.
Värvilised mummud tähistavad hinnangulist kataloogide lugemise vajadust. Roheline - suurim, kollane - keskmine, punane või mummuta - väikseim
Isiklik
Lisainfo Info ainult Sulle - teised kasutajad seda ei näe
Abi
Lisainfo Võimalus küsida õppejõult abi (nagu foorum, kus saab küsida küsimusi ja kommenteerida vastuseid)
Mitmesugust
Abi / Kasutajatugi / Iseseisva töö projekt

Avalikud küsimused ja vastused:

Küsimuste teemade nimekiri

Anonüümne (26.10.2023 17:16):
Millised on kontrollpäringute süsteemile sarnased süsteemid?
Vastus (04.11.2023 10:43): Kontrollpäringute süsteem võimaldab andmebaasides sarnast analüüsi kui rakendustes programmid SonarQube ja PVS-Studio. Siit saate näitena lugeda kolme avatud lähtekoodiga andmebaasisüsteemi (PostgreSQL, MySQL, Firebird) koodi kvaliteedi võrdlust, milleks samuti kasutati lähtekoodi staatilist analüüsimist. Kontrollpäringutega ei analüüsita mitte otse lähtekoodi, vaid selle käivitamise tulemust (loodud andmebaasiobjekte). Tegemist ei ole siiski programmi dünaamilise analüüsiga, sest dünaamilise analüüsi korral käivitatakse programm erinevate sisenditega ja jälgitakse selle käitumist/väljundit. Andmebaaside korral tähendaks see erinevate päringute ja andmemuudatuste tegemist ning näiteks täitmisaja ning täitmiseks kasutatud plaanide jälgimist/uurimist.

Sarnasteks programmideks on ka linterid, mis samuti võimaldavad koodi staatiliselt analüüsida ja leida süntaksivigu, turvaprobleeme, kodeerimise standarditest kõrvalekaldeid ja koodi halbade lõhnade esinemisi. On olemas mitmeid SQL koodi staatilise analüüsi vahendeid sh lintereid, mille nimekirja leiab SIIT. Linteriga kontrollitakse lauset enne käivitamist. Kontrollpäringud analüüsivad lausete täitmise tulemusel tekkinud andmebaasiobjekte. Kontrollpäringutega pole põhimõtteliselt võimalik kontrollida näiteks seda, kas lausetes on võtmesõnades suur- ja väiketähtede kasutamise stiil ühesugune või kas reavahetuste, tühikute ja taandridade kasutamine on sobiv. Küll aga saab selliseid asju kontrollida linteriga. Kontrollpäringute puhul tuleb ka arvestada sellega, et andmebaasisüsteem võib käivitatud lauset sisemiselt ümber kirjutada. Näiteks, oletame, et käivitan PostgreSQL andmebaasis lause:

CREATE VIEW V_EMP_5 AS SELECT * FROM EMP ORDER BY EMPNO FETCH FIRST 5 ROWS ONLY;

Andmebaasi süsteemikataloogis salvestatakse vaate nimi v_emp_5 (väiketähtedega), millel on järgmine alampäring:

 SELECT empno,
    ename,
    job,
    mgr,
    hiredate,
    sal,
    comm,
    username,
    password,
    deptno
   FROM emp
  ORDER BY empno
 LIMIT 5;

Algse lause probleemid, mida kontrollpäringud ei leia:
  • Lause oli läbivalt suurtähtedega (sh nimed).
  • Lause oli ühes reas.
  • Lauses oli SELECT *
  • Lausest puudusid OR REPLACE ja IF NOT EXISTS
  • Lauses polnud näidatud sorteerimise suunda (ASC)
Süsteemikataloogis salvestatud lauses kasutatakse vana süntaksi LIMIT 5, kuigi algses lauses oli kasutusel uus süntaks (FETCH FIRST 5 ROWS ONLY).

Leidub programme, mis keskenduvad SQLi analüüsile.

Üks populaarsematest SQL linteritest tundub olevat SQLFluff. Probleemid, mille mitteesinemist see tagada aitab, ei ühti üldiselt probleemidega, mida kontrollpäringutega kontrollitakse. SQLFluff linteriga saab põhiliselt kontrollida, kas SELECT lausete kirjapilt on "ilus" ja reeglipärane. Kokkulangevus on paari reegli osas (nt vältige piiritletud identifikaatoreid ja ärge kasutage võtmesõnu identifikaatoritena). Kuna päringute abil kontrollitakse üle 500 reegli, siis on kokkulangevate reeglite hulk väga pisike.

dbcritic jõustab viis reeglit seoses tabelite struktuuriga. Nendest üks nõuab seda, et täisarvu tüüpi primaarvõtme veerud peaksid olema BIGINT tüüpi. Sellega ei tahaks nõus olla, sest täpsem andmetüübi valik annab andmebaasi skeemi vaatlejale infot andmete kohta (see on nagu osa andmebaasi dokumentatsioonist) ning aitab ka kokku hoida salvestusruumi.

Vahend holistic teostab SQL lausete staatilist analüüsi ja suudab leida nendes probleeme 1300 reegli alusel. Nende probleemide parandamine peaks parandama andmebaasi struktuuri, andmekäitluse operatsioonide jõudlust ning isegi turvalisust. 28.10.2023 seisuga on toetatud PostgreSQL, kuid plaanis on lisada tugi ka teistele andmebaasisüsteemidele nagu Snowflake ja MySQL. Soovija saab sisselogimise järel vahendit katsetada. Uurisin selle vahendiga neid lauseid. holistic leidis 7 erinevat tüüpi vigu ja kokku 12 erinevat probleemi esinemist. Kontrollpäringud leidsid 64 erinevat tüüpi vigu. holisticu soovitus asendada igas olukorras VARCHAR(n) tüüpi veerg TEXT tüüpi veeruga koos CHECK kitsendusega maksimaalsele väljapikkusele tundub liiga ülepingutatud.

sqlcheck kontrollib erinevate Karwini raamatus välja toodud andmebaasi disaini antimustrite esinemist koodis. Päringute antimustrite all on seal rohkem probleeme kui Karwini raamat välja toob. Ka kontrollpäringud sisaldavad selliseid kontrolle. Mis puudutab päringuid, siis kontrollpäringutes saab kontrollida vaadete ning hetktõmmiste alampäringuid ja rutiinides sisalduvaid päringuid. Kontrollpäringud kasutavad selleks mustripõhist otsingut regulaaravaldiste abil.

Samas leidub ka programme, mis võimaldavad kontrollida erinevates keeltes kirjutatud koodi. Mõni nendest vahenditest realiseerib oma kontrollid ise. Näiteks vahend deepsource suudab kontrollida erinevates allikates olevat erinevates keeltes kirjutatud koodi. Toetatud keelte hulgas on ka SQL. Põhiliselt kontrollitakse stiilireeglitest kinnipidamist. Paljud kontrollitavad reeglid on seotud SELECT lausetega. Samas on ka selliseid programme, nagu MegaLinter, mis koondavad kokku erinevate osapoolte loodud lintereid.

Kokkuvõte: SQL linterid ja kontrollpäringud täiendavad üksteis. Suurem osa linteri reeglitest on selle kohta, mida kontrollpäringutega ei saa kontrollida. Väiksem osa reeglitest langeb kokku kontrollpäringute reeglitega.

Hinda vastust:

Keskmine hinne : Pole veel hinnanguid!