Distribuirane i objektne baze podataka - Ncd.matf.bg.ac.rs

Distribuirane i objektne baze podataka - Ncd.matf.bg.ac.rs Distribuirane i objektne baze podataka - Ncd.matf.bg.ac.rs

ncd.matf.bg.ac.rs
from ncd.matf.bg.ac.rs More from this publisher

1. TrigeriTriger (okidač, engl. trigger) je mehanizam kojim se za odreĎenu oper<strong>ac</strong>iju modifikovanja<strong>podataka</strong> (insert, update ili delete), nad odreĎenom tabelom, definiše skup akcija (SQL iskaza)koji se „aktivira“, odnosno izvrši svaki put kad se izvrši oper<strong>ac</strong>ija.Oper<strong>ac</strong>ija modifikovanja se često naziva triger oper<strong>ac</strong>ija, a skup akcija triger procedura.Triger se može koristiti da bi se ojačala pravila koja se odnose na integriter <strong>podataka</strong>, za proveruvalidnosti ulaznih <strong>podataka</strong>, za čitanje iz drugih tabela ili upis u druge tabele, za podrškualarmiranju kroz poruke elektronske pošte i slično.Upotrebom trigera se omogućuje:globalno nametanje ograničenja (uslova integriteta) – ako se promeni neki uslov,potrebno je promeniti samo triger, a ne svaki aplikativni programbrži razvoj aplik<strong>ac</strong>ija (pošto je triger sačuvan u bazi, nema potrebe da se u svakojaplik<strong>ac</strong>iji posebno kodiraju akcije koje triger izvršava, tj. one se definišu samo jednom,prilikom definicije trigera)lakše održavanje aplik<strong>ac</strong>ija i <strong>podataka</strong> (jednom kad je triger definisan, automatski sepoziva kada se pristupi tabeli nad kojom je definisan).Sistemi u kojima je podržan mehanizam trigera uobičajeno za svaku od oper<strong>ac</strong>ija unošenja,izmene i brisanja obezbeĎuju dve v<strong>rs</strong>te trigera:triger čija se triger procedura aktivira pre izvršenja triger oper<strong>ac</strong>ije – PRE-TRIGER(koriste se najčešće za proveru nekih uslova pre izvršenja triger oper<strong>ac</strong>ije)triger čija se triger procedura aktivira posle izvršenja triger oper<strong>ac</strong>ije – POSLE-TRIGER(koriste se za propagiranje vrednosti, slanje poruka i slično)U sistemu DB2 podržani su sledeći tipovi trigera:BEFORE trigeri – pokreću se pre update ili insert naredbe. Omogućavaju da vrednostikojima se vrši ažuriranje ili koje se umeću u tabelu, mogu biti modifikovane pre nego štopromena bude izvršena. TakoĎe, mogu da aktiviraju neke oper<strong>ac</strong>ije pozivom funkcijadefinisanih od strane korisnika.BEFORE DELETE trigeri – pokreću se pre delete naredbe. Vrše proveru vrednosti isignaliziraju grešku, ako je potrebno.AFTER trigeri – pokreću se posle update, insert ili delete naredbe. Mogu se ažurirati,umetati ili brisati pod<strong>ac</strong>i u istoj ili drugim tabelama. Ovakva upotreba trigera je korisnaza održavanje odnosa meĎu pod<strong>ac</strong>ima.Trigeri mogu i da koriste korisničke funkcije za aktiviranje oper<strong>ac</strong>ija za dobijanjeupozorenja ili ažuriranje inform<strong>ac</strong>ija van <strong>baze</strong>INSTEAD OF trigeri – opisuju kako pokrenuti insert, update ili delete naredbu nadpogledima koji su suviše kompleksni da bi podržali ove oper<strong>ac</strong>ije bez upotrebe trigeraOmogućavaju upotrebu pogleda kao osnovnog interfejsa za sve SQL oper<strong>ac</strong>ije (insert,delete, update i select)2oktobar 2009, Biljana Stojanović | Matematički fakultet


