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.