<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Baze podataka - MySQL, Oracle, PostgreSQL, MS SQL Server, Access, modelovanje podataka ...</title>
	<atom:link href="http://www.baze-podataka.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.baze-podataka.net</link>
	<description>Blog o bazama podataka</description>
	<pubDate>Tue, 06 May 2008 17:48:05 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<item>
		<title>Diplomski/Seminarski rad: Backup and Recovery Oracle &#038; MySQL baze</title>
		<link>http://www.baze-podataka.net/2008/05/06/diplomskiseminarski-rad-backup-and-recovery-oracle-mysql-baze/</link>
		<comments>http://www.baze-podataka.net/2008/05/06/diplomskiseminarski-rad-backup-and-recovery-oracle-mysql-baze/#comments</comments>
		<pubDate>Tue, 06 May 2008 17:45:55 +0000</pubDate>
		<dc:creator>Dejan</dc:creator>
		
		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[Opšta teorija]]></category>

		<category><![CDATA[Oracle]]></category>

		<category><![CDATA[literatura]]></category>

		<guid isPermaLink="false">http://www.baze-podataka.net/?p=133</guid>
		<description><![CDATA[Uvaženi kolega i student na bečkom Tehničkom univerzitetu - Đorđe &#8220;bags&#8221; Torbica - je za svoj diplomski rad odabrao temu &#8220;Backup und Recovery in Oracle 10g&#8221; pri čemu je morao navesti/usporediti i backup mogućnosti kod MySQL RDBMS-a u odnosu na Oracle XE. Ovih dana je Đorđe svoj rad uspješno odbranio i stekao Bachelor titulu.
Pošto sam ja savjetima pomagao [...]]]></description>
			<content:encoded><![CDATA[<p>Uvaženi kolega i student na bečkom Tehničkom univerzitetu - <strong>Đorđe &#8220;bags&#8221; Torbica</strong> - je za svoj diplomski rad odabrao temu &#8220;<strong><a title="Diplomski/Seminarski rad na temu " href="http://www.baze-podataka.net/wp-content/datoteke/2008/05/diplomski_seminarski_rad_backup_oracle_mysql_baze.pdf" target="_blank">Backup und Recovery in Oracle 10g</a></strong>&#8221; pri čemu je morao navesti/usporediti i backup mogućnosti kod MySQL RDBMS-a u odnosu na Oracle XE. Ovih dana je Đorđe svoj rad uspješno odbranio i stekao Bachelor titulu.</p>
<p>Pošto sam ja savjetima pomagao Đorđu pri izradi tog rada, on je obećao nesebično dati taj svoj rad na uvid drugim zainteresovanim bazoljupcima, koji posjećuju blog baze-podataka.net .</p>
<p><strong>Napomena</strong>: Seminarski rad je na <strong>njemačkom</strong> jeziku.</p>
<p>Download (PDF, 247 kB): <a title="Diplomski/Seminarski rad na temu " href="http://www.baze-podataka.net/wp-content/datoteke/2008/05/diplomski_seminarski_rad_backup_oracle_mysql_baze.pdf" target="_blank">Diplomski/Seminarski rad na temu &#8220;Backup und Recovery in Oracle 10g&#8221;</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.baze-podataka.net/2008/05/06/diplomskiseminarski-rad-backup-and-recovery-oracle-mysql-baze/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Gdje da nabavim Oracle software?</title>
		<link>http://www.baze-podataka.net/2008/04/24/gdje-da-nabavim-oracle-software-download/</link>
		<comments>http://www.baze-podataka.net/2008/04/24/gdje-da-nabavim-oracle-software-download/#comments</comments>
		<pubDate>Thu, 24 Apr 2008 20:26:17 +0000</pubDate>
		<dc:creator>Dejan</dc:creator>
		
		<category><![CDATA[Opšta teorija]]></category>

		<category><![CDATA[Oracle]]></category>

		<category><![CDATA[download]]></category>

		<guid isPermaLink="false">http://www.baze-podataka.net/?p=130</guid>
		<description><![CDATA[Nastavljamo sa pitanjima i odgovorima - Marko Bujas, student informatike, pita gdje se može nabaviti Oracle software, a posebno mu trebaju Forms i Reports Builder.
Ja sam student informatike i trenutno imam predmet baze podataka.
Bio bih vam zahvalan ako biste mi rekli gdje mogu skinuti Oracle nije bitno koja je verzija bitno mi je samo da [...]]]></description>
			<content:encoded><![CDATA[<p>Nastavljamo sa pitanjima i odgovorima - <strong>Marko Bujas</strong>, student informatike, pita gdje se može nabaviti Oracle software, a posebno mu trebaju <strong>Forms</strong> i <strong>Reports Builder</strong>.</p>
<blockquote><p>Ja sam student informatike i trenutno imam predmet baze podataka.<br />
Bio bih vam zahvalan ako biste mi rekli gdje mogu skinuti Oracle nije bitno koja je verzija bitno mi je samo da sadrži form i report builder. samo mi nemojte reći da skinem sa službene stranice oracla.<br />
ako imate neki link bio bih vam jako zahvalan.</p>
<p>sviđaju mi se baze podataka i želim to i jednog dana raditi, ali bez potrebnog softvera to i<br />
nije baš moguće zato molim pomagajte.</p>
<p>Unaprijed vam se zahvaljujem</p></blockquote>
<p>Oracle software se može nabaviti &#8230;<br />
<span id="more-130"></span>&#8230; kod lokalnih Oracle sjedišta i partnera, ali prije svega na službenoj &#8220;<a title="Odakle da skinem Oracle software?" href="http://www.oracle.com/technology/software/index.html" target="_blank">Oracle Software Downloads</a>&#8221; web stranici, na kojoj je izlistan kompletan software za download. Potrebno je samo odabrati šta vam treba i  kliknuti na odgovarajući link.</p>
<p>Evo za Marka i direktni linkovi:<br />
<a title="Odakle da skinem Oraclu bazu?" href="http://www.oracle.com/technology/software/products/database/index.html" target="_blank">Oracle Database</a> (preporučujem verziju 10g, jer 11g još nije stabilna i nije rasprostranjena kao verzije 9i i 10g)<br />
<a title="Odakle da skinem Forms i Report Builder?" href="http://www.oracle.com/technology/software/products/ids/index.html" target="_blank">Oracle Developer Suite 10g</a></p>
<p>Marko nek ti bude sa srećom na ispitu!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.baze-podataka.net/2008/04/24/gdje-da-nabavim-oracle-software-download/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Alternativa za EXECUTE IMMEDIATE i DBMS_SQL u MySQL-u ?</title>
		<link>http://www.baze-podataka.net/2008/04/17/alternativa-za-execute-immediate-dbms_sql-u-mysql/</link>
		<comments>http://www.baze-podataka.net/2008/04/17/alternativa-za-execute-immediate-dbms_sql-u-mysql/#comments</comments>
		<pubDate>Thu, 17 Apr 2008 00:19:48 +0000</pubDate>
		<dc:creator>Dejan</dc:creator>
		
		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[Opšta teorija]]></category>

		<category><![CDATA[SQL]]></category>

		<category><![CDATA[oracle2mysql]]></category>

		<guid isPermaLink="false">http://www.baze-podataka.net/?p=129</guid>
		<description><![CDATA[Vi pitate - mi odgovaramo!
Radovan B. iz Novog Sada je postavio pitanje:

Potreban mi je određeni mehanizam, koji bi mogao na serveru da odradi dinamičko izvršenje određene SQL komande na MYSQL bazi. Znači, ja da mogu da pozovem proceduru na serveru, koja će parsirati SQL komandu zavisno od uslova i koja će se po potrebi izvršiti&#8230; [...]]]></description>
			<content:encoded><![CDATA[<p>Vi pitate - mi odgovaramo!</p>
<p><strong>Radovan B</strong>. iz Novog Sada je postavio pitanje:</p>
<blockquote><p>
Potreban mi je određeni mehanizam, koji bi mogao na serveru da odradi <strong>dinamičko izvršenje</strong> određene SQL komande na MYSQL bazi. Znači, ja da mogu da pozovem proceduru na serveru, koja će parsirati SQL komandu zavisno od uslova i koja će se po potrebi izvršiti&#8230; U MySQL-u mi nedostaje baš to na što sam navikao u ORACLE-u&#8230;</p>
<p>Da li postoji mehanizam u MYSQL bazi (na serveru) analogan komandama <strong>EXECUTE IMMEDIATE</strong> i <strong>DBMS_SQL</strong>, koji postoje u ORACLE bazi?</p></blockquote>
<p>A odgovor je - Da! Dinamičko izvršavanje u MySQL-u postoji, a to se dobija korištenjem komandi <a title="SQL Syntax for Prepared Statements - dinamicki SQL u MySQL-u" href="http://dev.mysql.com/doc/refman/5.0/en/sqlps.html" target="_blank">PREPARE i EXECUTE statement</a>. Postoje neka ograničenja za korištenje u triggerima i ne mogu se koristiti sve DDL komande, ali većina SQL izraza se ipak mogu koristiti.</p>
<p>Ukoliko i vi imate neko pitanje, pošaljite ga na adresu forwardNOSPAMbaze-podataka.net</p>
]]></content:encoded>
			<wfw:commentRss>http://www.baze-podataka.net/2008/04/17/alternativa-za-execute-immediate-dbms_sql-u-mysql/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Unique Indeksi i NULL vrednosti</title>
		<link>http://www.baze-podataka.net/2008/03/25/unique-indeksi-i-null-vrednosti/</link>
		<comments>http://www.baze-podataka.net/2008/03/25/unique-indeksi-i-null-vrednosti/#comments</comments>
		<pubDate>Tue, 25 Mar 2008 19:48:53 +0000</pubDate>
		<dc:creator>Zidar</dc:creator>
		
		<category><![CDATA[MS SQL Server]]></category>

		<guid isPermaLink="false">http://www.baze-podataka.net/2008/03/25/unique-indeksi-i-null-vrednosti/</guid>
		<description><![CDATA[Na sajtu elitesecurity.org povremeno se pojave mozgalice - nesvakidašnji zadaci koje treba rešiti primenom SQL jezika. Jedna od prvih mozgalica bila je &#8220;Kako obezbediti jedinstvenost ako su dozvoljene NULL vrednosti u koloni&#8221;. Drugim rečima, ako vrednost nije NULL onda mora biti jedinstvena, a višestruke NULL vrednosti su dozvoljene. U nekim sistemima rešenje je trivijalno, jer [...]]]></description>
			<content:encoded><![CDATA[<p>Na sajtu elitesecurity.org povremeno se pojave mozgalice - nesvakidašnji zadaci koje treba rešiti primenom SQL jezika. Jedna od prvih mozgalica bila je &#8220;Kako obezbediti jedinstvenost ako su dozvoljene NULL vrednosti u koloni&#8221;. Drugim rečima, ako vrednost nije NULL onda mora biti jedinstvena, a višestruke NULL vrednosti su dozvoljene. U nekim sistemima rešenje je trivijalno, jer se indeksi ignorisu NULL vrednosti . MS SQL to ne dozvoljava (iako recimo Access, takodje MS proizvod, to naprimer dozvoljava).</p>
<p>U verzijama MS SQL zaključno sa 2005 morali smo da pribegavamo trikovima. Triggeri, inedksirani view ili korisničke funkcija su korišćeni da se problem reši. MS SQL 2008 uvodi novinu - &#8220;filtered indexing&#8221;.</p>
<p>U Microsoft SQL Server 2008 problem se rešava elegantno i efikasno definsanjem objekta koji se zove  &#8220;unique filtered index&#8221; koji  moze da isključi  NULL vrednosti. Neka je data tabela:</p>
<pre>
CREATE TABLE dbo.T1(col1 INT NULL, col2 VARCHAR(10) NOT NULL);</pre>
<p>Pretpostavimo da želimo da obezbedimo jedinstvenost za podatke u koloni <em>col1</em>, a da dozvolimo visetruke NULL vrednosti. Dovoljno je da ovako definišete indeks:</p>
<pre>
CREATE UNIQUE NONCLUSTERED INDEX idx_col1_notnull
ON dbo.T1(col1)
WHERE col1 IS NOT NULL;</pre>
<p>Da testiramo index, pokušajmo da unesemo sledeće:</p>
<pre>
INSERT INTO dbo.T1(col1, col2) VALUES(1, 'a');
INSERT INTO dbo.T1(col1, col2) VALUES(1, 'a');</pre>
<p>Drugi INSERT naravno ne prolazi. Međutim,  nećete imati problema da unesete više redova sa  NULL u <em>col1</em>:</p>
<pre>
INSERT INTO dbo.T1(col1, col2) VALUES(NULL, 'a');
INSERT INTO dbo.T1(col1, col2) VALUES(NULL, 'a');</pre>
<p>Negde sam pročitao i da su uvedeni i novi tipovi (podtipovi?) podataka - DateOnly i TimeOnly koji rade upravo to - čuvaj samo vreme i samo datumski deo.  Cool, eh &#8230;.</p>
<p>:-) </p>
]]></content:encoded>
			<wfw:commentRss>http://www.baze-podataka.net/2008/03/25/unique-indeksi-i-null-vrednosti/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Korišćenje UDF funkcija u CHECK uslovima - rezervacija soba</title>
		<link>http://www.baze-podataka.net/2008/03/05/udf-check-constraint-sql-rezervacija-soba/</link>
		<comments>http://www.baze-podataka.net/2008/03/05/udf-check-constraint-sql-rezervacija-soba/#comments</comments>
		<pubDate>Wed, 05 Mar 2008 16:32:17 +0000</pubDate>
		<dc:creator>Zidar</dc:creator>
		
		<category><![CDATA[Best practice]]></category>

		<category><![CDATA[MS SQL Server]]></category>

		<category><![CDATA[zadaci]]></category>

		<guid isPermaLink="false">http://www.baze-podataka.net/2008/03/05/127/</guid>
		<description><![CDATA[Pošto mi se mnogo dopalo korišćenje UDF funkcija u CHECK uslovima, pokušao sam da odgovorim na pitanje, koje se često sreće na forumima: rezervacija soba bez prebukiranja. Evo kako može da se reši:
Kreiramo tabelu u koju se upisuju rezervacije soba u jednom hotelu.
Tabela ima 3 kolone (Sobe, ZauzetoOD, ZauzetoDo)
- Soba ne sme da se prebukira. [...]]]></description>
			<content:encoded><![CDATA[<p>Pošto mi se mnogo dopalo korišćenje UDF funkcija u CHECK uslovima, pokušao sam da odgovorim na pitanje, koje se često sreće na forumima: rezervacija soba bez prebukiranja. Evo kako može da se reši:<br />
Kreiramo tabelu u koju se upisuju rezervacije soba u jednom hotelu.<br />
Tabela ima 3 kolone (Sobe, ZauzetoOD, ZauzetoDo)</p>
<p>- Soba ne sme da se prebukira. Drugim rečima, interval zauzeća (ZauzetoOd, ZauzetoDo) ne sme da se preklopi ni sa jednim drugim intervalom zauzeca za posmatranu sobu.<br />
- Na dan odlaska jednog gosta iz sobe, drugi gost može ući u sobu.<br />
- Sobe se napuštaju do 11AM, a preuzimaju u 1PM.<br />
- Vreme između 11 i 1 se koristi za pripremu sobe za novog gosta. Znači, preklapanje na krajevima intervala se dopušta.</p>
<p><span id="more-127"></span></p>
<pre>

CREATE TABLE Rezervacije 
(
 Soba int NOT NULL
 , ZauzetaOd smalldatetime NOT NULL
 , ZauzetaDo smalldatetime NOT NULL
 PRIMARY KEY (Soba, ZauzetaOd, ZauzetaDo)
)
GO</pre>
<pre>INSERT INTO Rezervacije VALUES(100,'20080115','20080125')
INSERT INTO Rezervacije VALUES(100,'20080126','20080130')
INSERT INTO Rezervacije VALUES(100,'20080205','20080215')
GO
SELECT * FROM Rezervacije</pre>
<pre>Soba        Transakcija ZauzetaOd                                              ZauzetaDo                                             
----------- ----------- ------------------------------------------------------ --------------------
100         1           2008-01-15 00:00:00                                    2008-01-25 00:00:00
100         2           2008-01-26 00:00:00                                    2008-01-30 00:00:00
100         3           2008-02-05 00:00:00                                    2008-02-15 00:00:00</pre>
<pre>(3 row(s) affected)</pre>
<p>Šta treba proveriti da bi se sprečilo preklapanje intervala?<br />
Dva intervale (a,b) i (x,y) mogu da se preklapaju u sledecim slučajevima:</p>
<pre>--A------B-------------------&gt;
-----X---------Y-------------&gt;</pre>
<pre>--------A------------B-------&gt;
----X----------Y-------------&gt;</pre>
<pre>-------A-------------B-------&gt;
-----------X---Y-------------&gt;</pre>
<pre>-----------A---B-------------&gt;
-------X--------------Y------&gt;</pre>
<p>Ni jedan od ovih slučajeva nije dozvoljen. Mogli bismo da pokušamo da<br />
napišemo izraz za preklapanje ovako:</p>
<p>Intervali (A,B) i (X,Y) se preklapaju kada je zadovoljeno<br />
(<br />
B Between X AND Y<br />
OR<br />
A Between X AND Y<br />
OR<br />
X Between A AND B<br />
)</p>
<p>Ako uvedemo dodatni uslov, da se soba može preuzeti istog dana kada je<br />
prethodni gost napušta, ne možemo više da koristimo BETWEEN.<br />
U tom slučaju izraz više nije čitljiv, pa nam treba nešto jednostavnije.</p>
<p>Za pisanje, jednostavniji je dvostruko negativni uslov.<br />
Dva intervala se NE preklapaju ako (A,B) leži potpuno van (X,Y)<br />
Može se reći &#8220;Dva intervala se preklapaju, ako ni jedan ne leži potpuno izvan drugoga&#8221;</p>
<p>To je samo u dva slučaja:<br />
(A,B) se završio pre nego što je (X,Y) počeo:</p>
<pre>
--------A---B----X--------Y-----------&gt;</pre>
<p>(A,B) počinje tek kada je (X,Y) završen</p>
<pre>-----------------X--------Y---A---B---&gt;</pre>
<p>Preklapanje: (NOT (B&lt;=X OR A&gt;=Y))   (1)<br />
nema preklapanja:  (B&lt;=X OR A&gt;=Y)  (2)</p>
<p>Ako upotrebimo uslov (2) možemo napisati upit, koji prebrojava intervale koji se preklapaju sa (a,b):</p>
<pre>DECLARE @a smalldatetime, @b smalldatetime, @Soba int
SELECT @a = '2008-01-31', @b = '2008-02-04', @Soba =100
-- X = ZauzetaOd, Y = ZauzetaDo</pre>
<pre>SELECT COUNT(*) FROM Rezervacije
WHERE (NOT ( (@b &lt;= ZauzetaOd) OR (@a &gt;= ZauzetaDo) ))
AND Soba = @Soba</pre>
<pre>-----------
          1</pre>
<pre>(1 row(s) affected)</pre>
<p>Znači, ne želimo da dopustimo novu rezervaciju ako kveri</p>
<pre>SELECT COUNT(*) FROM Rezervacije
WHERE (NOT ( (@b &lt;= ZauzetaOd) OR (@a &gt;= ZauzetaDo) ))
AND Soba = @Soba</pre>
<p>vraća broj veći od nule.</p>
<p>CHECK constraint se proverava nakon unošenja novog reda u tabelu.<br />
Ako je ograničenje narušeno, transakcija se odbacuje.<br />
Zbog toga će navedeni kveri uvek vratiti barem broj 1 (jer svaki red se preklapa sa samim sobom).<br />
Da to izbegnemo, zahtevaćemo da kveri ne vraća proveravani red.</p>
<p>Funkcija izgleda ovako:</p>
<pre>CREATE FUNCTION dbo.PreklapanjeIntervala
 ( @a smalldatetime, @b smalldatetime, @Soba int)
 RETURNS smallint -- 0 = nema preklapanja, 1 = ima preklapanja
AS
 BEGIN
 DECLARE @Rezultat smallint</pre>
<pre> SET @Rezultat = (
      SELECT COUNT(*) FROM Rezervacije
      WHERE (Soba = @Soba) -- sve radimo za tekucu sobu
      -- ovo bi trebalo da eliminise proveru samog sebe:
      AND NOT (Soba=@Soba AND ZauzetaOd=@a AND ZauzetaDo = @b)
      -- napokon provera preklapanja:
      AND NOT (
         (@b &lt;= ZauzetaOd)
         OR
         (@a &gt;= ZauzetaDo)
        )
     )
 RETURN @Rezultat
 
 END
GO</pre>
<p>Sada može ovo: </p>
<pre>SELECT * FROM Rezervacije</pre>
<pre>Soba        ZauzetaOd                                              ZauzetaDo                                             
----------- ------------------------------------------------------ ---------------------
        100 2008-01-15 00:00:00                                    2008-01-25 00:00:00
        100 2008-01-26 00:00:00                                    2008-01-30 00:00:00
        100 2008-02-05 00:00:00                                    2008-02-15 00:00:00</pre>
<pre>(3 row(s) affected)</pre>
<pre>ALTER TABLE Rezervacije
DROP CONSTRAINT ck_NeSmeSePrebukiratiSoba
GO
-- CHECK CONSTRAINT koji sprecava prebukiranje soba :
ALTER TABLE Rezervacije
ADD CONSTRAINT
 ck_NeSmeSePrebukiratiSoba
 CHECK (  dbo.PreklapanjeIntervala(ZauzetaOd, ZauzetaDo, Soba) = 0 )
 GO</pre>
<pre>SELECT * FROM Rezervacije
Soba        ZauzetaOd                                              ZauzetaDo                                             
----------- ------------------------------------------------------ --------------------
        100 2008-01-15 00:00:00                                    2008-01-25 00:00:00
        100 2008-01-26 00:00:00                                    2008-01-30 00:00:00
        100 2008-02-05 00:00:00                                    2008-02-15 00:00:00</pre>
<pre>(3 row(s) affected)</pre>
<pre>Pokušajmo da prebukiramo sobu:
INSERT INTO Rezervacije VALUES(100,'2008-02-01','2008-02-04')
(1 row(s) affected)</pre>
<pre>
INSERT INTO Rezervacije VALUES(100,'2008-01-20','2008-02-04')
Server: Msg 547, Level 16, State 1, Line 1
INSERT statement conflicted with TABLE CHECK constraint 'ck_NeSmeSePrebukiratiSoba'.
The conflict occurred in database 'Zadaci', table 'Rezervacije'.
The statement has been terminated.</pre>
<pre>INSERT INTO Rezervacije VALUES(200,'2008-01-20','2008-02-04')
(1 row(s) affected)</pre>
<pre>
SELECT * FROM Rezervacije
Soba        ZauzetaOd                                              ZauzetaDo                                             
----------- ------------------------------------------------------ ---------------------
        100 2008-01-15 00:00:00                                    2008-01-25 00:00:00
        100 2008-01-26 00:00:00                                    2008-01-30 00:00:00
        100 2008-02-01 00:00:00                                    2008-02-04 00:00:00
        100 2008-02-05 00:00:00                                    2008-02-15 00:00:00
        200 2008-01-20 00:00:00                                    2008-02-04 00:00:00</pre>
<pre>(5 row(s) affected)</pre>
<pre>
INSERT INTO Rezervacije VALUES(300,'2008-01-20','2008-02-04')</pre>
<pre>(1 row(s) affected)</pre>
<p>Da probamo sa sobom 200:</p>
<pre>
INSERT INTO Rezervacije
  (Soba,  ZauzetaOd,   ZauzetaDo)
VALUES  (200,  '2008-02-04','2008-02-20')
(1 row(s) affected)</pre>
<pre>SELECT * FROM Rezervacije
Soba        ZauzetaOd                                              ZauzetaDo                                             
----------- ------------------------------------------------------ --------------------
        100 2008-01-15 00:00:00                                    2008-01-25 00:00:00
        100 2008-01-26 00:00:00                                    2008-01-30 00:00:00
        100 2008-02-01 00:00:00                                    2008-02-04 00:00:00
        100 2008-02-05 00:00:00                                    2008-02-15 00:00:00
        200 2008-01-20 00:00:00                                    2008-02-04 00:00:00
        200 2008-02-04 00:00:00                                    2008-02-20 00:00:00
        300 2008-01-20 00:00:00                                    2008-02-04 00:00:00</pre>
<pre>(7 row(s) affected)</pre>
<p>Unesimo ponovo isti interval:</p>
<pre>
INSERT INTO Rezervacije
  (Soba,  ZauzetaOd,   ZauzetaDo)
VALUES  (200,  '2008-02-04','2008-02-20')
Server: Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'PK__Rezervacije__239E4DCF'.
Cannot insert duplicate key in object 'Rezervacije'.
The statement has been terminated.</pre>
<p>Pokušajmo ponovo približno isti interval:</p>
<pre>
INSERT INTO Rezervacije
  (Soba,  ZauzetaOd,   ZauzetaDo)
VALUES  (200,  '2008-02-08','2008-02-20')</pre>
<pre>Server: Msg 547, Level 16, State 1, Line 1
INSERT statement conflicted with TABLE CHECK constraint 'ck_NeSmeSePrebukiratiSoba'.
The conflict occurred in database 'Zadaci', table 'Rezervacije'.
The statement has been terminated.</pre>
<pre>SELECT * FROM Rezervacije
Soba        ZauzetaOd                                              ZauzetaDo                                             
----------- ------------------------------------------------------ ------------------------------------------------------
        100 2008-01-15 00:00:00                                    2008-01-25 00:00:00
        100 2008-01-26 00:00:00                                    2008-01-30 00:00:00
        100 2008-02-01 00:00:00                                    2008-02-04 00:00:00
        100 2008-02-05 00:00:00                                    2008-02-15 00:00:00
        200 2008-01-20 00:00:00                                    2008-02-04 00:00:00
        200 2008-02-04 00:00:00                                    2008-02-20 00:00:00
        300 2008-01-20 00:00:00                                    2008-02-04 00:00:00</pre>
<pre>(7 row(s) affected)</pre>
<p>Šta ako naknadno promenimo neku rezervaciju, tako da se narušava zabrana dvostrukog bukiranja?<br />
Pokušajmo prvu rezervaciju za sobu 100 (15 januar - 25 Januar 2008) da produžimo do 1 februara 2008.<br />
Ista soba je već bukirana od 26 Januara do 30 januara.</p>
<pre>UPDATE Rezervacije
SET ZauzetaDo = '2008-02-01'
WHERE Soba = 100
AND ZauzetaOd = '2008-01-15'
AND ZauzetaDo = '2008-01-25'</pre>
<pre>Server: Msg 547, Level 16, State 1, Line 1
UPDATE statement conflicted with TABLE CHECK constraint 'ck_NeSmeSePrebukiratiSoba'.
The conflict occurred in database 'Zadaci', table 'Rezervacije'.
The statement has been terminated.</pre>
<p>Pokazali smo dve stvari - kako se proverava preklapanje intervala i kako se to koristi u funkciji da se obebedi zabrana prebukiranja soba.</p>
<p> :-)<br />
 </p>
]]></content:encoded>
			<wfw:commentRss>http://www.baze-podataka.net/2008/03/05/udf-check-constraint-sql-rezervacija-soba/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Upotreba korisničkih funkcija u CHECK CONSTRAINTS</title>
		<link>http://www.baze-podataka.net/2008/03/05/upotreba-korisnickih-funkcija-u-check-constraints/</link>
		<comments>http://www.baze-podataka.net/2008/03/05/upotreba-korisnickih-funkcija-u-check-constraints/#comments</comments>
		<pubDate>Wed, 05 Mar 2008 14:48:48 +0000</pubDate>
		<dc:creator>Zidar</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.baze-podataka.net/2008/03/05/upotreba-korisnickih-funkcija-u-check-constraints/</guid>
		<description><![CDATA[MS SQL  2000 doneo je jednu lepu novinu - mogućnost pisanja korisničkih funkcija. Uz to je tiho došla još jedna novina, slabo dokumentovana,  iako se može naći u Boks On Line. Korisničke funkcije mogu se pozvati iz CHECK constraints. Funkcije ko funkcije, mogu da pozivaju redove iz posmatrane tabele, ali i drugih tabela. Ovo nam omogućava [...]]]></description>
			<content:encoded><![CDATA[<p><font size="2">MS SQL  2000 doneo je jednu lepu novinu - mogućnost pisanja korisničkih funkcija. Uz to je tiho došla još jedna novina, slabo dokumentovana,  iako se može naći u Boks On Line. Korisničke funkcije mogu se pozvati iz CHECK constraints. Funkcije ko funkcije, mogu da pozivaju redove iz posmatrane tabele, ali i drugih tabela. Ovo nam omogućava da izbegnemo proceduralno programiranje (trigere) i da neka ograničenja za koje smo morali koristiti Stored Procedures ili čak front-end funkcije, sada možemo da postavimo na nivo tabele, tamo gde i treba.</font></p>
<p><font size="2">Na jednostavnom primeru pokazaćemo kako to radi.</font></p>
<p><font size="2">Dobrotvorna organizacija daje pomoc gradjanima. Svaki gradjanin ima svoj &#8216;racun&#8217;. Novac se isplacuje višekratno, u manjim iznosima. Nikome se ne sme isplatiti više od 100 dinara ukupno.</font></p>
<p><font size="2">Krairana je tabela &#8216;Zaduzenja&#8217; sa tri kolone - Transakcija, Racun, IznosZaduzenja.<br />
IznosZaduzenja je ono sto se isplaćuje u jednoj transakciji. Ukupan zbir IznosZaduzenja po računu ne sme da predje 100.</font></p>
<p><font size="2">Ovo su ograničenja koja želimo da postavimo:<br />
Pretpostavljamo IznosZaduzenja mora biti pozitivan, ne mozž biti nula ili manji.<br />
Ukupan zbir svih IznosZaduzenja po Racunu ne sme preći 100.</font></p>
<p><font size="2">CREATE TABLE Zaduzenja &#8211; DROP TABLE Accounnt<br />
(Transakcija int PRIMARY KEY<br />
, Racun int NOT NULL<br />
, IznosZaduzenja money NOT NULL CHECK (IznosZaduzenja &gt; 0)<br />
)</font></p>
<p><font size="2">Ovako nasa tabela postuje  prvo ograničenje. Kako da sprečimo da se nekome isplati više od 100 dinara?</font></p>
<p><font size="2">MS SQL, od verzije 2000 pa naovamo ima jednu malo poznatu osobinu - u CHECK constraints mogu se koristiti user defined functions.<br />
Iskoristimo to. Napišimo prvo funkciju koja izračunava ukupno zaduženje po računu. Funkcija bi mogla ovako da izgleda:</font></p>
<p><font size="2">CREATE FUNCTION dbo.UkupnoZaduzenje (@Racun int)<br />
RETURNS money<br />
AS<br />
BEGIN<br />
 DECLARE @Retval money<br />
 SET @Retval = (SELECT SUM(IznosZaduzenja)<br />
     FROM Zaduzenja WHERE Racun = @Racun<br />
     )<br />
 RETURN COALESCE(@Retval,0) &#8211; inace vraca NULL kad ne postoji ni jedan red u in line kveriju<br />
END</font></p>
<p><font size="2">Funkciju pozivamo ovako:<br />
SELECT dbo.UkupnoZaduzenje(100)</font></p>
<p><font size="2">Ovako pravimo CHECK constraint koji koristi nasu funkciju:</font></p>
<p><font size="2"><br />
ALTER TABLE Zaduzenja<br />
&#8211;DROP CONSTRAINT ck_UkupnoZaduzenjeManjeod100<br />
ADD CONSTRAINT ck_UkupnoZaduzenjeManjeod100<br />
 CHECK<br />
  (<br />
   100 &gt;= dbo.UkupnoZaduzenje (Racun)<br />
  )</font></p>
<p><font size="2">Da vidimo da li radi:</font></p>
<p><font size="2">INSERT INTO Zaduzenja VALUES (1,100,50)<br />
(1 row(s) affected)</font></p>
<p><font size="2"><br />
SELECT * FROM Zaduzenja<br />
Transakcija Racun       IznosZaduzenja       <br />
&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
          1         100               50.0000 </font></p>
<p><font size="2">(1 row(s) affected)</font></p>
<p><font size="2">Dodajmo jos 25 dinara na isti racun:<br />
INSERT INTO Zaduzenja VALUES (2,100,25)<br />
(1 row(s) affected)</font></p>
<p><font size="2">Sada imamo u tabeli Zaduzenja:<br />
Transakcija Racun       IznosZaduzenja       <br />
&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
          1         100               50.0000<br />
          2         100               25.0000 </font></p>
<p><font size="2">Ukupno azduzenje za Racun=100 jeste 75.<br />
Pokušajmo da dodamo 30 dinara, što bi podiglo ukupno zaduženje na 105.</font></p>
<p><font size="2">INSERT INTO Zaduzenja VALUES (3,100,30)</font></p>
<p><font size="2">Rezultat:<br />
Server: Msg 547, Level 16, State 1, Line 1<br />
INSERT statement conflicted with COLUMN CHECK constraint &#8216;ck_UkupnoZaduzenjeManjeod100&#8242;.<br />
The conflict occurred in database &#8216;master&#8217;, table &#8216;Zaduzenja&#8217;, column &#8216;Racun&#8217;.<br />
The statement has been terminated.</font></p>
<p><font size="2">Još 25 moze da prodje:<br />
INSERT INTO Zaduzenja VALUES (3,100,25)</font></p>
<p><font size="2">(1 row(s) affected)</font></p>
<p><font size="2">i ništa vise:</font></p>
<p><font size="2">INSERT INTO Zaduzenja VALUES (4,100,0.001)</font></p>
<p><font size="2">Ponovo dobijamo<br />
Server: Msg 547, Level 16, State 1, Line 1<br />
INSERT statement conflicted with COLUMN CHECK constraint &#8216;ck_UkupnoZaduzenjeManjeod100&#8242;.<br />
The conflict occurred in database &#8216;Zadaci&#8217;, table &#8216;Zaduzenja&#8217;, column &#8216;Racun&#8217;.<br />
The statement has been terminated.</font></p>
<p><font size="2">SELECT * FROM Zaduzenja</font></p>
<p><font size="2">Transakcija Racun       IznosZaduzenja       <br />
&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
          1         100               50.0000<br />
          2         100               25.0000<br />
          3         100               25.0000 </font></p>
<p><font size="2">(3 row(s) affected)</font></p>
<p>Ne moramo više da poštovanje ograničenja obezbeđujemo na front endu, nit SQL programiranjem (trigeri i stored procedure). Kod u funkciji nije proceduralni, ne maskiramo funkcijom nikakav kursor.  Onako kako i treba da bude.</p>
<p> <img src='http://www.baze-podataka.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.baze-podataka.net/2008/03/05/upotreba-korisnickih-funkcija-u-check-constraints/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Nastavak sage o Sun-ovoj akviziciji MySQL-a</title>
		<link>http://www.baze-podataka.net/2008/02/29/mysql-sun-samp/</link>
		<comments>http://www.baze-podataka.net/2008/02/29/mysql-sun-samp/#comments</comments>
		<pubDate>Fri, 29 Feb 2008 00:01:17 +0000</pubDate>
		<dc:creator>Dejan</dc:creator>
		
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.baze-podataka.net/2008/02/29/mysql-sun-samp/</guid>
		<description><![CDATA[Sun je već uvrstio sve MySQL proizvode u svoj portfolio, a akcenat je stavljen na MySQL Enterprise verziju.
Ukratko - prema službenim objavama, cilj će biti uska povezanost svih komponenti potrebnih za funkcionisanje jednog informacionog sistema, odnosno integrisana ponuda hardwarea (Sunovi serveri), softwarea (Solaris OS i OpenSolaris, Java, MySQL i td.) i servisnih usluga (consulting, implementation, support &#8230;), [...]]]></description>
			<content:encoded><![CDATA[<p><a target="_blank" href="http://mysql.com/news-and-events/sun/" title="MySQL and Sun"><strong>Sun</strong> je već uvrstio sve <strong>MySQL</strong></a> proizvode u svoj portfolio, a akcenat je stavljen na <strong>MySQL Enterprise</strong> verziju.</p>
<p>Ukratko - prema službenim objavama, cilj će biti uska povezanost svih komponenti potrebnih za funkcionisanje jednog informacionog sistema, odnosno <strong>integrisana ponuda</strong> hardwarea (Sunovi serveri), softwarea (Solaris OS i OpenSolaris, Java, MySQL i td.) i servisnih usluga (consulting, implementation, support &#8230;), tako da je ova integrisana end-to-end kombinacija prvenstveno namijenjena srednjim i velikim firmama. A šta sa malim firmama?</p>
<p>Male će se vjerovatno morati osloniti na MySQL community verziju, te PHP i Apache na nekom shared serveru. Support i konsultacije će im pružati Google, a implementaciju jedan od samoukih srednjoš&#8230; pardon studenata&#8230; :)</p>
<p><a target="_blank" href="http://www.gartner.com/resources/154800/154828/mysql_acquisition_edges_sun__154828.pdf" title="[PDF] MySQL Acquisition Edges Sun Closer to a Complete OSS Stack">Agencija Gartner piše</a> da će fokus biti i na OpenSource tržištu, odnosno na jačanju SAMP platforme (umjesto L u LAMP, stavljeno je S za Solaris), ali ja bih tu platformu prije nazvao SAJM (Solaris Apache Java MySQL) ili eventualno SAMJP, a prihod bi se trebao ostvarivati uglavnom preko licenci za support i consulting.</p>
<p><a target="_blank" href="http://mysql.com/news-and-events/sun/jonathan_schwartz.html" title="Letter from Jonathan Schwartz">Jonathan Schwartz</a>, Sun CEO, je pored klasičnih menadžerskih/marketinških izjava poput ove:<br />
&#8220;<em>Our enterprise customers worldwide can now take <strong>advantage of MySQL&#8217;s market-leading open source database</strong> on your choice of platform, OS and language with less risk — <strong>for up to a 90% lower total cost of ownership</strong> over many traditional database solutions.&#8221;</em></p>
<p>napisao i da će Sun nastaviti uspješnu saradnju sa kompletnom OpenSource zajednicom, te da će M u LAMP platformi i dalje biti njen sastavni dio.</p>
<p>Za one koji se pitaju &#8220;<em>I šta sad?</em>&#8220;, <strong>Mårten Mickos</strong>, bivši <strong>MySQL</strong> CEO, a sadašnji Senior Vice President - Database Group, <strong>Sun </strong>- daje <a target="_blank" href="http://mysql.com/news-and-events/sun/marten_mickos.html" title="Letter from Marten Mickos">konkretan odgovor</a>:&#8221;<em><strong>Simply put, it&#8217;s business as usual, only better</strong>.<br />
&#8230;<br />
But now you can leverage MySQL&#8217;s and Sun&#8217;s joint ability to provide you a complete suite of support options that enable you to rapidly build and deploy efficient, effective and secure applications and services. You can enjoy your total cost of ownership saving and benefit from our expanding roadmap and rates of innovation.</em>&#8221;</p>
<p>Čitav proces spajanja ove dvije firme će trajati još nekoliko mjeseci, tako da ćemo konkretne rezultate ove akvizicije vidjeti tek krajem ove godine. Do tada - hvala na pažnji - slijedi vremenska prognoza.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.baze-podataka.net/2008/02/29/mysql-sun-samp/feed/</wfw:commentRss>
		</item>
		<item>
		<title>TOAD for MySQL - Freeware v3.1.1</title>
		<link>http://www.baze-podataka.net/2008/02/27/toad-for-mysql-freeware-v311/</link>
		<comments>http://www.baze-podataka.net/2008/02/27/toad-for-mysql-freeware-v311/#comments</comments>
		<pubDate>Wed, 27 Feb 2008 20:41:09 +0000</pubDate>
		<dc:creator>Dejan</dc:creator>
		
		<category><![CDATA[Alati]]></category>

		<category><![CDATA[TOAD]]></category>

		<guid isPermaLink="false">http://www.baze-podataka.net/2008/02/27/toad-for-mysql-freeware-v311/</guid>
		<description><![CDATA[TOAD je po meni najbolji alat za rad sa bazama podataka, a koristim ga za rad sa Oracle i MySQL bazama.
Pored komercijalnih verzija, možete skinuti i Freeware verzije, koje važe 60 dana. Nakon isteka probnog roka, samo deinstalirate taj Freeware i ponovo instalirate.
Freeware verzije možete naći na ovoj adresi: http://www.toadworld.com/Downloads/Freeware/tabid/80/Default.aspx
]]></description>
			<content:encoded><![CDATA[<p>TOAD je po meni najbolji alat za rad sa bazama podataka, a koristim ga za rad sa Oracle i MySQL bazama.</p>
<p>Pored komercijalnih verzija, možete skinuti i Freeware verzije, koje važe 60 dana. Nakon isteka probnog roka, samo deinstalirate taj Freeware i ponovo instalirate.</p>
<p>Freeware verzije možete naći na ovoj adresi: <a href="http://www.toadworld.com/Downloads/Freeware/tabid/80/Default.aspx">http://www.toadworld.com/Downloads/Freeware/tabid/80/Default.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.baze-podataka.net/2008/02/27/toad-for-mysql-freeware-v311/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ORA-02019: connection description for remote database not found</title>
		<link>http://www.baze-podataka.net/2008/02/27/ora-02019-connection-description-for-remote-database-not-found/</link>
		<comments>http://www.baze-podataka.net/2008/02/27/ora-02019-connection-description-for-remote-database-not-found/#comments</comments>
		<pubDate>Wed, 27 Feb 2008 15:03:54 +0000</pubDate>
		<dc:creator>Dejan</dc:creator>
		
		<category><![CDATA[ORA greške]]></category>

		<category><![CDATA[Problemi i rešenja]]></category>

		<guid isPermaLink="false">http://www.baze-podataka.net/2008/02/27/ora-02019-connection-description-for-remote-database-not-found/</guid>
		<description><![CDATA[Aaaaaargh&#8230; $§&#38;%/*#
Koliko jedna &#8220;sitnica&#8221; može koštati vremena i živaca&#8230;
Kolega je instalirao jednu Oracle bazu za testiranje, u koju smo kasnije importovali našu production bazu. Međutim, ne lezi vraže&#8230; Nakon nekoliko sati rada, određene aplikacije su počele da javljaju grešku, a pojedini PL/SQL paketi se nisu mogli kompilirati.
Problem je pojavio prilikom korištenja objekata (tabele i views) iz [...]]]></description>
			<content:encoded><![CDATA[<p>Aaaaaargh&#8230; $§&amp;%/*#</p>
<p>Koliko jedna &#8220;sitnica&#8221; može koštati vremena i živaca&#8230;</p>
<p>Kolega je instalirao jednu Oracle bazu za testiranje, u koju smo kasnije importovali našu <em>production</em> bazu. Međutim, ne lezi vraže&#8230; Nakon nekoliko sati rada, određene aplikacije su počele da javljaju grešku, a pojedini PL/SQL paketi se nisu mogli kompilirati.</p>
<p>Problem je pojavio prilikom korištenja objekata (tabele i views) iz druge baze preko database linka. Ukoliko u svom kôdu imate nešto slično kao npr.:</p>
<p><code>SELECT id, value<br />
INTO lvID, lvValue<br />
FROM remote_table@mssqlDB;</code></p>
<p>onda taj upit može javiti grešku:<br />
<strong>ORA-00942 Table or View does not exist</strong></p>
<p>ali pravi uzrok greške leži u nedostupnosti database linka, odnosno u grešci:<br />
<strong>ORA-02019: connection description for remote database not found</strong></p>
<p>E sad je trebalo pronaći uzrok te greške - kolega je odustao nakon nekoliko sati, pa sam ja preuzeo i takođe izgubio skoro 3 sata dok nisam pronašao u čemu je bio problem.</p>
<p>Provjerio sam 10-ak puta tnsnames.ora, dotične PL/SQL pakete nekoliko puta liniju po liniju, ali bez uspjeha&#8230;<br />
Googleao sam, tražio na MetaLinku, ali bez uspjeha&#8230;<br />
Rješenje sam otkrio sasvim slučajno - usporedio sam init-parametre u toj novoj testnoj bazi i u production bazi, pa mi je za oko zapao parametar &#8220;<strong>open_links</strong>&#8220;. U testnoj bazi je vrijednost iznosila 4, a u production bazi 8.</p>
<p>U dokumentaciji piše:<br />
&#8220;<strong>OPEN_LINKS</strong> specifies the maximum number of concurrent open connections to remote databases in one session.&#8221;</p>
<p>Standardno je vrijednost podešena na 4, a mi smo u nekoliko PL/SQL paketa koristili i po 7-8 database linkova, pa sam ja samo povećao tu vrijednost na 8, restartovao bazu i sve je funkcionisalo kako treba.</p>
<p><code>alter system set open_links=8 scope=spfile sid='*';</code></p>
<p>Nadam se da će ovo nekom pomoći i uštediti vrijeme i živce&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.baze-podataka.net/2008/02/27/ora-02019-connection-description-for-remote-database-not-found/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Recenzija: Expert Oracle Database Architecture</title>
		<link>http://www.baze-podataka.net/2008/02/12/recenzija-expert-oracle-database-architecture/</link>
		<comments>http://www.baze-podataka.net/2008/02/12/recenzija-expert-oracle-database-architecture/#comments</comments>
		<pubDate>Tue, 12 Feb 2008 11:50:43 +0000</pubDate>
		<dc:creator>Dejan</dc:creator>
		
		<category><![CDATA[Best practice]]></category>

		<category><![CDATA[Opšta teorija]]></category>

		<category><![CDATA[Oracle]]></category>

		<category><![CDATA[literatura]]></category>

		<guid isPermaLink="false">http://www.baze-podataka.net/2008/02/12/recenzija-expert-oracle-database-architecture/</guid>
		<description><![CDATA[Napokon sam ugrabio vremena da napišem neku novu recenziju, a ovaj put sam odabrao još jednu odličnu knjigu o Oracle bazi - &#8220;Expert Oracle Database Architecture&#8220;, čiji autor je fenomenalni i svima poznat - Tom Kyte.
Knjiga je namijenjena svima - kako programerima, tako i administratorima, bez obzira da li se radi o početnicima ili iskusnim znalcima. Tom je u svom već [...]]]></description>
			<content:encoded><![CDATA[<p>Napokon sam ugrabio vremena da napišem neku novu recenziju, a ovaj put sam odabrao još jednu odličnu knjigu o Oracle bazi - &#8220;<strong>Expert Oracle Database Architecture</strong>&#8220;, čiji autor je fenomenalni i svima poznat - <strong>Tom Kyte</strong>.</p>
<p>Knjiga je namijenjena svima - kako programerima, tako i administratorima, bez obzira da li se radi o početnicima ili iskusnim znalcima. <strong>Tom</strong> je u svom već poznatom stilu &#8220;<em>proof-by-example</em>&#8221; detaljno objasnio mnoge stvari potrebne za shvatanje funkcionalnosti i unutrašnje strukture Oracle baze, a mnogi savjeti spadaju u &#8220;best practice&#8221; primjere.</p>
<p>Početnici će moći upoznati internu strukturu i komponente Oracle baze, zatim koji procesi rade u pozadini i za šta je koji proces zadužen. Osim toga, mogu saznati kako funkcionišu transakcije, konkurentni višekorisnički pristup podacima, particionisanje i paralelizam. Pored poglavlja o tabelama i indeksima, tu je i poglavlje o svim tipovima podataka u Oracle bazi (npr. jeste li znali da je <strong>PLS_INTEGER</strong> efikasniji od <strong>BINARY_INTEGER</strong>?), pa koga zanima čemu služi npr. TIMESTAMP WITH TIMEZONE nek se lati knjige. <img src='http://www.baze-podataka.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Oni iskusniji će možda pronaći neku korisnu informaciju o poboljšavanju sistema (performance tuning) mijenjanjem određenih init-parametara, zatim informacije o razvijanju aplikacija u RAC okruženju i vjerovatno još mnogo korisnih stvari.</p>
<p>Za mene su veoma korisna bila poglavlja o tabelama i indeksima, u kojima sam saznao kako mogu koristiti <strong>IOT</strong>  (Index Organized Table) i <strong>Cluster/Hash-Cluster/Hash-Cluster-Sorted</strong> tabele, a potom koji indeksi bi bili najefikasniji u određenim situacijama (npr. <strong>REVERSE</strong> index za datume ili <strong>BITMAP</strong> index za polja sa malim brojem različitih vrijednosti, npr. muško/žensko).</p>
<p>Knjigu najsrdačnije preporučujem i dajem joj zasluženu ocjenu 10.</p>
<p><iframe scrolling="no" frameBorder="0" src="http://rcm.amazon.com/e/cm?t=databasething-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=1590595300&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;lc1=0000FF&amp;bc1=FFFFFF&amp;bg1=FFFFFF&amp;f=ifr&amp;nou=1" marginHeight="0" marginWidth="0" style="width: 120px; height: 240px"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.baze-podataka.net/2008/02/12/recenzija-expert-oracle-database-architecture/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
