{"id":988,"date":"2023-06-08T12:24:42","date_gmt":"2023-06-08T12:24:42","guid":{"rendered":"https:\/\/tarkvara.thkit.ee\/veeb\/?page_id=988"},"modified":"2023-06-08T12:32:34","modified_gmt":"2023-06-08T12:32:34","slug":"piirangud","status":"publish","type":"page","link":"https:\/\/tarkvara.thkit.ee\/veeb\/piirangud\/","title":{"rendered":"Piirangud"},"content":{"rendered":"\n<p>Kuigi enamikes olukordades on andmet\u00fc\u00fcbist tulenev piirang t\u00e4iesti piisav, on palju olukordi, kus oleks soov t\u00e4psemalt m\u00e4\u00e4ratleda andmete iseloom.<\/p>\n\n\n\n<p>Andmetele piirangute seadmisel tulevad appi konstraandid e. piirangud.<\/p>\n\n\n\n<p>Piiranguid on v\u00f5imalik seada nii \u00fchele v\u00e4ljale kui ka kirjele.<\/p>\n\n\n\n<p>\u00dchele v\u00e4ljale e. veerule seatavad piirangud on enamasti kitsendused andmet\u00fc\u00fcbile. N\u00e4iteks oleme loonud aastaarvude hoidmiseks<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nALTER TABLE dbo.Auto_tbl \nADD CONSTRAINT CK_Auto_Aasta \n\tCHECK (Aasta BETWEEN 1900 AND YEAR(GETDATE()))\n<\/pre><\/div>\n\n\n<p>Kirje piirangutega kirjeldatakse seoseid samal real asuvate v\u00e4ljade vahel. N\u00e4iteks kui me soovime hoida andmebaasis laste juures \u00f5pingute alguse ja l\u00f5pu aega, saaksime seada piirangu, mis \u00fctleks, et algus peab olema enne l\u00f5ppu.<\/p>\n\n\n\n<p>Konstraantide rakendamine on v\u00e4ga kiire ning neist on abi nii andmete sisestamisel andme\u00fchtsuse tagamisel kui ka p\u00e4ringute tegemisel.<\/p>\n\n\n\n<p>Konstraante on v\u00f5imalik salvestada andmebaasi ka eraldiseisvate objektide e. reeglitena.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nCREATE RULE Aasta1900KuniTana\nAS @Aasta BETWEEN 1900 AND YEAR(GETDATE())\n<\/pre><\/div>\n\n\n<p>Sellisel kujul reegleid on v\u00f5imalik rakendada tabeli v\u00e4ljadele otseselt kui ka l\u00e4bi oma andmet\u00fc\u00fcpide.<\/p>\n\n\n\n<p>Reeglite kleepimiseks andmet\u00fc\u00fcbi k\u00fclge tuleb kasutada salvestatud protseduuri sp_bindrule:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nEXEC sys.sp_bindrule \n\t\t@rulename=N&#039;&#x5B;dbo].&#x5B;Aasta1900KuniTana]&#039;\n\t\t, @objname=N&#039;&#x5B;dbo].&#x5B;Aasta]&#039; \n<\/pre><\/div>\n\n\n<h5 class=\"wp-block-heading\">Indeksid<\/h5>\n\n\n\n<p>Esmaj\u00e4rjekorras on indeksid m\u00f5eldud andmete otsingu kiirendamiseks. Indekseerimist tasub kaaluda k\u00f5igil v\u00e4ljadel mida kasutatakse WHERE ja GROUP BY lauseosas ning millel rakendatakse agregaatfunktsioone.<\/p>\n\n\n\n<p>Teiseks saab indeksitega peale suruda andmete unikaalsust kas \u00fchel v\u00e4ljal v\u00f5i v\u00e4ljade kombinatsioonis. Sisuliselt on unikaalne indeks ka juba varem kasutatud primaarv\u00f5ti.<\/p>\n\n\n\n<p>Indekseid saab luua CREATE INDEX lausega. N\u00e4iteks loome unikaalse indeksi auto registrinumbrite tarbeks:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nCREATE UNIQUE NONCLUSTERED INDEX IX_Auto_RegNr \nON dbo.Auto_tbl ( RegNr )\n<\/pre><\/div>\n\n\n<p>V\u00f5i indekseerime sorteerimise lihtsustamiseks laste nimed<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nCREATE NONCLUSTERED INDEX IX_Laps_Nimi \nON dbo.Laps_tbl ( Nimi )\n<\/pre><\/div>\n\n\n<p>Miinuspoolelt v\u00f5ib v\u00e4lja tuua, et igasugused muudatused indekseeritud v\u00e4ljadel toovad endaga kaasa muudatused indeksites ning seega muutuvad muutmistegevused (lisamine, muutmine, kustutamine) aeglasemaks. Samas aitavad indeksid kaasa muudetavate kirjete leidmisel.<\/p>\n\n\n\n<p>Alates SQL Server 2000 on v\u00f5imalik tekitada indekseid ka vaadetele!<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Ajutiste tabelite kasutamine<\/strong><\/p>\n\n\n\n<p>Kirjutades keerukamaid programme on aeg-ajalt kasulik mingid vahetulemused meelde j\u00e4tta. \u00dcks v\u00f5imalus selleks on ajutiste tabelite kasutamine.<\/p>\n\n\n\n<p>Ajutised tabelid on tabelid, mida p\u00fcsivalt pole vaja, mis on vajalikud vaid \u00fche konkreetse skripti t\u00e4itmiseks. Selliseid tabeleid ei hoita enamasti samas kohas p\u00e4ris andmetega. SQL Serveril on sedasorti andmete tarbeks eraldi andmebaas tempdb. Selleks, et tabel l\u00e4heks ajutisse andmebaasi tuleb tabeli nime ette panna trellid #.<\/p>\n\n\n\n<p>Kui on soov salvestada nt autode loetelu ajutisse tabelisse saame seda teha lihtsa SELECT lausega, millele lisame INTO v\u00f5tmes\u00f5na:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nSELECT *\nINTO #Autod\nFROM dbo.Auto_tbl\nSELECT *\nFROM #Autod\n<\/pre><\/div>\n\n\n<p>Sellega oleme tekitanud ajutisse andmebaasi koopia autode tabelist. \u00dche trelliga t\u00e4histatud ajutised tabelid on sessioonip\u00f5hised e. kui katkeb serveriga \u00fchendus, mille kaudu see tabel tehti, kustutatakse tabel automaatselt.<\/p>\n\n\n\n<p>On v\u00f5imalik luua ka globaalseid ajutisi tabeleid. Selleks tuleb nime ette panna kahed trellid ##. Sellised tabelid kustuvad, kui katkeb viimane seda tabelit kasutav \u00fchendus.<\/p>\n\n\n\n<p>Ajutised tabelid on kasulikud keerukate arvutustulemuste hoidmiseks v\u00f5i keerulistest JOIN lausetest saadud tulemuste hoidmiseks edasiseks t\u00f6\u00f6tlemiseks.<\/p>\n\n\n\n<p>Samas tuleb arvestada, et ajutistel tabelitel pole enam mingit seost l\u00e4heandmetega e. sealt otsimiseks ei saa kasutada indekseid<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Ts\u00fckkel, valik<\/h4>\n\n\n\n<p>Transact-SQL\u00b4il on kasutada mitmedki programmeerimiskeelele omased tunnused, kaasa arvatud muutujad, ts\u00fckkel ja valik. Nende tutvustamiseks v\u00e4ike koodil\u00f5ik. Koodil\u00f5iku saab eraldi k\u00e4ivitades proovida. P\u00e4rast, kui on veendutud, et l\u00f5ik t\u00f6\u00f6tab, saab selle protseduuriks vormistada, kirjutades ette CREATE PROCEDURE protseduurinimi AS.<\/p>\n\n\n\n<p>Siinses n\u00e4ites luuakse k\u00f5igepealt kaks muutujat ning m\u00e4\u00e4ratakse nende t\u00fc\u00fcbid. Nagu n\u00e4ha, on muutujatel @-m\u00e4rk ees.<\/p>\n\n\n\n<p>DECLARE @i INT, @s as VARCHAR(max)<\/p>\n\n\n\n<p>Edasi saavad muutujad enesele v\u00e4\u00e4rtused<\/p>\n\n\n\n<p>SET @i=1<\/p>\n\n\n\n<p>SET @s=&#8221;<\/p>\n\n\n\n<p>Ts\u00fckkel toimib sarnaselt nagu m\u00f5nes teiseski keeles. Ts\u00fckli keha piiratakse BEGIN ja ENDiga.<\/p>\n\n\n\n<p>WHILE(@i&lt;=10) BEGIN<\/p>\n\n\n\n<p>Sama kehtib valiku kohta. Nagu n\u00e4ha juhul, kui pole tegemist esimese l\u00e4bimiskorraga, lisatakse olemasoleva teksti l\u00f5ppu koma. IF-ile saab soovi korral lisada ka ELSE-osa.<\/p>\n\n\n\n<p>IF (@i&gt;1) BEGIN<\/p>\n\n\n\n<p>SET @s=@s+&#8217;,&#8217;<\/p>\n\n\n\n<p>END<\/p>\n\n\n\n<p>Edasi lisandub teksti l\u00f5ppu ts\u00fckli l\u00e4bimiskorra number<\/p>\n\n\n\n<p>SET @s=@s+str(@i)<\/p>\n\n\n\n<p>Ning et ts\u00fckkel l\u00f5putult kordama ei j\u00e4\u00e4ks, tuleb j\u00e4rgmise sammuna hoolitseda, et loenduri v\u00e4\u00e4rtus suureneks.<\/p>\n\n\n\n<p>SET @i=@i+1<\/p>\n\n\n\n<p>END<\/p>\n\n\n\n<p>L\u00f5puks v\u00f5ib SELECT-k\u00e4skluse abil saadud tulemuse p\u00e4ringu k\u00e4ivitajale n\u00e4htavaks teha. Edasi saab sellega k\u00e4ituda juba nagu tavalise p\u00e4ringu vastusega.<\/p>\n\n\n\n<p>SELECT @s as tulemus<\/p>\n\n\n\n<p>Edasi kood tervikuna vaatamiseks<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nCREATE PROCEDURE arvujada AS\nDECLARE @i INT, @s as VARCHAR(max)\nSET @i=1\nSET @s=&#039;&#039;\nWHILE(@i&lt;=10) BEGIN\n  IF (@i&gt;1) BEGIN\n     SET @s=@s+&#039;,&#039;\n  END\n  SET @s=@s+str(@i)\n  SET @i=@i+1\nEND\nSELECT @s as tulemus\n<\/pre><\/div>\n\n\n<p>ja v\u00e4ljastatud tulemus:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nEXEC arvujada\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"353\" height=\"217\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/06\/image-34.png\" alt=\"\" class=\"wp-image-1005\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/06\/image-34.png 353w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/06\/image-34-300x184.png 300w\" sizes=\"auto, (max-width: 353px) 100vw, 353px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Muutujasse lugemine<\/h4>\n\n\n\n<p>Tahtes \u00fcht v\u00e4\u00e4rtust p\u00e4ringust k\u00e4tte saada, saab selle omistada otse SELECT-lause juures.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nDECLARE @suurimpikkus AS INT\nSELECT @suurimpikkus=MAX(pikkus) FROM lapsed\nPRINT @suurimpikkus\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"416\" height=\"172\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/06\/image-35.png\" alt=\"\" class=\"wp-image-1009\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/06\/image-35.png 416w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/06\/image-35-300x124.png 300w\" sizes=\"auto, (max-width: 416px) 100vw, 416px\" \/><\/figure>\n\n\n\n<p>Samuti v\u00f5ib muutujaid olla rohkem. Lihtsalt iga SELECT\u00b4iga k\u00fcsitud tulba ette tuleb vastav muutuja omistamiseks panna.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kuigi enamikes olukordades on andmet\u00fc\u00fcbist tulenev piirang t\u00e4iesti piisav, on palju olukordi, kus oleks soov t\u00e4psemalt m\u00e4\u00e4ratleda andmete iseloom. Andmetele piirangute seadmisel tulevad appi konstraandid e. piirangud. Piiranguid on v\u00f5imalik seada nii \u00fchele v\u00e4ljale kui ka kirjele. \u00dchele v\u00e4ljale e. veerule seatavad piirangud on enamasti kitsendused andmet\u00fc\u00fcbile. N\u00e4iteks oleme loonud aastaarvude hoidmiseks Kirje piirangutega kirjeldatakse &hellip; <a href=\"https:\/\/tarkvara.thkit.ee\/veeb\/piirangud\/\" class=\"more-link\">Loe edasi <span class=\"screen-reader-text\">Piirangud<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-988","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/pages\/988","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/comments?post=988"}],"version-history":[{"count":12,"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/pages\/988\/revisions"}],"predecessor-version":[{"id":1011,"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/pages\/988\/revisions\/1011"}],"wp:attachment":[{"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/media?parent=988"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}