<?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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>cojack blog &#187; SQL</title>
	<atom:link href="http://www.cojack.pl/kategoria/sql/feed" rel="self" type="application/rss+xml" />
	<link>http://www.cojack.pl</link>
	<description>Programowanie oraz Open Source powodem do życia</description>
	<lastBuildDate>Fri, 20 Aug 2010 18:16:05 +0000</lastBuildDate>
	<language>PL</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>PostgreSQL – PL/pgSQL cz.3</title>
		<link>http://www.cojack.pl/postgresql-plpgsql-cz-3</link>
		<comments>http://www.cojack.pl/postgresql-plpgsql-cz-3#comments</comments>
		<pubDate>Sat, 14 Aug 2010 17:09:07 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[PL/pgSQL]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=438</guid>
		<description><![CDATA[ Na początku chciałbym przeprosić blogera Wojciecha Soczyńskiego, za to iż miałem napisać o klasie interpretującej interfejs Iterator, wpis już jest w trakcie budowy, ale nie mogę się zabrać by go skończyć. Także wyczekuj   Z cyklu artykułów o PL/pgSQL, chciałbym przedstawić kolejną z możliwości tego języka proceduralnego w ...]]></description>
			<content:encoded><![CDATA[<p><img width="100" height="100" alt="PostgreSQL" src="http://www.cojack.pl/wp-content/arch-postgresql.png" title="PostgreSQL" class="alignleft"> Na początku chciałbym przeprosić blogera Wojciecha Soczyńskiego, za to iż miałem napisać o klasie interpretującej interfejs <strong>Iterator</strong>, wpis już jest w trakcie budowy, ale nie mogę się zabrać by go skończyć. Także wyczekuj <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Z cyklu artykułów o <strong>PL/pgSQL</strong>, chciałbym przedstawić kolejną z możliwości tego języka proceduralnego w bazie danych <strong>PostgreSQL</strong>.</p>
<h3>Pętle cd.</h3>
<p>Miałem napisać o pętlach, w poprzednim wpisie, ale materiał jest na tyle obszerny że postanowiłem to przenieść i poświęcić im cały wpis. No to jedziemy.</p>
<p>Pętle jak nam ładnie pokazuje manual:</p>

<div class="wp_syntax"><div class="code"><pre class="plsql" style="font-family:monospace;"><span style="color: #00F;">&#91;</span> <span style="color: #00F;">&lt;&lt;</span>label<span style="color: #00F;">&gt;&gt;</span> <span style="color: #00F;">&#93;</span>
<span style="color: #00F;">LOOP</span>
    statements
<span style="color: #00F;">END</span> <span style="color: #00F;">LOOP</span> <span style="color: #00F;">&#91;</span> label <span style="color: #00F;">&#93;</span><span style="color: #00F;">;</span></pre></div></div>

<p>Proste co? A teraz, krótki opis, otóż każda pętla może zostać &#8222;nazwana&#8221;, czyli posiadać tzw. label ( z ang. etykietę ), po co? Po to gdy będziemy chcieli zakończyć pętle, a będziemy mieli zagnieżdżenie pętel, to w przypadku chęci wyjścia całkiem z wszystkich pętli, wystarczy podać nazwę pętli wyżej. Służy nam temu polecenie:</p>

<div class="wp_syntax"><div class="code"><pre class="plsql" style="font-family:monospace;"><span style="color: #00F;">EXIT</span> <span style="color: #00F;">&#91;</span> label <span style="color: #00F;">&#93;</span> <span style="color: #00F;">&#91;</span> <span style="color: #00F;">WHEN</span> boolean<span style="color: #00F;">-</span>expression <span style="color: #00F;">&#93;</span><span style="color: #00F;">;</span></pre></div></div>

<p>Dlaczego nie RETURN a EXIT? Otóż możemy równie dobrze użyć RETURN w pętli by z niej wyjść, ale słowo kluczowe RETURN mówi nam coś innego, zwróć. A co my zwracamy wychodząc z pętli? No nic, także te słowo jest mylne.</p>
<p>Wracając do pętli, może się dziwnie wydawać że nie wiadomo kiedy się ona skończy, gdyż nie jest podoba do żadnej z pętli znanych nam z języka php, ani to for, ani do &#8230; while, ani while itd. No właśnie, gdybyśmy nie mieli żadnego warunku w pętli kończącego ją, to dostalibyśmy pętlę nieskończoną. Dlatego taka pętla <em>musi</em> posiadać w sobie warunek skończenia. Musimy na własną rękę inkrementować (itp..) jakaś wartość i sprawdzać ją w pętli. Otóż samej pętli LOOP to uwierzcie mi lub nie, to rzadko będziecie używać. No jest sama w sobie mało przydatna.</p>
<h3>Iteracja tablicy elementów</h3>
<p>Definicja pętli:</p>

<div class="wp_syntax"><div class="code"><pre class="plsql" style="font-family:monospace;"><span style="color: #00F;">&#91;</span> <span style="color: #00F;">&lt;&lt;</span>label<span style="color: #00F;">&gt;&gt;</span> <span style="color: #00F;">&#93;</span>
<span style="color: #00F;">FOR</span> name <span style="color: #00F;">IN</span> <span style="color: #00F;">&#91;</span> <span style="color: #00F;">REVERSE</span> <span style="color: #00F;">&#93;</span> expression <span style="color: #00F;">..</span> expression <span style="color: #00F;">&#91;</span> <span style="color: #00F;">BY</span> expression <span style="color: #00F;">&#93;</span> <span style="color: #00F;">LOOP</span>
    statements
<span style="color: #00F;">END</span> <span style="color: #00F;">LOOP</span> <span style="color: #00F;">&#91;</span> label <span style="color: #00F;">&#93;</span><span style="color: #00F;">;</span></pre></div></div>

<p>Tu jest moc, ukłony dla dev z postgre za wskaźniki. Dzięki językowi proceduralnemu <strong>PL/pgSQL</strong>, nie musimy się troszczyć o deklaracje wskaźników w pętli i ich wykorzystywanie, są one automatycznie definiowane i używane przez silnik bazy. Dobre co? W postgresie mamy typy tablicowe. Deklaracja jest bardzo podobna jak w innych językach:</p>
<ul>
<li>INT[]</li>
<li>VARCHAR[]</li>
</ul>
<p>I tak dalej, dobra dajmy na to że mamy funkcję której jednym z argumentów jest właśnie np VARCHAR[], co lepsze możemy zdefiniować argument funkcji jako ANYARRAY, i dzięki temu, możemy do takiej funkcji przesyłać tablicę różnego typu, bez potrzeby martwienia się o to, w jaki sposób to przesyłamy, i tak później przy wrzucaniu danych do bazy musimy rzutować typ. Wracając do sedna, to mamy taką tablice, która składa się np z 6 elementów. Indeksy tablic w postgresql są numerowane od 1 <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Też sobie wymyślili, no ale dobra. Mamy taką tablice, i dajmy na to że składa się z 240 wierszy. Czyli jest 240 indeksów. Albo i nie, ponieważ taka tablica może być dynamiczna i w sumie nie wiemy jak wielka jest ta tablica, wiemy jedynie że będzie posiadać 6 elementów jeden wiersz. I jak to zrobić? Patrzcie:</p>

<div class="wp_syntax"><div class="code"><pre class="plsql" style="font-family:monospace;"><span style="color: #00F;">FOR</span> i <span style="color: #00F;">IN</span> ARRAY_LOWER<span style="color: #00F;">&#40;</span> <span style="color: #F00;">&quot;_someVar&quot;</span><span style="color: #00F;">,</span> <span style="color: #800;">1</span> <span style="color: #00F;">&#41;</span> <span style="color: #00F;">..</span> ARRAY_UPPER<span style="color: #00F;">&#40;</span> <span style="color: #F00;">&quot;_someVar&quot;</span><span style="color: #00F;">,</span> <span style="color: #800;">1</span> <span style="color: #00F;">&#41;</span>
  <span style="color: #00F;">LOOP</span>
&nbsp;
    <span style="color: #00F;">INSERT</span> <span style="color: #00F;">INTO</span>
      <span style="color: #F00;">&quot;someTable&quot;</span>
    <span style="color: #00F;">&#40;</span>
      <span style="color: #00F;">...</span> <span style="color: #080; font-style: italic;">-- jakieś tam kolumny</span>
    <span style="color: #00F;">&#41;</span>
    <span style="color: #00F;">VALUES</span>
    <span style="color: #00F;">&#40;</span>
      <span style="color: #F00;">&quot;_someVar&quot;</span><span style="color: #00F;">&#91;</span> i <span style="color: #00F;">&#93;</span><span style="color: #00F;">&#91;</span> <span style="color: #800;">1</span> <span style="color: #00F;">&#93;</span><span style="color: #00F;">::</span>INT<span style="color: #00F;">,</span>
      <span style="color: #F00;">&quot;_someVar&quot;</span><span style="color: #00F;">&#91;</span> i <span style="color: #00F;">&#93;</span><span style="color: #00F;">&#91;</span> <span style="color: #800;">2</span> <span style="color: #00F;">&#93;</span><span style="color: #00F;">::</span><span style="color: #00F;">VARCHAR</span><span style="color: #00F;">,</span>
      <span style="color: #F00;">&quot;_someVar&quot;</span><span style="color: #00F;">&#91;</span> i <span style="color: #00F;">&#93;</span><span style="color: #00F;">&#91;</span> <span style="color: #800;">3</span> <span style="color: #00F;">&#93;</span><span style="color: #00F;">::</span><span style="color: #00F;">BOOLEAN</span><span style="color: #00F;">,</span>
      <span style="color: #F00;">&quot;_someVar&quot;</span><span style="color: #00F;">&#91;</span> i <span style="color: #00F;">&#93;</span><span style="color: #00F;">&#91;</span> <span style="color: #800;">4</span> <span style="color: #00F;">&#93;</span><span style="color: #00F;">::</span>BIT<span style="color: #00F;">,</span>
      <span style="color: #F00;">&quot;_someVar&quot;</span><span style="color: #00F;">&#91;</span> i <span style="color: #00F;">&#93;</span><span style="color: #00F;">&#91;</span> <span style="color: #800;">5</span> <span style="color: #00F;">&#93;</span><span style="color: #00F;">::</span>NUMERIC<span style="color: #00F;">,</span>
      <span style="color: #F00;">&quot;_someVar&quot;</span><span style="color: #00F;">&#91;</span> i <span style="color: #00F;">&#93;</span><span style="color: #00F;">&#91;</span> <span style="color: #800;">6</span> <span style="color: #00F;">&#93;</span><span style="color: #00F;">::</span>BYTEA<span style="color: #00F;">,</span>
    <span style="color: #00F;">&#41;</span><span style="color: #00F;">;</span>
&nbsp;
  <span style="color: #00F;">END</span> <span style="color: #00F;">LOOP</span><span style="color: #00F;">;</span></pre></div></div>

<p>Co to jest <em>i</em> ? <em>i</em> jest numerem indeksu, nie musimy go definiować w bloku <strong>DECLARE</strong>, jest on w biegu definiowany.</p>
<p>Jest moc co? Możemy w tablicy przechowywać różnego typu wartości i później w zależności jakiego typu jest dana kolumna, rzutujemy ją do odpowiedniego typu i jazda.</p>
<p>Napisałem powyżej że pętla <em>musi</em> posiadać w sobie warunek skończenia, no właśnie nie musi <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Tzn w zależności w jakim kontekście jej użyjemy.</p>
<h3>Iteracja wyników zapytania</h3>
<p>Definicja pętli:</p>

<div class="wp_syntax"><div class="code"><pre class="plsql" style="font-family:monospace;"><span style="color: #00F;">&#91;</span> <span style="color: #00F;">&lt;&lt;</span>label<span style="color: #00F;">&gt;&gt;</span> <span style="color: #00F;">&#93;</span>
<span style="color: #00F;">FOR</span> target <span style="color: #00F;">IN</span> query <span style="color: #00F;">LOOP</span>
    statements
<span style="color: #00F;">END</span> <span style="color: #00F;">LOOP</span> <span style="color: #00F;">&#91;</span> label <span style="color: #00F;">&#93;</span><span style="color: #00F;">;</span></pre></div></div>

<p>Nie opisałem definicji tych dwóch pętli, gdyż na przykładzie pierwszej, analiza dwóch pozostałych w przykładach powinna być dość prosta.</p>
<p>Dość fajna i ciekawa pętla, która dość często się przydaje, o co chodzi? Mamy sytuacje że na podstawie jednego wiersza i argumentów w nim zawartych musimy zmienić inne wiersze. Przeliczyć jakieś wartości czy cokolwiek innego.</p>

<div class="wp_syntax"><div class="code"><pre class="plsql" style="font-family:monospace;"><span style="color: #00F;">FOR</span> <span style="color: #F00;">&quot;__row&quot;</span> <span style="color: #00F;">IN</span>
  <span style="color: #00F;">SELECT</span>
    <span style="color: #F00;">&quot;someColumn&quot;</span>
  <span style="color: #00F;">FROM</span>
    <span style="color: #F00;">&quot;someTable&quot;</span>
  <span style="color: #00F;">WHERE</span>
    <span style="color: #F00;">&quot;someOtherColumn&quot;</span> <span style="color: #00F;">=</span> <span style="color: #F00;">&quot;someVar&quot;</span> <span style="color: #080; font-style: italic;">-- nie ma tutaj średnika, ważne!</span>
<span style="color: #00F;">LOOP</span>
  PERFORM <span style="color: #F00;">&quot;someFunction&quot;</span><span style="color: #00F;">&#40;</span> <span style="color: #F00;">&quot;__row&quot;</span><span style="color: #00F;">.</span><span style="color: #F00;">&quot;someColumn&quot;</span> <span style="color: #00F;">&#41;</span><span style="color: #00F;">;</span>
<span style="color: #00F;">END</span> <span style="color: #00F;">LOOP</span><span style="color: #00F;">;</span></pre></div></div>

<p>A teraz trochę co się tam dzieje i co jest czym. Od początku. Zmienna <strong>&#8222;__row&#8221;</strong> jest zdefiniowana jako <strong>RECORD</strong> w bloku <strong>DECLARE</strong>. Dzięki takiej definicji możemy wykorzystać ją jako obiekt wiersza w pętli, i obiektowo odwoływać się do kolumn pobranych w zapytaniu poprzez właśnie tą zmienną. Tak jak to widzimy w argumencie funkcji <strong>&#8222;someFunction&#8221;</strong>. Normalnie pobieramy sobie dane w select, podajemy warunki, sortujemy, robimy zwykłego selecta. Następnie iterujemy elementy wyniku zapytania, wiersz po wierszu. W moim przykładzie wywołujemy w pętli inną funkcję która coś robi. Równie dobrze na podstawie tych elementów z wyniku zapytania możemy robić inne rzeczy jak np aktualizacja innych wierszy w bazie itd.</p>
<p>W sumie, to by było na tyle jeżeli chodzi o pętle, są inne sposoby tworzenia pętli, ale nigdy mi one nie były potrzebne, nigdy z nich nie korzystałem. Także zachęcam do manuala. Jak zwykle w linkach poniżej.</p>
<h3>Słów kilka o wydajności</h3>
<p>Jeszcze chciałbym o jednej rzeczy wspomnieć, ponieważ dużo osób upiera się przy stwierdzeniu że założenie przeniesienia logiki aplikacji do sql wcale nie odciąży serwera, po prostu przeniesie środek ciężkości w inne miejsce. Ja się z tym stwierdzeniem nie będę kłócił bo to prawda, i jest jeszcze jedna rzecz która mi nie daje spokoju. Niektórzy z Was twierdzą że funkcje plpgsql będą za bardzo obciążać serwer, pewnie że będą jak się je beznadziejnie napisze.</p>
<p>Bardzo prosty przykład, zwykły warunek (koniunkcja), mamy jakieś dane, i potrafimy stwierdzić że w większości przypadków warunek będzie nieprawdziwy, więc po co w takim razie stawiać ten warunek, który będzie nieprawdziwy na drugim miejscu w koniunkcji? Co innego w alternatywie. Taka prosta rzecz, może szału nie zrobi na prędkości uzyskanej na takiej rzeczy, ale należy o tym pamiętać. Druga rzecz, ilość pamięci wykorzystanej przez funkcje, otóż wiadomą rzeczą jest to że gdy zdefiniujemy masę zmiennych, funkcja napęcznieje, a takie zmienne jak: &#8222;__isSelected&#8221; czy podobnego typu rzeczy można zastąpić w bardzo prosty sposób. Prosty przykład:</p>

<div class="wp_syntax"><div class="code"><pre class="plsql" style="font-family:monospace;">PERFORM
  <span style="color: #800;">1</span>
<span style="color: #00F;">FROM</span>
  <span style="color: #F00;">&quot;someTable&quot;</span>
<span style="color: #00F;">WHERE</span>
  <span style="color: #F00;">&quot;someColumn&quot;</span> <span style="color: #00F;">=</span> <span style="color: #F00;">&quot;_someVar&quot;</span><span style="color: #00F;">;</span>
&nbsp;
<span style="color: #00F;">IF</span> <span style="color: #00F;">NOT</span> FOUND <span style="color: #00F;">THEN</span>
  <span style="color: #00F;">....</span> <span style="color: #080; font-style: italic;">-- coś robimy gdy nie znaleziono</span>
&nbsp;
<span style="color: #00F;">ELSE</span>
  <span style="color: #00F;">...</span> <span style="color: #080; font-style: italic;">-- robimy coś innego</span>
&nbsp;
<span style="color: #00F;">END</span> <span style="color: #00F;">IF</span><span style="color: #00F;">;</span></pre></div></div>

<p>I teraz kolejny przykład przypadku, gdy będziemy wiedzieć że dany warunek w większości przypadków zostanie spełniono to zastąpimy <strong>NOT FOUND</strong>, po prostu <strong>FOUND</strong>, nie ustawiamy żadnych zmiennych, nie nadajemy im wartości, a metoda <strong>PERFORM</strong> jest o tyle fajna, że nie musimy nigdzie przypisywać wartości zwracanych z tego innego <strong>SELCT</strong>&#8216;a.</p>
<p>To by było na tyle tego całego wpisu, mam nadzieje że był interesujący.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/postgresql-plpgsql-cz-3/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PostgreSQL – Ltree cz.2</title>
		<link>http://www.cojack.pl/postgresql-ltree-cz-2</link>
		<comments>http://www.cojack.pl/postgresql-ltree-cz-2#comments</comments>
		<pubDate>Sun, 27 Jun 2010 09:37:08 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[ltree]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=425</guid>
		<description><![CDATA[ Nadeszła w końcu ta chwila, w której miałem wolny czas by usiąść i dokończyć implementację ltree. Udało mi się, uzyskałem to co chciałem, i to na czym by każdemu programiście zależało. Działa tak jak ja chce, a nie tak jak baza chce. Do rzeczy, w ostatnim i zarazem pierwszym ...]]></description>
			<content:encoded><![CDATA[<p><img width="100" height="100" alt="PostgreSQL" src="http://www.cojack.pl/wp-content/arch-postgresql.png" title="PostgreSQL" class="alignleft"> Nadeszła w końcu ta chwila, w której miałem wolny czas by usiąść i dokończyć implementację ltree. Udało mi się, uzyskałem to co chciałem, i to na czym by każdemu programiście zależało. Działa tak jak ja chce, a nie tak jak baza chce. Do rzeczy, w ostatnim i zarazem pierwszym wpisie o ltree w postgresie nie mogłem sobie poradzić z sortowaniem, kombinowałem razem z depeszem jak by go tu posortować, w końcu jakieś rozwiązanie padło. Tylko te rozwiązanie depesz wziął z swojej struktury drzewiastej, otóż mówię temu stanowcze NIE! Dlaczego? Ltree zostało napisane po to by nie robić nic rekursywnie, to po prostu miażdży podejście do drzew w każdym calu, żadne nested sety i inne śmiecie z rightem i leftem. Tam to idzie zęby połamać a nie to ugryźć. Poza tym jest to mało optymalne, to już wolę id, parent_id (taki joke).</p>
<h3>Sortowanie w ltree</h3>
<p>Rozwiązanie było bliżej niż można było się tego spodziewać. Miałem z trylion pomysłów jak to rozkminić. Pomyślałem o liczbie rzeczywistej której każda kolejna część po przecinku będzie przedstawiała nr zagłębienia, tylko to nie jest tak łatwo oprogramować i mogłyby wyjść niezłe kaszany, także odpuściłem sobie to. I olśniło mnie ARRAY! No jacha! To przecież jest tak proste i oczywiste że nie wiem o czym my rozmawiamy. Sam sobie ten problem urodziłem, a powodem tego było iż nikt wcześniej nie pisał o tym, w necie to nawet nie ma słowa o tym module, parę rzeczy znajdziemy w manualu i stronie twórców.  Ale nikt nie pokwapił się z implementacją tego z sortowaniem i się nie podzielił.</p>
<h3>Implementacja ltree z sortowaniem</h3>
<p>Otóż sprawa jest banalnie prosta (teraz już jest):</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">&quot;category&quot;</span> <span style="color: #66cc66;">&#40;</span>
   <span style="color: #ff0000;">&quot;idCategory&quot;</span>  SERIAL <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;categoryPath&quot;</span>   LTREE<span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;ordering&quot;</span> INT<span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span>
<span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>I mógłbym powiedzieć amen. Alę dodam jeszcze:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Science'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,1}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Science.Astronomy'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,1,1}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Science.Astronomy.Astrophysics'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,1,1,1}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Science.Astronomy.Cosmology'</span><span style="color: #66cc66;">.</span> <span style="color: #ff0000;">'{1,1,1,2}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Science.Astronomy.Planets'</span><span style="color: #66cc66;">.</span> <span style="color: #ff0000;">'{1,1,1,3}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Hobbies'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,2}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Hobbies.Amateurs_Astronomy'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,2,1}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Hobbies.Swiming'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,2,2}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Hobbies.Football'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,2,3}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Hobbies.Chess'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,2,4}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Hobbies.Basketball'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,2,5}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Hobbies.Voleyball'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,2,6}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Hobbies.Checkers'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,2,7}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Hobbies.Cards'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,2,8}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Hobbies.Skis'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,2,9}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Hobbies.Post_Cards'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,2,10}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Hobbies.Book'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,2,11}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,3}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections.Pictures'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,3,1}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections.Pictures.Astronomy'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,3,1,1}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections.Pictures.Astronomy.Stars'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,3,1,1,1}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections.Pictures.Astronomy.Galaxies'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,3,1,1,2}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections.Pictures.Astronomy.Astronauts'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,3,1,1,3}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections.Pictures.Astronomy.Planets'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,3,1,1,4}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections.Pictures.Astronomy.Sun'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,3,1,1,5}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections.Pictures.Astronomy.Earth'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,3,1,1,6}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections.Pictures.Astronomy.Asteroids'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,3,1,1,7}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections.Pictures.Astronomy.UFO'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,3,1,1,8}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections.Pictures.Astronomy.Milk_Way'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,3,1,1,9}'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections.Pictures.Astronomy.Space_Ships'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,3,1,1,10}'</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>To powyżej to demo do tabeli, o zapomniałbym o indeksach:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">INDEX</span> <span style="color: #ff0000;">&quot;categoryPath_gist_idx&quot;</span> <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #ff0000;">&quot;category&quot;</span> <span style="color: #993333; font-weight: bold;">USING</span> gist<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">INDEX</span> <span style="color: #ff0000;">&quot;categoryPath_idx&quot;</span> <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #ff0000;">&quot;category&quot;</span> <span style="color: #993333; font-weight: bold;">USING</span> btree<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">INDEX</span> <span style="color: #ff0000;">&quot;ordering_gist_idx&quot;</span> <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #ff0000;">&quot;category&quot;</span> <span style="color: #993333; font-weight: bold;">USING</span> gist<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">INDEX</span> <span style="color: #ff0000;">&quot;ordering_idx&quot;</span> <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #ff0000;">&quot;category&quot;</span> <span style="color: #993333; font-weight: bold;">USING</span> btree<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span> <span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>I sobie protestujcie sami jak to świetnie działa. W następnym i przy okazji ostatnim wpisie o ltree, przedstawię wszystkie metody do zarządzania drzewem, oraz widoki.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/postgresql-ltree-cz-2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PostgreSQL &#8211; PL/pgSQL cz.2</title>
		<link>http://www.cojack.pl/postgresql-plpgsql-cz-2</link>
		<comments>http://www.cojack.pl/postgresql-plpgsql-cz-2#comments</comments>
		<pubDate>Sat, 05 Jun 2010 14:55:33 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[PL/pgSQL]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=416</guid>
		<description><![CDATA[ Ostatni wpis dotyczył postgresa i zgadnijcie czego będzie dotyczył ten. Otóż dzisiaj chciałbym napisać o instrukcjach warunkowych i pętlach. Sprawa może się wydawać banalne, ale oczywiście nie musi. Dlaczego? Ponieważ instrukcje warunkowe to nic jak najzwyklejsze IF &#8230; ELSE IF &#8230; ELSE. Oprócz tego postgres udostępnia nam inne opcje ...]]></description>
			<content:encoded><![CDATA[<p><img width="100" height="100" class="alignleft" title="PostgreSQL" src="http://www.cojack.pl/wp-content/arch-postgresql.png" alt="PostgreSQL"> Ostatni wpis dotyczył postgresa i zgadnijcie czego będzie dotyczył ten. Otóż dzisiaj chciałbym napisać o instrukcjach warunkowych i pętlach. Sprawa może się wydawać banalne, ale oczywiście nie musi. Dlaczego? Ponieważ instrukcje warunkowe to nic jak najzwyklejsze IF &#8230; ELSE IF &#8230; ELSE. Oprócz tego postgres udostępnia nam inne opcje warunków które możemy wykorzystać w zapytaniach sql a mowa tutaj o CASE. A teraz dwa słowa o pętlach. Te bynajmniej ni w ząb ni w pietruchę nie są podobne do niczego. Składnia zwykłego LOOP w postgresie to powiedzmy samo LOOP &#8230; END LOOP, ha a gdzie warunki co? Otóż do tego zaraz przejdziemy.</p>
<h3>Instrukcje warunkowe</h3>
<p>Ten dział będzie poświęcony po prostu warunkom. Otóż jak wyżej wspomniałem w postgresie możemy stosować różnego rodzaju warunki, począwszy od IFów poprzez <strong>CASE </strong>skończywszy na <strong>COALESCE</strong> lub nie.<br />
 Popatrzmy na przykład użycia IFa w funkcji:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span><span style="color: #66cc66;">.....</span> RETURNS VOID <span style="color: #993333; font-weight: bold;">AS</span> $BODY$
  BEGIN
    <span style="color: #993333; font-weight: bold;">SELECT</span>
      <span style="color: #66cc66;">....</span>
    <span style="color: #993333; font-weight: bold;">FROM</span>
      <span style="color: #66cc66;">...</span>
    <span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #66cc66;">....</span>;
&nbsp;
    <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">NOT</span> FOUND THEN
      <span style="color: #808080; font-style: italic;">-- coś tu robimy jak nie znaleziono</span>
    ELSE
      <span style="color: #808080; font-style: italic;">-- w innym wypadku co innego lub kończymy RETURNem</span>
    END <span style="color: #993333; font-weight: bold;">IF</span>;
  END;
$BODY$ <span style="color: #993333; font-weight: bold;">LANGUAGE</span> <span style="color: #ff0000;">'plpgsql'</span>;</pre></div></div>

<p>Jak widać składnia IFa jest trochę podobna do tej której znamy z innych języków z tym że tutaj mamy słowo kluczowe <strong>THEN</strong>, które nie w każdym języku jest (bodajże w pascalu było ale mi się szukać nie chce). Kończywszy IFa musimy użyć składni <strong>END IF;</strong> Jak widać nie mamy tutaj żadnych klamer, dlatego ważne jest by stosować wcięcia przy kodowaniu by się samemu nie pogubić w zagłębieniach kodu. Taki kod od razu staje się czytelniejszy.</p>
<p>Jak widać dzięki takim rozwiązaniom ograniczymy się do wywołania tylko jednej funkcji z kodu php, dzięki temu i kod staje się czytelniejszy, w ten sposób można przerzucić pewną cześć logiki aplikacji na bazę danych, co w znacznym stopniu ułatwia pracę (ale i też może utrudnić, o tym później). Nie chce też znowu wałkować manuala, dlatego link do instrukcji warunkowych znajdziecie na dole, ale co jest ważne, konstrukcja musi zwrócić wartość BOOLEAN, ale to jest chyba oczywiste. W postgresie nie mamy znaku porównania tak jak w innych językach, a chodzi mi o podwójny znak równa się <strong>==</strong>, tutaj jest tylko pojedynczy znak równa się. No i teraz, kiedy rozróżnić oba te znaki? Otóż bardzo prosto, porównanie jest tylko i wyłącznie w konstrukcjach warunkowych, użycie znaku równa się w postaci:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #ff0000;">&quot;_someVar&quot;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;someVar2&quot;</span>;</pre></div></div>

<p>Jest niczym innym jak przypisaniem, i tak samo jak w każdym innym języku programowania jest l-value i r-value, ale o tym już kiedyś wspominałem, także nie będę tego przytaczał ponownie. Jest także inna konstrukcja która pozwoli nam przypisywać wartość zmiennej. Może ktoś z Was kojarzy język &#8222;Prolog&#8221;? Jak nie to nie ważne, ale w nim jest użyty taki przełącznik warunkowy &#8222;:-&#8221; a w postgresie mamy &#8222;:=&#8221; jako alias do &#8222;=&#8221; z tym że jest to tylko i wyłącznie przypisanie wartości do zmiennej. Także zachęcam Was do używania takiej oto konstrukcji przypisywania:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #ff0000;">&quot;_someVar&quot;</span> :<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;someVar2&quot;</span>;</pre></div></div>

<p>Jest ona czytelna, i oczywista, z niczym innym się kojarzyć nie może jak z przypisaniem.</p>
<p>Wracając do konstrukcji warunkowych to pozostało nam do opisania jeszcze <strong>CASE</strong>, jest to po prostu cudowna rzecz, coś wspaniałego, gdyż używanie IFów w SELECTcie jest po prostu mało czytelne i niewygodne. Dlatego dostaliśmy <strong>CASE</strong>, taki postgresowy switch. Do rzeczy, składnia <strong>CASE</strong> jest dwojaka:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">CASE WHEN condition THEN result
     <span style="color: #66cc66;">&#91;</span>WHEN <span style="color: #66cc66;">...</span><span style="color: #66cc66;">&#93;</span>
     <span style="color: #66cc66;">&#91;</span>ELSE result<span style="color: #66cc66;">&#93;</span>
END</pre></div></div>

<p>albo:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">CASE expression
    WHEN value THEN result
    <span style="color: #66cc66;">&#91;</span>WHEN <span style="color: #66cc66;">...</span><span style="color: #66cc66;">&#93;</span>
    <span style="color: #66cc66;">&#91;</span>ELSE result<span style="color: #66cc66;">&#93;</span>
END</pre></div></div>

<p>W zależności od potrzeb, używamy jednej z nich, ale mała podpowiedź kiedy którą wybrać, otóż gdy mamy warunek na danej kolumnie to lepiej wybrać wariant drugi, podając tą kolumnę jako <u>expression</u>, gdy mamy parę warunków na różnych kolumnach łatwiej jest wtedy operować nimi na pierwszym przykładzie, przykłady w manualau, a ja dwa słowa o wyniku z <strong>THEN</strong>, otóż podana fraza w THEN zostanie bezwzględnie dorzucona do wyniku zapytania, czyli dzięki temu w THEN możemy podać np nazwę kolumny jaką byśmy chcieli pobrać w zależności o warunku, który zostanie spełniony. nie sprawdzałem ale pewnie też z tego poziomu można by wywołać funkcję. Warto spróbować kiedyś.</p>
<p>To by było tyle na temat CASE i IF, oprócz tego mamy jeszcze takie funkcje jak <strong>NULLIF</strong>, <strong>COALESCE</strong>, <strong>GREATEST</strong> i <strong>LEAST</strong>. Krótko o tych funkcjach:</p>
<p><strong>COALESCE</strong>: Konstrukcja COALESCE(value [, ...]). Zwraca pierwszy argument który nie jest NULLem.<br />
<strong>NULLIF</strong>: Konstrukcja NULLIF(value1, value2). Zwraca NULL gdy value1 jest równe value2.<br />
<strong>GREATEST</strong>: Konstrukcja GREATEST(value [, ...]). Zwraca największą wartość z listy argumentów.<br />
<strong>LEAST</strong>: Konstrukcja jak powyżej, tylko działa na odwrót.</p>
<h3>Pętle</h3>
<p>Do zobaczenia w przyszłym wpisie pętelki moje kochane.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/postgresql-plpgsql-cz-2/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PostgreSQL &#8211; PL/pgSQL</title>
		<link>http://www.cojack.pl/postgresql-plpgsql</link>
		<comments>http://www.cojack.pl/postgresql-plpgsql#comments</comments>
		<pubDate>Sun, 23 May 2010 09:15:53 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[PL/pgSQL]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=402</guid>
		<description><![CDATA[ Poniższy tutorial będzie wprowadzeniem do epizodu tutoriali o języku skryptowym (proceduralnym) PL/pgSQL. Język pl/sql został wymyślony przez Oracle, jego prostota i zarazem potężna siła daje nam wszystko czego potrzeba nam do pracy z postgresql. Język ten pozwala nam na wiele więcej działań niż sam SQL, począwszy od deklaracji zmiennych ...]]></description>
			<content:encoded><![CDATA[<p><img width="100" height="100" class="alignleft" title="PostgreSQL" src="http://www.cojack.pl/wp-content/arch-postgresql.png" alt="PosgreSQL"> Poniższy tutorial będzie wprowadzeniem do epizodu tutoriali o języku skryptowym (proceduralnym) <strong>PL/pgSQL</strong>. Język pl/sql został wymyślony przez Oracle, jego prostota i zarazem potężna siła daje nam wszystko czego potrzeba nam do pracy z postgresql. Język ten pozwala nam na wiele więcej działań niż sam SQL, począwszy od deklaracji zmiennych poprzez pętle skończywszy na triggerach (albo i nie).</p>
<h3>Wprowadzenie do PL/pgSQL</h3>
<p>Krótki i w miarę logicznie opisanym słowem wstępu jest artykuł na wiki o <strong>PL/pgSQL</strong>, link poniżej. Lecz ja chciałbym to omówić po swojemu, tak by każdy z Was to zrozumiał i przekonał się nad wielkością tego języka, zaczynajmy.<br />
Tak jak nam mówi manual składnia funkcji jest następująca:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">FUNCTION</span> <span style="color: #ff0000;">&quot;nazwaFunkcji&quot;</span><span style="color: #66cc66;">&#40;</span> argumenty <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">...</span> <span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#41;</span> RETURNS <span style="color: #66cc66;">&#91;</span>typZwracanegoObiektu<span style="color: #66cc66;">&#93;</span> <span style="color: #993333; font-weight: bold;">AS</span> $BODY$
  DECLARE <span style="color: #808080; font-style: italic;">-- blok nie obowiązkowy</span>
    <span style="color: #808080; font-style: italic;">-- Możemy w tym bloku definiować zmienne, w &quot;locie&quot; zmiennych definiować nie możemy </span>
  BEGIN
    <span style="color: #808080; font-style: italic;">-- ciało funkcji</span>
&nbsp;
    <span style="color: #993333; font-weight: bold;">RETURN</span> <span style="color: #66cc66;">&#91;</span>zwracanyObiekt<span style="color: #66cc66;">&#93;</span> <span style="color: #808080; font-style: italic;">-- klauzula prawie nie obowiązkowa, o tym poniżej</span>
  END;
$BODY$ <span style="color: #993333; font-weight: bold;">LANGUAGE</span> <span style="color: #ff0000;">'plpgsql'</span>;</pre></div></div>

<p>Tak mniej więcej przedstawia się schemat konstrukcji funkcji w <strong>PL/pgSQL</strong>,  Pominąłem kwestię bloków w bloku, w sensie że w bloku BEGIN &#8230; END możemy zdefiniować kolejny blok kodu. Nigdy mi to nie było jeszcze potrzebne, i wątpię by Wam było, to jest pewnego rodzaju przerost formy nad treścią. Jak widać stosuje tutaj podwójne dolary w sensie <u>$BODY$</u>, można się zapytać dlaczego? Otóż nie musicie stosować podwójnych dolarów zamiast nich możecie zrobić po prostu AS &#8216; &#8212; i tutaj reszta kodu. Tylko nie wiem czy stać Was na nerwy stracone przy escepowaniu znaków. Otóż przy podwójnych dolarach możemy zachować taką konstrukcję:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> users <span style="color: #993333; font-weight: bold;">WHERE</span> f_name<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'foobar'</span>;</pre></div></div>

<p>Natomiast przy konstrucji z apostrofem:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> users <span style="color: #993333; font-weight: bold;">WHERE</span> f_name<span style="color: #66cc66;">=</span><span style="color: #ff0000;">''</span>foobar<span style="color: #ff0000;">''</span>;</pre></div></div>

<p>Tam nie ma cudzysłowu przy foobar tylko podwójny apostrof. Także używajcie sobie czego chcecie, do woli. A i jeszcze jedno, to co sobie wstawicie pomiędzy podwójne dolarki nie ma znaczenia, ja wyniosłem z pracy nawyk wstawiania tam nazwy funkcji, co mi się osobiście trochę mało podoba, no ale nawyk pozostał. Przedstawiona przeze mnie powyżej konstrukcja nie jest oczywiście odzwierciedleniem tej z manuala, gdyż jest mało jasna, i rzadko się używa np CREATE OR REPLACE gdy co chwilę zmieniamy typy zmiennych przesyłanych w liście argumentów.</p>
<h3>Argumenty funkcji PL/pgSQL</h3>
<p>Lista argumentów może być podawana dwojako, a nawet trzyjako. Pierwszym z sposobów podawania argumentów do funkcji jest:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">CREAT<span style="color: #66cc66;">....</span> <span style="color: #ff0000;">&quot;nazwaFunkcji&quot;</span> <span style="color: #66cc66;">&#40;</span> INT<span style="color: #66cc66;">,</span> NUMERIC<span style="color: #66cc66;">,</span> TEXT<span style="color: #66cc66;">,</span> VARCHAR <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">....</span> $BODY$
  DECLARE
    <span style="color: #ff0000;">&quot;_nazwaZmiennejInt&quot;</span> ALIAS <span style="color: #993333; font-weight: bold;">FOR</span> $<span style="color: #cc66cc;">1</span>;
    <span style="color: #ff0000;">&quot;_nazwaZmiennejNumeric&quot;</span> ALIAS <span style="color: #993333; font-weight: bold;">FOR</span> $<span style="color: #cc66cc;">2</span>;
    <span style="color: #ff0000;">&quot;_nazwaZmiennejText&quot;</span> ALIAS <span style="color: #993333; font-weight: bold;">FOR</span> $<span style="color: #cc66cc;">3</span>;
    <span style="color: #ff0000;">&quot;_nazwaZmiennejVarchar&quot;</span> ALIAS <span style="color: #993333; font-weight: bold;">FOR</span> $<span style="color: #cc66cc;">4</span>;
  BEGIN
   <span style="color: #66cc66;">....</span></pre></div></div>

<p>drugi sposób:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">CREAT<span style="color: #66cc66;">....</span> <span style="color: #ff0000;">&quot;nazwaFunkcji&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;_nazwaZmiennejInt&quot;</span> INT<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;_nazwaZmiennejNumeric&quot;</span> NUMERIC<span style="color: #66cc66;">,</span>  <span style="color: #ff0000;">&quot;_nazwaZmiennejText&quot;</span> TEXT<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;_nazwaZmiennejVarchar&quot;</span> VARCHAR <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">....</span> $BODY$</pre></div></div>

<p>trzeci sposób:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">CREAT<span style="color: #66cc66;">....</span> <span style="color: #ff0000;">&quot;nazwaFunkcji&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;_nazwaZmiennejInt&quot;</span> INT<span style="color: #66cc66;">,</span> OUT <span style="color: #ff0000;">&quot;_nazwZwracanejZmiennej&quot;</span> INT<span style="color: #66cc66;">,</span> OUT <span style="color: #ff0000;">&quot;_nazwaZwracanejZmiennej2&quot;</span> INT <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">....</span> $BODY$</pre></div></div>

<p>Dzięki tej trzeciej metodzie możemy zwracać więcej niż jeden argument. Możemy też definiować typy zmiennych i też je zwracać o tym zraz.</p>
<h3>Zwracane typy</h3>
<p>Tak jak wyżej napisałem funkcje PostgreSQL mogą zwracać typy danych które też sami zdefiniujemy, metody mogą zwracać zarówno typ VOID, jeżeli nie potrzebujemy niczego zwrócić to po prostu ustawiamy <strong>RETURNS VOID</strong> i dzięki takiej konstrukcji klauzula <strong>RETURN</strong> w ciele kodu jest niewymagana, proste nie?<br />
PostgreSQL to nie PHP, źle mu prześlesz typ danych zdefiniowany jako INT a prześlesz jako &#8217;1&#8242; i będzie to string, w PHP to przejdzie ale w postgre nie. Więc tutaj musimy się pilnować jeżeli chodzi o przesyłanie zmiennych. To samo tyczy się wszystkich typów oraz tych zwracanych, jeżeli w końcowej wersji uzyskamy inny typ niż ten który zdefiniowaliśmy to dostaniemy błędem po oczach próbując przypisać np NUMERIC do INT i w sumie funkcja się nie wykona, nic nie zwróci a weź to debuguj :></p>
<h4> Przykłady </h4>
<p>A teraz prosty przykładzik:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">&quot;foo&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;id&quot;</span> SERIAL<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;bar&quot;</span> TEXT <span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">FUNCTION</span> <span style="color: #ff0000;">&quot;fooBar&quot;</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;_bar&quot;</span> TEXT <span style="color: #66cc66;">&#41;</span> RETURNS VOID <span style="color: #993333; font-weight: bold;">AS</span> $$
  BEGIN
    <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span>
      <span style="color: #ff0000;">&quot;foo&quot;</span>
    <span style="color: #66cc66;">&#40;</span>
      <span style="color: #ff0000;">&quot;bar&quot;</span>
    <span style="color: #66cc66;">&#41;</span>
    <span style="color: #993333; font-weight: bold;">VALUES</span>
    <span style="color: #66cc66;">&#40;</span>
      <span style="color: #ff0000;">&quot;_bar&quot;</span>
    <span style="color: #66cc66;">&#41;</span>;
  END;
$$ <span style="color: #993333; font-weight: bold;">LANGUAGE</span> <span style="color: #ff0000;">'plpgsql'</span>;</pre></div></div>

<p>I teraz przykład użycia:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #ff0000;">&quot;fooBar&quot;</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'Terefere'</span> <span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Wykonanie takiego zapytania odpali nam naszą funkcję i wykonana kod w ciele metody.</p>
<h4>Parę słów na zakończenie</h4>
<p>To był pierwszy wpis z cyklu poświęconego językowi <strong>PL/pgSQL</strong>, temat jest szeroki jak rzeka i głęboki jak morze. Nie da się wszystkie na raz opisać, nie da się wszystkiego przedstawić i omówić szczegółowo. Następne wpisy będą dotyczyły instrukcji warunkowych oraz pętli. Wszystko możecie oczywiście znaleźć pod linkiem w stopce. Zapomniałbym wszystko co tutaj jest opisywane jest testowane pod najnowszą ver. oznaczoną numerkiem 8.4. Gdy wyjdzie nowsza i w repo będzie siedzieć to poinformuje o zmianie.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/postgresql-plpgsql/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PostgreSQL &#8211; View czyli Widok</title>
		<link>http://www.cojack.pl/postgresql-view-czyli-widok</link>
		<comments>http://www.cojack.pl/postgresql-view-czyli-widok#comments</comments>
		<pubDate>Sun, 21 Mar 2010 17:20:30 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[view]]></category>
		<category><![CDATA[widok]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=357</guid>
		<description><![CDATA[Ostatnimi czasy coś nie mam weny by napisać cokolwiek na blogu, także postanowiłem tym razem coś może o postgresql napisać i jego własnościach tudzież mowa o widokach w postgresql. Rzecz biorąc czym jest widok? Widok jest niczym innym jak zapytaniem kryjącym się pod krótką nazwą, jak pisałem w wcześniejszej notce ...]]></description>
			<content:encoded><![CDATA[<p><img width="100" height="100" alt="" src="http://www.cojack.pl/wp-content/arch-postgresql.png" title="PostgreSQL" class="alignleft">Ostatnimi czasy coś nie mam weny by napisać cokolwiek na blogu, także postanowiłem tym razem coś może o postgresql napisać i jego własnościach tudzież mowa o widokach w postgresql. Rzecz biorąc czym jest widok? Widok jest niczym innym jak zapytaniem kryjącym się pod krótką nazwą, jak pisałem w wcześniejszej notce o RBAC cz.3 z pewnego zapytania można było utworzyć sobie widok. Może więcej szczegółów technicznych, składnia widoku ma się tak:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #66cc66;">&#91;</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #993333; font-weight: bold;">REPLACE</span> <span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#91;</span> TEMP <span style="color: #66cc66;">|</span> <span style="color: #993333; font-weight: bold;">TEMPORARY</span> <span style="color: #66cc66;">&#93;</span> <span style="color: #993333; font-weight: bold;">VIEW</span> name <span style="color: #66cc66;">&#91;</span> <span style="color: #66cc66;">&#40;</span> column_name <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">...</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#93;</span>
    <span style="color: #993333; font-weight: bold;">AS</span> query</pre></div></div>

<p>Sama składnia może się wydawać prosta choć nie musi ;] składnia podana w nawiasach kwadratowych jest opcjonalna. Prze zemnie rzadko wykorzystywana, bo nie tworzę jakiś tymczasowych widoków, nie zapisuję widoku do innego schematu niż ten w którym się znajduję ani też nie używam OR REPLACE gdyż jak instaluje na nowo to drop db i amba. </p>
<p>Teraz może co do samej składni</p>
<p><strong>OR REPLACE</strong> &#8211; co dziwnego o tym piszą w manualu, to się można dowiedzieć na stronie podanej poniżej. Ale przytoczę fragment.</p>
<blockquote><p>CREATE OR REPLACE VIEW is similar, but if a view of the same name already exists, it is replaced. The new query must generate the same columns that were generated by the existing view query (that is, the same column names in the same order and with the same data types), but it may add additional columns to the end of the list. The calculations giving rise to the output columns may be completely different. </p></blockquote>
<p>I teraz pytanie, po czorta w takim razie OR REPLACE jeżeli zmienimy sobie całkowicie widok a pozostawimy tą samą nazwę, trochę dziwna akcja, chociaż może nas to też z jednej strony zabezpieczać przed nałogowym wstawianiu OR REPLACE i nie daj Bóg strzelimy gdzieś dwa takie same nazwy widoków, hmmm w sumie może i dobrze.</p>
<p>Przykład jakiegoś widoku? Proszę bardzo, z naszego RBAC&#8217;a z zapytania sprawdzającego uprawnienia, zróbmy sobie teraz widok:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">VIEW</span> <span style="color: #ff0000;">&quot;checkRightView&quot;</span> <span style="color: #993333; font-weight: bold;">AS</span>
<span style="color: #993333; font-weight: bold;">SELECT</span> 
  <span style="color: #ff0000;">&quot;allow&quot;</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">&quot;u2g&quot;</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idUser&quot;</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">&quot;m&quot;</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;moduleName&quot;</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">&quot;a&quot;</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;actionName&quot;</span>
<span style="color: #993333; font-weight: bold;">FROM</span> 
  <span style="color: #ff0000;">&quot;rbac_privilages&quot;</span> p 
<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> 
  <span style="color: #ff0000;">&quot;rbac_module&quot;</span> m 
<span style="color: #993333; font-weight: bold;">ON</span> 
  <span style="color: #66cc66;">&#40;</span> p<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idModule&quot;</span> <span style="color: #66cc66;">=</span> m<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idModule&quot;</span> <span style="color: #66cc66;">&#41;</span> 
<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> 
  <span style="color: #ff0000;">&quot;rbac_action&quot;</span> a 
<span style="color: #993333; font-weight: bold;">ON</span> 
  <span style="color: #66cc66;">&#40;</span> p<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idAction&quot;</span> <span style="color: #66cc66;">=</span> a<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idAction&quot;</span> <span style="color: #66cc66;">&#41;</span> 
<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> 
  <span style="color: #ff0000;">&quot;rbac_user_to_group&quot;</span> u2g 
<span style="color: #993333; font-weight: bold;">ON</span> 
  <span style="color: #66cc66;">&#40;</span> p<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idGroup&quot;</span> <span style="color: #66cc66;">=</span> u2g<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idGroup&quot;</span> <span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Dodaliśmy tylko nagłówek create view i ucięliśmy klauzule where, a teraz przykład jak takiego widoku użyć:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> 
  <span style="color: #ff0000;">&quot;cRV&quot;</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;allow&quot;</span>
<span style="color: #993333; font-weight: bold;">FROM</span> 
  <span style="color: #ff0000;">&quot;checkRightView&quot;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;cRV&quot;</span>  <span style="color: #808080; font-style: italic;">-- prawie jak honda ^^</span>
<span style="color: #993333; font-weight: bold;">WHERE</span> 
  <span style="color: #ff0000;">&quot;cRV&quot;</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idUser&quot;</span> <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">2</span> 
<span style="color: #993333; font-weight: bold;">AND</span> 
  <span style="color: #ff0000;">&quot;cRV&quot;</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;moduleName&quot;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'music'</span> 
<span style="color: #993333; font-weight: bold;">AND</span> 
  <span style="color: #ff0000;">&quot;cRV&quot;</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;actionName&quot;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'index'</span>;</pre></div></div>

<p>Tadam, proste prawda? Tworzenie widoków można by porównać do polimorfizmu, lecz nim nie jest. Co nam to daje? Na pewno przejrzyste zapytania sql, co do debugowania to w sql zawsze był z tym problem, dlatego przed utworzeniem widoku pierw lepiej sprawdzić czy zapytanie śmiga.</p>
<p>Co do ograniczeń widoku, wiążą się z tym pewne niedogodności, gdyż jak widać by mieć dostęp do tabel łączonych w zapytaniu, trzeba pobrać ich elementy w samym zapytaniu (w widoku) by mieć do nich dostęp przy wywoływaniu widoku. Cóż jak to uważam za pewne ograniczenia, czy nim jest teoretycznie? Nie mam takiej wiedzy by to stwierdzić.</p>
<p>Mam nadzieję że ta krótka notka pomoże nie którym zgłębić swoją wiedzę.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/postgresql-view-czyli-widok/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Role Based Access Control cz.2</title>
		<link>http://www.cojack.pl/role-based-access-control-cz-2</link>
		<comments>http://www.cojack.pl/role-based-access-control-cz-2#comments</comments>
		<pubDate>Tue, 19 Jan 2010 19:57:11 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[rbac]]></category>
		<category><![CDATA[role based access control]]></category>
		<category><![CDATA[uprawnienia]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=319</guid>
		<description><![CDATA[ Nadszedł czas na pierwszą implementację tej struktury w sql, oczywiście nie jest to czego byśmy oczekiwali ponieważ ma pewne braki które mogły by się wydawać dla większego użytku wprost odwrotnie proporcjonalne do zastosowania role based access control. Otóż jest trochę uproszczona struktura, dlaczego? Mieliśmy w pracy z kolegą burzę ...]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="PostgreSQL" src="http://www.cojack.pl/wp-content/arch-postgresql.png" alt="" height="100" width="100"> Nadszedł czas na pierwszą implementację tej struktury w sql, oczywiście nie jest to czego byśmy oczekiwali ponieważ ma pewne braki które mogły by się wydawać dla większego użytku wprost odwrotnie proporcjonalne do zastosowania <strong>role based access control</strong>. Otóż jest trochę uproszczona struktura, dlaczego? Mieliśmy w pracy z kolegą burzę mózgów na ten temat gdyż go bardzo zainteresował i doszedł do wniosku iż konstruowanie kolosa może mieć negatywny wpływ na jego interfejs, i prawdę powiedziawszy po głębszym zastanowieniu się oraz doświadczeniu wyniesionym z używania phpbb (taki skrypt forum) doszedłem do wniosku iż ma chłop rację. Więc na pierwszy ogień skonstruowaliśmy taką oto strukturę rbac&#8217;a, ale moje ego nie pozwala mi na zakończenie prac nad tym i będę kontynuował rozwój do takiego stopnia że stwierdzę iż większego kolosa się zbudować nie da ponieważ zawiera już wszystko. </p>
<h3>Struktura SQL Role Based Access Control</h3>
<p>Także do dzieła, struktura bazy danych:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">BEGIN;
&nbsp;
<span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">&quot;rbac_user&quot;</span> CASCADE;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">&quot;rbac_user&quot;</span>
<span style="color: #66cc66;">&#40;</span>
   <span style="color: #ff0000;">&quot;idUser&quot;</span> SERIAL <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;userName&quot;</span> VARCHAR<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">255</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span>
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">&quot;rbac_group&quot;</span> CASCADE;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">&quot;rbac_group&quot;</span>
<span style="color: #66cc66;">&#40;</span>
   <span style="color: #ff0000;">&quot;idGroup&quot;</span> SERIAL <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;groupName&quot;</span> VARCHAR<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">255</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNIQUE</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span>
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">&quot;rbac_user_to_group&quot;</span>;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">&quot;rbac_user_to_group&quot;</span>
<span style="color: #66cc66;">&#40;</span>
   <span style="color: #ff0000;">&quot;idUser&quot;</span> INT <span style="color: #993333; font-weight: bold;">REFERENCES</span> <span style="color: #ff0000;">&quot;rbac_user&quot;</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;idUser&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;idGroup&quot;</span> INT <span style="color: #993333; font-weight: bold;">REFERENCES</span> <span style="color: #ff0000;">&quot;rbac_group&quot;</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;idGroup&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
   <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;idUser&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;idGroup&quot;</span> <span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">&quot;rbac_module&quot;</span> CASCADE;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">&quot;rbac_module&quot;</span>
<span style="color: #66cc66;">&#40;</span>
   <span style="color: #ff0000;">&quot;idModule&quot;</span> SERIAL <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;moduleName&quot;</span> VARCHAR<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">255</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNIQUE</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span>
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">&quot;rbac_action&quot;</span> CASCADE;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">&quot;rbac_action&quot;</span>
<span style="color: #66cc66;">&#40;</span>
   <span style="color: #ff0000;">&quot;idAction&quot;</span> SERIAL <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;idModule&quot;</span> INT <span style="color: #993333; font-weight: bold;">REFERENCES</span> <span style="color: #ff0000;">&quot;rbac_module&quot;</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;idModule&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;actionName&quot;</span> VARCHAR<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">255</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;inherited&quot;</span> <span style="color: #993333; font-weight: bold;">BOOLEAN</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> FALSE <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
   <span style="color: #993333; font-weight: bold;">UNIQUE</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;actionName&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;idModule&quot;</span> <span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">&quot;rbac_privilages&quot;</span>;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">&quot;rbac_privilages&quot;</span>
<span style="color: #66cc66;">&#40;</span>
   <span style="color: #ff0000;">&quot;idGroup&quot;</span> INT <span style="color: #993333; font-weight: bold;">REFERENCES</span> <span style="color: #ff0000;">&quot;rbac_group&quot;</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;idGroup&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;idModule&quot;</span> INT <span style="color: #993333; font-weight: bold;">REFERENCES</span> <span style="color: #ff0000;">&quot;rbac_module&quot;</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;idModule&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;idAction&quot;</span> INT <span style="color: #993333; font-weight: bold;">REFERENCES</span> <span style="color: #ff0000;">&quot;rbac_action&quot;</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;idAction&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;allow&quot;</span> <span style="color: #993333; font-weight: bold;">BOOLEAN</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> FALSE <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
   <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;idGroup&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;idModule&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;idAction&quot;</span> <span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
COMMIT;</pre></div></div>

<p>Użyłem transakcji, w posgresql można <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  W MySQL też, pod warunkiem że typ tabeli to InnoDB. Ale nie teraz o tym rzecz. Co jest co?</p>
<p><strong>rbac_user</strong> &#8211; tabela przechowująca użytkowników naszego systemu<br />
<strong>rbac_group</strong> &#8211; tabela przechowująca grupy w naszym systemie<br />
<strong>rbac_user_to_group</strong> &#8211; tabela wiążąca użytkowników z grupami, relacja typu many-to-many (wiele do wielu)<br />
<strong>rbac_module</strong> &#8211; tabela przechowująca nazwy naszych modułów, można to rozumieć jako controllery naszej aplikacji<br />
<strong>rbac_action</strong> &#8211; tabela przechowująca nazwy naszych akcji, trzeba to rozumieć jako metody w naszych controllerach, relacja typu many-to-one (wiele do jednego, to samo co jeden do wielu [one-to-many])<br />
<strong>rbac_privilages</strong> &#8211; a to jest tabela wiążąca grupę użytkowników, moduł i akcję.</p>
<h3>Demo Role Based Access Control</h3>
<p>Teraz jak to ustrojstwo wypełnić danymi? Bardzo proszę:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">BEGIN;
&nbsp;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;rbac_user&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;userName&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'przemek'</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'maciej'</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'andrzej'</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'grzesiek'</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;rbac_group&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;groupName&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'admin'</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'user'</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'moderator'</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;rbac_user_to_group&quot;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;rbac_module&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;moduleName&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'news'</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'articles'</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'download'</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'music'</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;rbac_action&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;idModule&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;actionName&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;inherited&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'index'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'edit'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'add'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'delete'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'block'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'index'</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'edit'</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'add'</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'delete'</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'block'</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'index'</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'edit'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'add'</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'delete'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'block'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'download'</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>   
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'index'</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'edit'</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'add'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'delete'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'block'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'download'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'play'</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;rbac_privilages&quot;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> 
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">5</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">5</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">5</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">6</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">7</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">8</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">9</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">10</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">6</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">7</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">8</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">9</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">10</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">6</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">7</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">8</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">9</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">10</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">11</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">12</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">13</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">14</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">15</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">16</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">11</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">12</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">13</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">14</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">15</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">16</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">11</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">12</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">13</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">14</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">15</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">16</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">17</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">18</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">19</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">20</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">21</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">22</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">23</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">17</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">18</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">19</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">20</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">21</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">22</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">23</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">17</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">18</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">19</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">20</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">21</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">22</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">23</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span>;
&nbsp;
COMMIT;</pre></div></div>

<p>Znowu transakcję, jakoś tak szybciej działa to <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Jak pewnie zdążyliście zauważyć tabela <strong>rbac_action</strong> posiada kolumnę &#8222;inherited&#8221; która w późniejszym etapie mojej implementacji tego paradygmatu będzie potrzebna do tego by w hierarchii definiować czy dana akcja ma być dziedziczona dla pod grup. Taki ficzer.</p>
<p>Teraz tak, żeby to działało co jest wyżej przedstawione na gotowca, czyli copy-paste wymagana jest baza danych postgresql > 8.2. Dlaczego? A otóż dlatego że:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #ff0000;">&quot;tabela&quot;</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">EXISTS</span>;</pre></div></div>

<p> jest zaimplementowane od tej versji. Oj brakowało tego brakowało&#8230; Nie wiem jak z wierszami podawanymi po przecinku, gdyż w 8.1 to nie działa (mowa tutaj o klauzuli INSERT).</p>
<h3>Sprawdzanie uprawnień</h3>
<p>Pozostało nam już tylko jak to pobrać, dla przykładu nie tworzyłem żadnych testów wydajnościowych, chodź przyznam że łączymy parę tabel ale utworzone indeksy są w pełni wykorzystywane, przykład jak sprawdzić uprawnienia:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> 
  <span style="color: #ff0000;">&quot;allow&quot;</span> 
<span style="color: #993333; font-weight: bold;">FROM</span> 
  <span style="color: #ff0000;">&quot;rbac_privilages&quot;</span> p 
<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> 
  <span style="color: #ff0000;">&quot;rbac_module&quot;</span> m 
<span style="color: #993333; font-weight: bold;">ON</span> 
  <span style="color: #66cc66;">&#40;</span> p<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idModule&quot;</span> <span style="color: #66cc66;">=</span> m<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idModule&quot;</span> <span style="color: #66cc66;">&#41;</span> 
<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> 
  <span style="color: #ff0000;">&quot;rbac_action&quot;</span> a 
<span style="color: #993333; font-weight: bold;">ON</span> 
  <span style="color: #66cc66;">&#40;</span> p<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idAction&quot;</span> <span style="color: #66cc66;">=</span> a<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idAction&quot;</span> <span style="color: #66cc66;">&#41;</span> 
<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> 
  <span style="color: #ff0000;">&quot;rbac_user_to_group&quot;</span> u2g 
<span style="color: #993333; font-weight: bold;">ON</span> 
  <span style="color: #66cc66;">&#40;</span> p<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idGroup&quot;</span> <span style="color: #66cc66;">=</span> u2g<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idGroup&quot;</span> <span style="color: #66cc66;">&#41;</span> 
<span style="color: #993333; font-weight: bold;">WHERE</span> 
  u2g<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idUser&quot;</span> <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">2</span> 
<span style="color: #993333; font-weight: bold;">AND</span> 
  m<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;moduleName&quot;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'music'</span> 
<span style="color: #993333; font-weight: bold;">AND</span> 
  a<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;actionName&quot;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'index'</span>;</pre></div></div>

<p>Możemy sobie z tego ładny widoczek utworzyć, ale może o tym kiedy indziej. A teraz co wykazało explain?</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"> Nested Loop  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>8<span style="color: #66cc66;">.</span>28<span style="color: #66cc66;">..</span>14<span style="color: #66cc66;">.</span>17 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
   <span style="color: #66cc66;">-&gt;</span>  Nested Loop  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>8<span style="color: #66cc66;">.</span>28<span style="color: #66cc66;">..</span>13<span style="color: #66cc66;">.</span>19 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #993333; font-weight: bold;">JOIN</span> Filter: <span style="color: #66cc66;">&#40;</span>p<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idModule&quot;</span> <span style="color: #66cc66;">=</span> m<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idModule&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">-&gt;</span>  Hash <span style="color: #993333; font-weight: bold;">JOIN</span>  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>8<span style="color: #66cc66;">.</span>28<span style="color: #66cc66;">..</span>10<span style="color: #66cc66;">.</span>26 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">3</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">9</span><span style="color: #66cc66;">&#41;</span>
               Hash Cond: <span style="color: #66cc66;">&#40;</span>p<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idAction&quot;</span> <span style="color: #66cc66;">=</span> a<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idAction&quot;</span><span style="color: #66cc66;">&#41;</span>
               <span style="color: #66cc66;">-&gt;</span>  Seq Scan <span style="color: #993333; font-weight: bold;">ON</span> rbac_privilages p  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>00<span style="color: #66cc66;">..</span>1<span style="color: #66cc66;">.</span>69 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">69</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">13</span><span style="color: #66cc66;">&#41;</span>
               <span style="color: #66cc66;">-&gt;</span>  Hash  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>8<span style="color: #66cc66;">.</span>27<span style="color: #66cc66;">..</span>8<span style="color: #66cc66;">.</span>27 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span>
                     <span style="color: #66cc66;">-&gt;</span>  <span style="color: #993333; font-weight: bold;">INDEX</span> Scan <span style="color: #993333; font-weight: bold;">USING</span> <span style="color: #ff0000;">&quot;rbac_action_actionName_key&quot;</span> <span style="color: #993333; font-weight: bold;">ON</span> rbac_action a  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>00<span style="color: #66cc66;">..</span>8<span style="color: #66cc66;">.</span>27 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span>
                           <span style="color: #993333; font-weight: bold;">INDEX</span> Cond: <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;actionName&quot;</span><span style="color: #66cc66;">&#41;</span>::text <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'index'</span>::text<span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">-&gt;</span>  <span style="color: #993333; font-weight: bold;">INDEX</span> Scan <span style="color: #993333; font-weight: bold;">USING</span> <span style="color: #ff0000;">&quot;rbac_module_moduleName_key&quot;</span> <span style="color: #993333; font-weight: bold;">ON</span> rbac_module m  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>00<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>97 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span>
               <span style="color: #993333; font-weight: bold;">INDEX</span> Cond: <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>m<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;moduleName&quot;</span><span style="color: #66cc66;">&#41;</span>::text <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'music'</span>::text<span style="color: #66cc66;">&#41;</span>
   <span style="color: #66cc66;">-&gt;</span>  <span style="color: #993333; font-weight: bold;">INDEX</span> Scan <span style="color: #993333; font-weight: bold;">USING</span> rbac_user_to_group_pkey <span style="color: #993333; font-weight: bold;">ON</span> rbac_user_to_group u2g  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>00<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>97 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #993333; font-weight: bold;">INDEX</span> Cond: <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>u2g<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idUser&quot;</span> <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AND</span> <span style="color: #66cc66;">&#40;</span>u2g<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idGroup&quot;</span> <span style="color: #66cc66;">=</span> p<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idGroup&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">13</span> rows<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>A co explain z analyze?</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"> Nested Loop  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>8<span style="color: #66cc66;">.</span>28<span style="color: #66cc66;">..</span>14<span style="color: #66cc66;">.</span>17 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>actual time<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>449<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>480 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> loops<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
   <span style="color: #66cc66;">-&gt;</span>  Nested Loop  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>8<span style="color: #66cc66;">.</span>28<span style="color: #66cc66;">..</span>13<span style="color: #66cc66;">.</span>19 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>actual time<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>355<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>449 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">3</span> loops<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #993333; font-weight: bold;">JOIN</span> Filter: <span style="color: #66cc66;">&#40;</span>p<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idModule&quot;</span> <span style="color: #66cc66;">=</span> m<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idModule&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">-&gt;</span>  Hash <span style="color: #993333; font-weight: bold;">JOIN</span>  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>8<span style="color: #66cc66;">.</span>28<span style="color: #66cc66;">..</span>10<span style="color: #66cc66;">.</span>26 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">3</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">9</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>actual time<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>083<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>288 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">12</span> loops<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
               Hash Cond: <span style="color: #66cc66;">&#40;</span>p<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idAction&quot;</span> <span style="color: #66cc66;">=</span> a<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idAction&quot;</span><span style="color: #66cc66;">&#41;</span>
               <span style="color: #66cc66;">-&gt;</span>  Seq Scan <span style="color: #993333; font-weight: bold;">ON</span> rbac_privilages p  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>00<span style="color: #66cc66;">..</span>1<span style="color: #66cc66;">.</span>69 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">69</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">13</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>actual time<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>012<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>099 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">69</span> loops<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
               <span style="color: #66cc66;">-&gt;</span>  Hash  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>8<span style="color: #66cc66;">.</span>27<span style="color: #66cc66;">..</span>8<span style="color: #66cc66;">.</span>27 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>actual time<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>049<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>049 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">4</span> loops<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
                     <span style="color: #66cc66;">-&gt;</span>  <span style="color: #993333; font-weight: bold;">INDEX</span> Scan <span style="color: #993333; font-weight: bold;">USING</span> <span style="color: #ff0000;">&quot;rbac_action_actionName_key&quot;</span> <span style="color: #993333; font-weight: bold;">ON</span> rbac_action a  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>00<span style="color: #66cc66;">..</span>8<span style="color: #66cc66;">.</span>27 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>actual time<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>027<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>036 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">4</span> loops<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
                           <span style="color: #993333; font-weight: bold;">INDEX</span> Cond: <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;actionName&quot;</span><span style="color: #66cc66;">&#41;</span>::text <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'index'</span>::text<span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">-&gt;</span>  <span style="color: #993333; font-weight: bold;">INDEX</span> Scan <span style="color: #993333; font-weight: bold;">USING</span> <span style="color: #ff0000;">&quot;rbac_module_moduleName_key&quot;</span> <span style="color: #993333; font-weight: bold;">ON</span> rbac_module m  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>00<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>97 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>actual time<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>006<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>008 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> loops<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">12</span><span style="color: #66cc66;">&#41;</span>
               <span style="color: #993333; font-weight: bold;">INDEX</span> Cond: <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>m<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;moduleName&quot;</span><span style="color: #66cc66;">&#41;</span>::text <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'music'</span>::text<span style="color: #66cc66;">&#41;</span>
   <span style="color: #66cc66;">-&gt;</span>  <span style="color: #993333; font-weight: bold;">INDEX</span> Scan <span style="color: #993333; font-weight: bold;">USING</span> rbac_user_to_group_pkey <span style="color: #993333; font-weight: bold;">ON</span> rbac_user_to_group u2g  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>00<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>97 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>actual time<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>005<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>006 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">0</span> loops<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #993333; font-weight: bold;">INDEX</span> Cond: <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>u2g<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idUser&quot;</span> <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AND</span> <span style="color: #66cc66;">&#40;</span>u2g<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idGroup&quot;</span> <span style="color: #66cc66;">=</span> p<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idGroup&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
 Total runtime: <span style="color: #cc66cc;">0.576</span> ms
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">14</span> rows<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>I skąd te 14 wierszy? Bladego pojęcia nie mam. (Edit już wiem ;p) Także czekam na Wasze konstruktywne opinie, chce zaznaczyć że całość nie jest tylko moim pomysłem ale również kolegi z pracy Maćka.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/role-based-access-control-cz-2/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>PostgreSQL &#8211; Ltree</title>
		<link>http://www.cojack.pl/postgresql-ltree</link>
		<comments>http://www.cojack.pl/postgresql-ltree#comments</comments>
		<pubDate>Wed, 30 Dec 2009 00:15:46 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[ltree]]></category>
		<category><![CDATA[menu drzewiaste]]></category>
		<category><![CDATA[menu wielopoziomowe]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://cojack.os-cms.pl/?p=284</guid>
		<description><![CDATA[ Tym razem nie będzie nic o implementacji pewnej struktury drzewiastej w php. Natomiast zajmiemy się dziś sql. A dokładniej PostgreSQL, od dłuższego czasu nie mogłem ogarnąć modułu w postgresql, który nazywa się ltree, jak sama cząstkowa nazwy wskazuje i łatwo się domyślić że chodzi tutaj o reprezentację i strukturę ...]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="PostgreSQL" src="http://cojack.os-cms.pl/wp-content/arch-postgresql.png" alt="" height="100" width="100"> Tym razem nie będzie nic o implementacji pewnej struktury drzewiastej w php. Natomiast zajmiemy się dziś sql. A dokładniej PostgreSQL, od dłuższego czasu nie mogłem ogarnąć modułu w postgresql, który nazywa się <strong>ltree</strong>, jak sama cząstkowa nazwy wskazuje i łatwo się domyślić że chodzi tutaj o reprezentację i strukturę drzewa. Co najlepsze, przeprowadzone benchmarki przez jego twórców wykazują na największy w śród tymczasowych ogólnie dostępnych wzorców tego typu struktury czas dostępu do danych.</p>
<p><strong>Trochę historii</strong><br />
W 2002 roku, dwóch programistów: Teodor Sigaev oraz Oleg Bartunov, wypuściło na światło dzienne moduł ltree (kiedy zaczęli, brak danych). Podeszli do tego dość ogólnego problemu z wielkim dystansem, za to teraz mamy potężne narzędzie całkowicie za darmo. Następne wydania miały na celu wyeliminowanie błędów zgłoszonych przez użytkowników oraz rozszerzyć możliwości o nowe możliwości w indeksie GIST. Więcej na temat samych wydań jak zwykle w paczce do pobrania z ich strony na dole.</p>
<p><strong>Z czym to się je?</strong><br />
Ltree jak już wyżej wspomniałem jest modułem do PosgreSQL&#8217;a mający za zadanie przechowywanie danych w sposób przedstawiający strukturę drzewiastą. Implementacja jak najbardziej wydajna. A więc zacznijmy.</p>
<p>W zależności od dystrybucji z jakiej korzystamy, możemy mieć lub nie dodatkową paczkę dla postgresql&#8217;a która powinna się nazywać mniej więcej tak: <strong>postgresql-contrib</strong></p>
<p>Po zainstalowaniu tych dodatków mamy masę innych rzeczy, z których nie koniecznie będziemy korzystać. Ale nas interesuje ltree, ścieżka ltree.sql u mnie to:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span>postgresql<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">8.4</span><span style="color: #000000; font-weight: bold;">/</span>contrib<span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

<p>a żeby wyszukać gdzie my to mamy:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">locate</span> ltree.sql</pre></div></div>

<p>po wcześniejszym updatedb.</p>
<p>powinniśmy mieć tam plik ltree.sql, musimy ten plik wrzucić do naszej bazy danych. No to jedziemy:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">psql nazwaDB <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span>postgresql<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">8.4</span><span style="color: #000000; font-weight: bold;">/</span>contrib<span style="color: #000000; font-weight: bold;">/</span>ltree.sql</pre></div></div>

<p>powinniśmy mieć wszystko ładnie wrzucone do bazy danych. Teraz zostało nam już tylko utworzenie tabeli i ogień.</p>
<p>Przykładowa tabela z naszym drzewem.</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span>
   <span style="color: #ff0000;">&quot;id&quot;</span>  SERIAL <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;path&quot;</span>   LTREE<span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;sort&quot;</span> SMALLINT
<span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>mamy tutaj tabelę którą nazywamy tree, i teraz nowy typ danych <strong>LTREE</strong>. Nie ma co tu dużo tłumaczyć zaraz sami zobaczycie jak to działa.</p>
<p>Pozostało nam jeszcze założyć indeksy na kolumny:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">INDEX</span> path_gist_idx <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #993333; font-weight: bold;">USING</span> gist<span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">INDEX</span> path_idx <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #993333; font-weight: bold;">USING</span> btree<span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>oraz możemy sobie w prosty sposób komentarze na kolumny powrzucać:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">COMMENT <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #993333; font-weight: bold;">COLUMN</span> <span style="color: #ff0000;">&quot;tree&quot;</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;path&quot;</span> <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #ff0000;">'Scieżka drzewa'</span>;</pre></div></div>

<p>Żeby zobaczyć komentarz w psql należy wykonać polecenie:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">\d<span style="color: #66cc66;">+</span> <span style="color: #ff0000;">&quot;nazwaTabeli&quot;</span></pre></div></div>

<p>A teraz dane przykładowe do drzewa:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Science'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Science.Astronomy'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Science.Astronomy.Astrophysics'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Science.Astronomy.Cosmology'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Hobbies'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Hobbies.Amateurs_Astronomy'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections.Pictures'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections.Pictures.Astronomy'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections.Pictures.Astronomy.Stars'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections.Pictures.Astronomy.Galaxies'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections.Pictures.Astronomy.Astronauts'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Jak zauważyliście, dane w ścieżce drzewa nie mogą posiadać wolnej przestrzeni, więc należy ją zamienić na np &#8222;_&#8221;, co nie jest żadnym problemem.</p>
<p>Ścieżka rysuje się mniej więcej tak:<br />
<br />
<img title="Ltree - path" src="http://cojack.os-cms.pl/wp-content/path_ltree.png" alt=""><br />
<br />
Pobierzmy sobie teraz całe drzewko:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">ltree<span style="color: #339933;">=&gt;</span> SELECT <span style="color: #339933;">*</span> FROM tree<span style="color: #339933;">;</span>
 id <span style="color: #339933;">|</span>                     path                      <span style="color: #339933;">|</span> <span style="color: #990000;">sort</span>
<span style="color: #339933;">----+-----------------------------------------------+------</span>
  <span style="color: #cc66cc;">1</span> <span style="color: #339933;">|</span> Top                                           <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">2</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Science                                   <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">3</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Science<span style="color: #339933;">.</span>Astronomy                         <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">4</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Science<span style="color: #339933;">.</span>Astronomy<span style="color: #339933;">.</span>Astrophysics            <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">5</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Science<span style="color: #339933;">.</span>Astronomy<span style="color: #339933;">.</span>Cosmology               <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">2</span>
  <span style="color: #cc66cc;">6</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Hobbies                                   <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">2</span>
  <span style="color: #cc66cc;">7</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Hobbies<span style="color: #339933;">.</span>Amateurs_Astronomy                <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">2</span>
  <span style="color: #cc66cc;">8</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Collections                               <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">3</span>
  <span style="color: #cc66cc;">9</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Collections<span style="color: #339933;">.</span>Pictures                      <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">1</span>
 <span style="color: #cc66cc;">10</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Collections<span style="color: #339933;">.</span>Pictures<span style="color: #339933;">.</span>Astronomy            <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">1</span>
 <span style="color: #cc66cc;">11</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Collections<span style="color: #339933;">.</span>Pictures<span style="color: #339933;">.</span>Astronomy<span style="color: #339933;">.</span>Stars      <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">1</span>
 <span style="color: #cc66cc;">12</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Collections<span style="color: #339933;">.</span>Pictures<span style="color: #339933;">.</span>Astronomy<span style="color: #339933;">.</span>Galaxies   <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">2</span>
 <span style="color: #cc66cc;">13</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Collections<span style="color: #339933;">.</span>Pictures<span style="color: #339933;">.</span>Astronomy<span style="color: #339933;">.</span>Astronauts <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">3</span>
<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">13</span> rows<span style="color: #009900;">&#41;</span></pre></div></div>

<p>I wszystko wygląda fajnie co? Ale tu się zaczynają schody z którymi ja sam nie potrafiłem sobie poradzić. I po raz któryś poprosiłem depesz&#8217;a o pomoc. Sprawa ma się tak: Jak pobrać drzewo z posortowanymi gałęziami względem głębokości? No i tutaj był mój pies pogrzebany. Ale z pomocą przyszedł depesz, ale do sedna sprawy. Dodajmy sobie z 3 rekordy do naszej tabeli:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"> <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> tree <span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">,</span>sort<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Science.Programing'</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
 <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> tree <span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">,</span>sort<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Science.Chemia'</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span>;
 <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> tree <span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">,</span>sort<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Science.Fizyka'</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Teraz nasze drzewko będzie wyglądało tak:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"> id <span style="color: #66cc66;">|</span>                     path                      <span style="color: #66cc66;">|</span> sort
<span style="color: #808080; font-style: italic;">----+-----------------------------------------------+------</span>
  <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span> Top                                           <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Science                                   <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Science<span style="color: #66cc66;">.</span>Astronomy                         <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Science<span style="color: #66cc66;">.</span>Astronomy<span style="color: #66cc66;">.</span>Astrophysics            <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">5</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Science<span style="color: #66cc66;">.</span>Astronomy<span style="color: #66cc66;">.</span>Cosmology               <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
  <span style="color: #cc66cc;">6</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Hobbies                                   <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
  <span style="color: #cc66cc;">7</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Hobbies<span style="color: #66cc66;">.</span>Amateurs_Astronomy                <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
  <span style="color: #cc66cc;">8</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Collections                               <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">3</span>
  <span style="color: #cc66cc;">9</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Collections<span style="color: #66cc66;">.</span>Pictures                      <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
 <span style="color: #cc66cc;">10</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Collections<span style="color: #66cc66;">.</span>Pictures<span style="color: #66cc66;">.</span>Astronomy            <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
 <span style="color: #cc66cc;">11</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Collections<span style="color: #66cc66;">.</span>Pictures<span style="color: #66cc66;">.</span>Astronomy<span style="color: #66cc66;">.</span>Stars      <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
 <span style="color: #cc66cc;">12</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Collections<span style="color: #66cc66;">.</span>Pictures<span style="color: #66cc66;">.</span>Astronomy<span style="color: #66cc66;">.</span>Galaxies   <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
 <span style="color: #cc66cc;">13</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Collections<span style="color: #66cc66;">.</span>Pictures<span style="color: #66cc66;">.</span>Astronomy<span style="color: #66cc66;">.</span>Astronauts <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">3</span>
 <span style="color: #cc66cc;">14</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Science<span style="color: #66cc66;">.</span>Programing                        <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
 <span style="color: #cc66cc;">15</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Science<span style="color: #66cc66;">.</span>Chemia                            <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">3</span>
 <span style="color: #cc66cc;">16</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Science<span style="color: #66cc66;">.</span>Fizyka                            <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">4</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">16</span> rows<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>Co nas w ogóle nie zadowala, próbowałem na różne sposoby:</p>
<p>1 by depesz:</p>
<blockquote><p>
10:12 <    depesz> cojack: i think you will need to sort on subltree(path, 0, nlevel(path)-2), sort;
</p></blockquote>
<p>No to jedziemy</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">ltree<span style="color: #66cc66;">=&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> tree <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> subltree<span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span> nlevel<span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">-</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> sort;
ERROR:  invalid positions</pre></div></div>

<p>A dziwne bo wcześniej działało ^^</p>
<p>2 moja</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> id<span style="color: #66cc66;">,</span> subpath<span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">,</span> <span style="color: #66cc66;">-</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> title<span style="color: #66cc66;">,</span> nlevel<span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> depth<span style="color: #66cc66;">,</span> sort <span style="color: #993333; font-weight: bold;">FROM</span> tree <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> subltree<span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span> nlevel<span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">ASC</span>;
 id <span style="color: #66cc66;">|</span>       title        <span style="color: #66cc66;">|</span> depth <span style="color: #66cc66;">|</span> sort
<span style="color: #808080; font-style: italic;">----+--------------------+-------+------</span>
  <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span> Top                <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">8</span> <span style="color: #66cc66;">|</span> Collections        <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">3</span>
  <span style="color: #cc66cc;">9</span> <span style="color: #66cc66;">|</span> Pictures           <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
 <span style="color: #cc66cc;">10</span> <span style="color: #66cc66;">|</span> Astronomy          <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
 <span style="color: #cc66cc;">13</span> <span style="color: #66cc66;">|</span> Astronauts         <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">5</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">3</span>
 <span style="color: #cc66cc;">12</span> <span style="color: #66cc66;">|</span> Galaxies           <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">5</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
 <span style="color: #cc66cc;">11</span> <span style="color: #66cc66;">|</span> Stars              <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">5</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">6</span> <span style="color: #66cc66;">|</span> Hobbies            <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
  <span style="color: #cc66cc;">7</span> <span style="color: #66cc66;">|</span> Amateurs_Astronomy <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
  <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">|</span> Science            <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span> Astronomy          <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span> Astrophysics       <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">5</span> <span style="color: #66cc66;">|</span> Cosmology          <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
 <span style="color: #cc66cc;">15</span> <span style="color: #66cc66;">|</span> Chemia             <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">3</span>
 <span style="color: #cc66cc;">16</span> <span style="color: #66cc66;">|</span> Fizyka             <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">4</span>
 <span style="color: #cc66cc;">14</span> <span style="color: #66cc66;">|</span> Programing         <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">16</span> rows<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>I tutaj można zauważyć że mamy już względnie posortowane według kategorii ale wciąż brak posortowania względem sort po prostu, no i trzecia ostateczna (chyba) propozycja wg depesza podejście drugie:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">WITH</span> RECURSIVE rec <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #66cc66;">&#40;</span>
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*,</span> btrim<span style="color: #66cc66;">&#40;</span>to_char<span style="color: #66cc66;">&#40;</span> sort<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'0000000'</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> ordering <span style="color: #993333; font-weight: bold;">FROM</span> tree <span style="color: #993333; font-weight: bold;">WHERE</span> nlevel<span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span>
<span style="color: #993333; font-weight: bold;">UNION</span> <span style="color: #993333; font-weight: bold;">ALL</span>
<span style="color: #993333; font-weight: bold;">SELECT</span> t2<span style="color: #66cc66;">.*,</span> t1<span style="color: #66cc66;">.</span>ordering <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">'/'</span> <span style="color: #66cc66;">||</span> btrim<span style="color: #66cc66;">&#40;</span>to_char<span style="color: #66cc66;">&#40;</span> t2<span style="color: #66cc66;">.</span>sort<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'0000000'</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> ordering <span style="color: #993333; font-weight: bold;">FROM</span> rec t1<span style="color: #66cc66;">,</span> tree t2 <span style="color: #993333; font-weight: bold;">WHERE</span> t1<span style="color: #66cc66;">.</span>path @<span style="color: #66cc66;">&gt;</span> t2<span style="color: #66cc66;">.</span>path <span style="color: #993333; font-weight: bold;">AND</span> nlevel<span style="color: #66cc66;">&#40;</span>t1<span style="color: #66cc66;">.</span>path<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">+</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">=</span> nlevel<span style="color: #66cc66;">&#40;</span>t2<span style="color: #66cc66;">.</span>path<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span>
<span style="color: #993333; font-weight: bold;">SELECT</span> id<span style="color: #66cc66;">,</span> subpath<span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">,</span> <span style="color: #66cc66;">-</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> title<span style="color: #66cc66;">,</span> nlevel<span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> depth<span style="color: #66cc66;">,</span> sort <span style="color: #993333; font-weight: bold;">FROM</span> rec <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> ordering;
&nbsp;
 id <span style="color: #66cc66;">|</span>       title        <span style="color: #66cc66;">|</span> depth <span style="color: #66cc66;">|</span> sort
<span style="color: #808080; font-style: italic;">----+--------------------+-------+------</span>
  <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span> Top                <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">|</span> Science            <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span> Astronomy          <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span> Astrophysics       <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">5</span> <span style="color: #66cc66;">|</span> Cosmology          <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
 <span style="color: #cc66cc;">14</span> <span style="color: #66cc66;">|</span> Programing         <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
 <span style="color: #cc66cc;">15</span> <span style="color: #66cc66;">|</span> Chemia             <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">3</span>
 <span style="color: #cc66cc;">16</span> <span style="color: #66cc66;">|</span> Fizyka             <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">4</span>
  <span style="color: #cc66cc;">6</span> <span style="color: #66cc66;">|</span> Hobbies            <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
  <span style="color: #cc66cc;">7</span> <span style="color: #66cc66;">|</span> Amateurs_Astronomy <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
  <span style="color: #cc66cc;">8</span> <span style="color: #66cc66;">|</span> Collections        <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">3</span>
  <span style="color: #cc66cc;">9</span> <span style="color: #66cc66;">|</span> Pictures           <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
 <span style="color: #cc66cc;">10</span> <span style="color: #66cc66;">|</span> Astronomy          <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
 <span style="color: #cc66cc;">11</span> <span style="color: #66cc66;">|</span> Stars              <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">5</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
 <span style="color: #cc66cc;">12</span> <span style="color: #66cc66;">|</span> Galaxies           <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">5</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
 <span style="color: #cc66cc;">13</span> <span style="color: #66cc66;">|</span> Astronauts         <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">5</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">3</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">16</span> rows<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>Dziękuje nie mam do Pana więcej pytań, rozwalił mnie jego poziom wiedzy.</p>
<p>To co tutaj przedstawiłem to tylko przedsmak tego co dzięki tej sposobności możemy doświadczyć, a są to:</p>
<ol>
<li>ACL</li>
<li>RBAC</li>
<li>Hierarchia grup</li>
<li>Drzewa ^^</li>
</ol>
<p>Nie będę opisywał funkcji jakie są dostępne w tym module, a na pewno nie w tym wpisie. Chciałem przedstawić że coś takiego istnieje, gdyż bardzo mało osób wie o tym, nie zdaje sobie sprawy z potężnej mocy jaką to posiada.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/postgresql-ltree/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