U većini slučajeva, ako bilo koja naredba u okviru jednog SQL iskaza triger procedure vratinegativan SQLCODE, sam iskaz, uključujući i sve ostale iskaze iz triger procedure se poništava(ROLLBACK).Iz tog razloga, ako triger procedura obuhvata više od jednog SQL iskaza, ili obuhvata pozivfunkcije, neophodno je „zagraditi“ ih BEGIN ATOMIC – END konstrukcijom, koja ukazuje dase ili svi iskazi moraju izvršiti uspešno ili se nijedan neće izvršiti.Primer1: Realizovati sledeći zahtev upotrebom trigera: pri promeni datuma početka prijave zaispitni rok novi datum mora da prethodi starom datumu, a pri promeni datuma završetka prijave,novi datum mora da sledi stari datum. U suprotnom se promena ne izvršava i izdaje se poruka ogrešci.CREATE TRIGGER N_DATUMNO CASCADE BEFORE UPDATE OF POCETAK_PRIJ, KRAJ_PRIJ ONDB.ISPITNI_ROKREFERENCING NEW AS NIROK OLD AS OIROKFOR EACH ROWWHEN (DAYS(NIROK.POC_PRIJ) > DAYS(OIROK.POC_PRIJ)AND DAYS(NIROK.KRAJ_PRIJ) < DAYS(OIROK.KRAJ_PRIJ)SIGNAL SQLSTATE ’85000’ (’Novi datumi pocetka i krajaIspitnog roka nisu validni’)Objašnjenje:Triger oper<strong>ac</strong>ija je oper<strong>ac</strong>ija ažuriranja – UPDATEBEFORE – triger se aktivira pre izvršavanja triger oper<strong>ac</strong>ijeNO CASCADE – triger procedura ne proizvodi aktiviranje drugih trigeraFOR EACH ROW - triger se aktivira za svaki pokušaj ažuriranja pojedinačnog reda tabeleKod greške je string-konstanta ’85000’, koja se bira prema utrvĎenim sintaksnim pravilimaKlauzulom REFERENCING može da se referiše na kolone reda koje treba da budu promenjenetriger oper<strong>ac</strong>ijom, odnosno na kolone reda koje se koriste za promenu upotrebom:OLD AS ime – zadaje se ime kojim se referiše na originalno stanje reda tabele, dakle, pre negošto se trigger oper<strong>ac</strong>ija primeniNEW AS ime – zadaje se ime kojim se referiše na vrednosti koje se koriste za ažuriranje redatabele kada se primeni trigger oper<strong>ac</strong>ijaAko je triger oper<strong>ac</strong>ija UPDATE mogu da se koriste i OLD AS i NEW AS.U slučaju INSERT oper<strong>ac</strong>ije, može samo NEW AS, zato što pre aktiviranja INSERT oper<strong>ac</strong>ijered koji treba da se umetne ne postoji u tabeli, pa samim tim ne postoji ni originalno (prethodno)stanje reda kojim se definišu originalne vrednosti pre primene triger oper<strong>ac</strong>ije.U slučaju DELETE oper<strong>ac</strong>ije, može samo OLD AS, zato što nema spicificiranih novih vrednostiu delete oper<strong>ac</strong>iji.Triger može da referiše i na ceo skup redova koji su pod uticajem date triger oper<strong>ac</strong>ije tako što seu klauzuli REFERENCING specificira:OLD_TABLE AS ime_tabele – zadaje se ime tabele koja obuhvata originalno stanje skuparedova koji su pod uticajem triger oper<strong>ac</strong>ije, dakle pre nego što je oper<strong>ac</strong>ija primenjena5oktobar 2009, Biljana Stojanović | Matematički fakultet


NEW_TABLE AS ime_tabele – zadaje se ime tabele koja obuhvata vrednosti koje se koriste zamodifik<strong>ac</strong>iju redova tabele prilikom primene triger procedure.Ovaj oblik klauzule REFERENCING može da se koristi i sa FOR EACH ROW i sa FOR EACHSTATEMENT. Čak i sa FOR EACH ROW, NEW_TABLE sadrži ceo skup modifikovanihredova od strane triger oper<strong>ac</strong>ije. Naredbe triger procedure ne utiču na redove ove tabele.Primer upotrebe je ako je potrebno primeniti agregatne funkcije nad skupom svih redova koji supod uticajem triger oper<strong>ac</strong>ije.Ove tabele služe samo za čitanje.NAPOMENA! Za OLD_TABLE i NEW_TABLE važe ista pravila kao i za OLD i NEW koja seodnose na tip triger oper<strong>ac</strong>ije sa kojom je dozvoljena njihova upotreba.Opseg OLD_TABLE i NEW_TABLE ime_tabele je telo trigera. Stoga, ako u shemi kreatoratrigera postoji tabela sa istim imenom, to ime mora da bude kvalifikovano imenom sheme, da bise napravila razlika.2. Stored procedureStored procedura je program koji se čuva u DB2 bazi i pokreće na DB2 serveru.Aplik<strong>ac</strong>ija može da pozove stored proceduru po imenu i pokrene SQL naredbe koji su deoprocedure. Stored-procedure i user-defined funkcije (UDF) se često označavaju terminom rutine.Naredbom CREATE PROCEDURE definiše se stored procedura na serveru. Sve procedurekreirane na ovaj način registrovane su u katalogu SYSCAT.ROUTINES.Korisnički definisana procedura poziva se SQL naredbom CALL.Mogu se kreirati tri tipa procedura:Sopljašnje (external). Telo procedure je napisano u nekom programskom jeziku.Sourced. Definiše se procedura koja se bazira na drugoj proceduri. Telo procedure je deodruge procedure (source). Ovakve procedure mogu biti ugraĎene u aplikativni program iliizvršene upotrebom dinamičke SQL naredbe.SQL. Telo procedure je napisano na SQL-u.Procedura se definiše svojim imenom za kojim može da sledi lista argumenata izmeĎu zagrada.Argumenti procedure su skalarne vrednosti, koje mogu biti različitih tipova. Argumenti mogu dasluže za prenos vrednosti proceduri, prihvatanje povratne vrednosti procedure ili u druge svrhe.2.1 CREATE PROCEDURE (external)Definiše eksternu proceduru na tekućem serveru. Ova naredba može biti ugraĎena u aplikativniprogram ili izvšena dinamički (kao dinamička SQL komanda).6Autoriz<strong>ac</strong>ija:oktobar 2009, Biljana Stojanović | Matematički fakultet


Nivo autoriz<strong>ac</strong>ije za naredbu CREATE PROCEDURE mora da uključi bar:CREATE_EXTERNAL_ROUTINE autoriz<strong>ac</strong>iju za bazu i bar jedno od sledećih prava:o IMPLICIT_SHEMA pravo za bazu, ako ime sheme procedure ne referiše napostojeću shemuo CREATEIN privilegiju nad shemom, ako ime sheme procedure referiše napostojeću shemuDBADM nivo autoriz<strong>ac</strong>ijeSintaksa:CREATE [OR REPLACE] PROCEDURE ime_procedure ( lista_parametara ) lista_opcijaOR REPLACEZamena definicije procedure, ako procedura sa istim imenom postoji na serveru. Postojećadefinicija se uklanja, pre nego što se nova doda u katalog.ime_procedure – može biti kvalifikovano (imenom sheme) ili nekvalifikovano. Unutar sheme nesmeju da postoje dve procedure sa istim imenom i istim brojem parametara, čak i kada surazličiti njihovi tipovi.Deklar<strong>ac</strong>ija parametra je oblika:IN | OUT | INOUT ime_parametra tip_parametra [DEFAULT vrednost]IN – Identifikuje parametar kao ulazni parametar procedure. Bilo koje promene ulaznogparametra unutar procedure nisu dostupne pozivajućoj aplik<strong>ac</strong>iji nakon završetka procedure. INje podrazumevani mod parametra procedure.OUT – Identifikuje parametar kao izlazni parametar procedureINOUT – Identifikuje parametar kao ulazno/izlazniAko procedura vrati grešku, OUT parametri ostaju nedefinisani, a INOUT ostaju nepromenjeni.ime_paramtera se zadaje opciono i mora biti jedinstveno za procedurutip_parametra – može biti ugraĎeni tip ili nizovski tip (za Java programski jezik). Ne smeju sekoristiti strukturni tipovi.DEFAULT – parametri sa DEFAULT vrednostima su poslednji u listi, tj. nakon DEFAULTparametara ne može da se navede parametar koji nema DEFAULT vrednost.DEFAULT ne sme da se koristi za INOUT ili OUT parametre, kao ni za parametre tipa ARRAY,ROW ili CURSOR.Za podrazumevane vrednosti se najčešće koriste null konstante, globale promenljive ili izrazi(unutar malih zagrada). Ako se koristi izraz, mora da odgovara tipu parametra i ne sme damodifikuje SQL podatke i vrši spoljašnje akcije.lista_opcija7oktobar 2009, Biljana Stojanović | Matematički fakultet


LANGUAGE – obavezna klauzula kojom se specifikuje programski jezik (C, Java, Cobol, CLR,OLE). Za programski jezik Java, sistem za upravljanje bazom <strong>podataka</strong> poziva proceduru kaometod u Java klasi.SPECIFIC specific_name – obezbeĎuje jedinstveno ime za instancu procedure koja se definiše.Ovo ime može se koristiti prilikom uklanjanja procedure (drop). Ne sme se koristiti za pozivanjeprocedure. Ime može biti jednako nekom postojećem imenu procedure.Ako se ne zada specfic_name, generiše se automatski u obliku: ‘SQLyymmddhhmmssxxx’.DYNAMIC RESULT SETS integer – označava očekivanu gornju granicu za broj rezultujućihskupova procedureNO SQL – procedura ne može da izvrši ni jednu SQL naredbuCONTAINS SQL – mogu da se izvrvšavaju samo SQL naredbe koje ne čitaju niti modifikujupodatkeREADS SQL DATA – mogu se uključiti neke SQL naredbe koje ne menjaju podatkeMODIFIES SQL DATA – mogu da se izvršavaju sve SQL naredbe, osim onih koje nisupodržane za datu proceduruDETERMINISTIC – za uspešne pozive procedura uvek vraća isti rezultat sa istim ulaznimparametrimaNOT DETERMINISTIC – rezultat procedure može da zavisi od nekih uticajaKlauzule ne utiču na izvršavanje procedure.CALLED ON NULL INPUT – uvek se primenjuje na procedure. Klauzula označava da ćeprocedura biti pozvana bez obzira da li je neki od parametara NULL.EXTERNAL NAME ‘string’ – identifikuje se ime fajla sa implement<strong>ac</strong>ijom procedure.Format string-konstante zavisi od programskog jezika.U Javi, format string-konstante je:jar_id:class_id . method_idObuhvata opciono ime jar fajla, ime klase i ime metoda koji se poziva da bi se proceduraizvršila.Ime klase i ime metoda ne moraju da postoje u trenutku izvršavanja CREATE PROCEDUREkomande, ali zato, ako je navedeno ime jar fajla, on mora da postoji. Sa druge strane, kada seprocedura poziva, klasa i metod moraju da postoje i da su dostupni serveru, inače se javljagreška.Ceo string mora da se navede izmeĎu jednostrukih navodnika i ne sme biti dodatnih blankokaraktera.jar_id – jar identifikator koji je dodeljen jar-kolekciji kada je instalirana u bazu. Može bitikvalifikovani ili nekvalifikovani identifikator (npr. ‘myJar’ ili ‘mySchema.myJar’).8class_id – identifikator klase Java objekta. Ako klasa pripada paketu, potrebno je kvalifikovatiime klase imenom paketa.oktobar 2009, Biljana Stojanović | Matematički fakultet


EXTERNAL identifier – SQL identifikator (samo u C-u)FENCED ili NOT FENCED – specifikuje se da li se procedura smatra ‘sigurnom’ za pokretanje(NOT FENCED) ili ne (FENCED).Ako stoji FENCED, sistem za upravljanje bazom štiti svoje unutrašnje resu<strong>rs</strong>e (npr. bafere<strong>podataka</strong>) od pristupa od strane procedure.Sve procedure moraju imati neku od ovih opcija. Ista procedura neće se isto izvršavati sa jednomili drugom opcijom.Napomena! Ako se koristi NOT FENCED sa procedurama koje nisu adekvatno proverene,integritet <strong>baze</strong> može biti narušen.SYSADM, DBADM ili specijalni nivo autoriz<strong>ac</strong>ije CREATE_NOT_FENCED su potrebni da bise registrovala procedura kao NOT FENCED.THREADSAFE ili NOT THREADSAFE – specifikuje se da li se procedura smatra ‘sigurnom’za pokretanje u istom procesu kao i druge rutine (THREADSAFE) ili ne (NOT THREADSAFE).Generalno, da bi procedura bila THREADSAFE, ne bi trebala da koristi globalne ili statičkeprostore <strong>podataka</strong>.Ako je navedeno THREADSAFE, sistem za upravljanje bazom može da pozove proceduru uistom procesu u kojem je i neka druga procedura pozvana.Ako je navedeno NOT THREADSAFE, sistem za upravljanje bazom nikada neće pozvatiproceduru u istom procesu u kojem je i neka druga procedura pozvana.Za FENCED procedure, THREADSAFE je podrazumevani mod za Javu.Za NOT FENCED procedure, THREADSAFE je podrazumevani mod u svim programskimjezicima. NOT THREADSAFE ne može da se zada.COMMIT ON RETURN – specifikuje da li se izvršava naredba COMMIT kada procedura vraćavrednost.NO – podrazumevano, ne vrši se commitYES – commit se izvršava kada procedura vraća vrednost, ako CALL naredba vraća pozitivanSQLCODE. Ako procedura vraća rezultujuće skupove, ku<strong>rs</strong>ori koji su im pridruženi moraju sedefinisati sa opcijom WITH HOLD kako bi mogli da se koriste nakon commit.AUTONOMOUS – procedura se izvršava u svom autonomnom transakcionom opseguRestrikcije koje se odnose na autonomne rutine:Ne mogu da vrate rezultujući skupNe podržavaju sledeće tipove <strong>podataka</strong>: ku<strong>rs</strong>ore, strukturne tipove i XMLEXTERNAL ACTION ili NO EXTERNAL ACTION – specifikuje da li procedura preduzimaneke akcije koje menjaju stanje objekta kojim ne upravlja menadžer <strong>baze</strong> (EXTERNALACTION) ili ne (NO EXTERNAL ACTION).EXTERNAL ACTION je podrazumevani mod.PARAMETER STYLE – odreĎuje konvenciju kojom se definiše način prenosa (prosleĎivanja)parametara proceduri i obrnuto.DB2 SQL, SQL, GENERAL, GENERAL WITH NULLS – nisu podržani u Javi9oktobar 2009, Biljana Stojanović | Matematički fakultet


DB2GENERAL – način prenosa parametara koji je definisan za Java metode. Može samoda se koristi za Javu.JAVA – način prenosa parametara koji odgovara Java jeziku i SQL rutinama.IN/OUT i OUT parametri prosleĎuju se kao nizovi od jednog elementa.Ovaj stil parametara ne podržava DBINFO ili PROGRAM TYPE klauzulu.PARAMETER CCSID – ova klauzula nije podržana u Javi. Specifikuje kodnu stranu (shemu)koja se koristi za sve stringove u proceduri. Podrazumevana vrednost je PARAMETER CCSIDUNICODE za Unicode <strong>baze</strong>, tj. ASCII za ostale <strong>baze</strong>.PROGRAM TYPESUB – procedura očekuje da se parametri proslede kao odvojeni argumenti.Podrazumevani mod.MAIN – procedura očekuje da se parametri proslede u formi (argc, argv), gde je argvvektor argumenata, a argc brojač argumenata. Ime procedure koja se poziva mora bitimain. Ovaj mod nije podržan u Javi.DBINFO ili NO DBINFO – specifikuje da li se posebne inform<strong>ac</strong>ije od strane DB2 sistemaprosleĎuju proceduri prilikom njenog poziva kao dodatni argument (DBINFO) ili ne (NODBINFO). DBINFO nije podržan za PARAMETER STYLE JAVA ili DB2GENERAL.NO DBINO je podrazumevani mod.2.2 Pozivi stored procedura u SQLJ aplik<strong>ac</strong>ijamaOsnovni kor<strong>ac</strong>i za poziv stored procedure:Dodeljivanje vrednosti ulaznim parametrima (IN ili INOUT)Proziv procedure – naredba CALLGenerisanje izlaznih parametara (OUT ili INOUT)Obrada rezultata procedureUpotreba imenovanih parametara u CALL naredbamaMogu se koristiti imenovani parametri za mapiranje host-promenljivih (matičnih promenljivih) uCALL naredbi imenima parametara iz definicije procedure.Dakle, imenovani parametri referišu na matične promenljive.Parametri u CALL naredbi ne moraju se navesti u istom redosledu kao i parametri u definicijiprocedure i ne moraju se navesti svi parametri. Oni parametri koji nisu navedeni dobijajupodrazumevane vrednosti koje su navedene u definiciji procedure. Pri tom, mogu se izostavitisamo oni parametri u CALL naredbi za koje su navedene DEFAULT vrednosti u CREATEPROCEDURE naredbi.Može se eksplicitno dodeliti podrazumevana vrednost ili null vrednost imenovanom parametrunavoĎenjem DEFAULT ili NULL ključne reči.10oktobar 2009, Biljana Stojanović | Matematički fakultet


U istoj CALL naredbi ne mogu se mešati imenovani i neimenovani parametri.Primer:CREATE PROCEDURE IN_PARAMS (IN lowkred SMALLINT,IN medkred SMALLINT,IN highkred SMALLINT)SPECIFIC SQLJ_IN_PARAMSDYNAMIC RESULT SETS 0DETERMINISTICLANGUAGE JAVAPARAMETER STYLE JAVANO DBINFOFENCEDTHREADSAFEMODIFIES SQL DATAPROGRAM TYPE SUBEXTERNAL NAME 'SpServer.inParams'@Ulazni parametri CALL naredbe su predstavljeni imenovanim parametrima.short lowKredIn = 5;short medKredIn = 15;short highKredIn = 30; // host promenljive za ulazne parametre...#sql[ctx] {CALL IN_PARAMS (lowkred => :IN lowKredIn,medkred => :IN medKredIn,highkred => :IN highKredIn) };...Vraćanje više od jednog rezultujućeg skupa iz procedureProcedura može da vraća nula, jedan ili više rezultujućih skupova pozivajućem programu takošto se pri definiciji uključi klauzula DYNAMIC RESULT SETS n , (n >= 0).Pozivajući program treba da izdvoji sadržaj rezultujućih skupova, što podrazumeva:Dobijanje izvršnog konteksta za izdvajanje rezultujućeg skupa iz stored procedure.Dodeljivanje izvršnog kontekstva CALL naredbi za stored proceduru. Napomena! Nekoristiti ovaj izvršni kontekst u bilo koje druge svrhe dok se ne izdvoji i poslednjirezultujući skup.Za svaki rezultujući skup:o Iskoristiti ExecutionContext metod getNextResultSet za izdvajanje rezultujućegskupao Ako nije poznat sadržaj rezultujućeg skupa, koristiti ResultSetMetaData metodeza izdvajanje ove inform<strong>ac</strong>ijeo Koristiti SQLJ iterator ili JDBC ResultSet da se izdvoje redovi rezultujćeg skupa11oktobar 2009, Biljana Stojanović | Matematički fakultet


Rezultujući skupovi se vraćaju pozivajućem programu u istom redosledu u kojem su njihoviku<strong>rs</strong>ori otvoreni u proceduri.Kada nema više rezultujućih skupova, metod getNextResultSet vraća null.Metod ima dve forme:getNextResultSet() – zatvara se trenutno otvoreni rezultujući skup i napreduje se nanarednigetNextResultSet(int current) – vrednost current ukazuje šta se radi sa trenutno otvorenimrezultujućim skupom pre nego što se preĎe na naredni. Postoje sledeće opcije:o java.sql.Statement.CLOSE_CURRENT_RESULT – zatvara seo java.sql.Statement.KEEP_CURRENT_RESULT – tekući skup ostaje otvorenkada se vraća narednio java.sql.Statement.CLOSE_ALL_RESULTS – svi otvoreni ResultSet objektise zatvaraju kada se vraća naredni.Primeri: SpServer.resultSetToClient i SpServer.threeResultSets12oktobar 2009, Biljana Stojanović | Matematički fakultet

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!