_____________________________________________________________________
FAQ grupy pl.comp.bazy-danych
Informacje ułatwiające zadawanie i nie zadawanie pytań
na grupie pl.comp.bazy-danych
Wersja: 1.04 (14.03.2007)
URL:
Koordynator FAQ: Sławomir Szyszło
_____________________________________________________________________
Zmiany:
14.03.2007 Aktualizacja rozdziału 13
05.10.2006 Dodany punkt 2.4
21.09.2006 Aktualizacja linków w rozdziale 9
_____________________________________________________________________
Spis treści
0. Wstęp
1. Teoria baz danych
2. Język SQL
3. Clipper
4. DB2
5. Informix
6. InterBase
7. Microsoft SQL Server
8. MySQL
9. Oracle
10. PostgreSQL
11. Sybase
12. (Visual) FoxPro
13. Inne źródła o bazach danych
_____________________________________________________________________
0. Wstęp
___________________
0.1 O tym dokumencie
Dokument ten zawiera często zadawane pytania (i odpowiedzi) dotyczące
tematyki baz danych, a także informacje ułatwiające zadawanie i nie
zadawanie pytań na grupie pl.comp.bazy-danych.
Najnowsza wersja FAQ wysyłana jest co dwa tygodnie na grupy
oraz , dostępna jest
również (w formatach txt i html) pod adresem .
Propozycje zmian proszę przysyłać na grupę pl.comp.bazy-danych z kopią
BCC: na adres .
___________________
0.2 O grupie
Grupa pl.comp.bazy-danych służy do dyskusji na temat systemów baz
danych. Można tu poruszać zarówno problemy teoretyczne, jak i
praktyczne. Grupa nie służy do dyskusji dotyczących *wyłącznie* systemu
MS Access - do tego służy grupa .
Sprawy związane z oprogramowaniem baz danych w języku Delphi powinno
omawiać się na grupie . Istnieje
także grupa , na którą powinno się
kierować pytania związane ze skryptami wykonywanymi po stronie serwera,
także tymi operującymi na bazach danych (CGI, PHP, ASP itp.).
Opis grupy znajduje się tu:
___________________
0.3 Zalecenia dotyczące wysyłania postów na grupę
Uprasza się o wysyłanie postów z oznaczeniem w temacie wiadomości
środowiska, którego dotyczy dany problem. Skróty są podane poniżej.
SQL - [SQL]
Clipper - [Clipper]
DB2 - [DB2]
Informix - [Informix]
InterBase - [IB]
Microsoft SQL Server - [MSSQL]
MySQL - [MySQL]
Oracle - [Oracle]
PostgreSQL - [PGSQL]
Sybase - [Sybase]
(Visual) FoxPro (VFP) - [VFP]
___________________
0.4 Koordynatorzy poszczególnych działów
1) Teoria baz danych - Sławomir Szyszło
2) SQL - Sławomir Szyszło
3) Clipper - Andrzej Woźniak
4) DB2 -
5) Informix -
6) InterBase - Tomasz Zadora
7) Microsoft SQL Server - Waldemar Gil
8) MySQL -
9) Oracle - Sławomir Szyszło
10) PostgreSQL - hubert depesz lubaczewski , Grzegorz Brzeziński
11) Sybase - Bartosz Żyszkiewicz
12) (Visual) FoxPro - Kamil Paszkiewicz
___________________
0.5 Archiwa grupy pl.comp.bazy-danych
Archiwum tej grupy dostępne jest:
- z poziomu czytnika news: news://news-archive.icm.edu.pl
- poprzez WWW, możliwość wyszukiwania:
- poprzez WWW, możliwość wyszukiwania:
(archiwum niepełne)
_____________________________________________________________________
1. Teoria baz danych
Opracował Sławomir Szyszło
Pytania:
1.1 Co to jest baza danych?
1.2 Co to jest system zarządzania bazą danych SZBD (ang. DBMS -
Database Management System)?
1.3 Co to jest system bazy danych?
1.4 Spójność bazy danych
1.5 Transakcja
1.6 Języki baz danych
1.7 Encja
1.8 Relacyjny model danych
1.9 Jak zaprojektować tabele do bazy, gdzie relacje 1:wielu mogą się
zagłębiać w nieskończoność?
1.10 Szukam modelu danych dla...
1.11 Gdzie znajdę porównania baz danych?
Odpowiedzi:
___________________
1.1 Co to jest baza danych?
W ogólności bazą danych nazywamy pewien uporządkowany zbiór danych.
Precyzyjniej będzie jednak powiedzieć, że baza danych jest
informatycznym odwzorowaniem danego fragmentu rzeczywistości,
odzwierciedlającym stan tego fragmentu w postaci danych komputerowych.
___________________
1.2 Co to jest system zarządzania bazą danych SZBD (ang. DBMS -
Database Management System)?
Jest to oprogramowanie umożliwiające tworzenie, eksploatację bazy
danych oraz obsługujące użytkowników bazy.
___________________
1.3 Co to jest system bazy danych?
Jest to, w uproszczeniu, baza danych plus system zarządzania bazą
danych.
___________________
1.4 Spójność bazy danych
Ponieważ baza danych jest logicznie spójnym modelem fragmentu
obserwowanej przez nas rzeczywistości, ważne jest, aby baza danych nie
przyjęła stanu, którego nie da się osiągnąć w modelowanej
rzeczywistości. Jeśli baza jednak osiągnie taki stan, to mówimy, że
jest ona w stanie niespójnym.
___________________
1.5 Transakcja
Transakcja jest pewną sekwencją instrukcji, po wykonaniu której baza
danych z jednego stanu spójnego przechodzi w inny stan spójny (zgodny z
modelowaną rzeczywistością). Innymi słowy, jeśli transakcja zostanie
wykonana w spójnej bazie danych, to po jej zakończeniu baza nadal
powinna być spójna.
Transakcja jest operacją atomową, co oznacza, że SZBD powinien wykonać
wszystkie instrukcje wchodzące w jej skład lub żadną. W praktyce SZBD
wykonuje instrukcje transakcji po kolei, a w przypadku niepowodzenia
którejś z nich wycofuje poprzednio wykonane instrukcje (jest to tzw.
wycofanie transakcji, ang. rollback).
___________________
1.6 Języki baz danych
Do operowania na bazach danych służą następujące języki:
- język definiowania danych (ang. DDL - Data Definition Language)
umożliwiający definiowanie struktury danych przechowywanych w bazie,
czyli schematu bazy danych
- język manipulowania danymi (ang. DML - Data Manipulation Language)
umożliwiający dodawanie, modyfikowanie i usuwanie informacji w bazie
danych
- język sterowania danymi (ang. DCL - Data Control Language)
umożliwiający sterowanie transakcjami
- język zapytań (ang. QL - Query Language) - umożliwiający pobieranie
informacji z bazy danych.
W praktyce te cztery języki są ze sobą zintegrowane. Takim
zintegrowanym językiem jest m.in. SQL (ang. Structured Query Language).
Do listy języków można tu jeszcze dodać rozszerzenia proceduralne
stosowane przez różne firmy produkujące SZBD: pl/pgsql w PostgreSQL,
PL/SQL w Oracle i inne.
___________________
1.7 Encja
Encja (ang. entity) to pewna rzecz (obiekt materialny lub
niematerialny, pojęcie, fakt, zdarzenie itp.), o której chcemy
przechowywać informacje. Encja posiada pewne charakterystyczne dla
siebie cechy. Przykładem encji będącej obiektem materialnym może być
np. samochód (wraz z cechami, np.: model, numer fabryczny, kolor,
zużycie paliwa), osoba (imię, nazwisko, adres, numer PESEL), a
niematerialnym np. konto bankowe (numer, posiadacz, dopuszczalny debet,
saldo), zdarzeniem - wysłanie towaru (data wysłania, nazwa towaru,
symbol, nazwa i adres odbiorcy), faktem - znajomość języka (nazwa
języka, czas nauki, stopień znajomości).
___________________
1.8 Relacyjny model danych
Relacyjny model danych posiada trzy podstawowe składowe:
- relacyjne struktury danych
- operatory algebry relacyjnej, które umożliwiają tworzenie,
przeszukiwanie i modyfikowanie danych
- ograniczenia (więzy) integralnościowe jawnie lub niejawnie
określającymi możliwe/dopuszczalne wartości danych.
Nieformalnie rzecz biorąc, relacja jest zbiorem krotek (rekordów)
posiadających taką samą strukturę (schemat) i różne wartości; zbiór ten
jest przedstawiany w postaci wierszy tablicy. Każda krotka zawiera
wartość co najmniej jednego atrybutu o określonej dziedzinie,
przedstawianego w postaci kolumny tablicy.
Relacja posiada następujące właściwości:
- wszystkie jej krotki są różne
- wszystkie jej atrybuty są różne
- kolejność krotek nie ma znaczenia i w ogólności nie jest ona znana
- kolejność atrybutów nie ma znaczenia
- wartości atrybutów są niepodzielne (atomowe), tj. nie mogą być
zbiorem wartości.
___________________
1.9 Jak zaprojektować tabele do bazy, gdzie relacje 1:wielu mogą się
zagłębiać w nieskończoność?
Opracował: hubert depesz lubaczewski
*** Dane testowe ***
We wszystkich przykładach będę się odwoływał do poniższego drzewa:
(jeśli poniższy graf masz przekoszony użyj czcionki nieproporcjonalnej,
np.courier).
sql
/ \
postgresql oracle-----__
| / | \
linux solaris linux windows
/ \
glibc1 glibc2
*** Metoda 1 ***
Oddzielne table na każdy poziom zagnieżdżenia danych. W tym przypadku byłoby to:
tree_level_1 (id, name) :
(1,sql);
tree_level_2 (id, parent_id, name) :
(1, 1, postgresql),
(2, 1, oracle);
tree_level_3 (id, parent_id, name) :
(1, 1, linux),
(2, 2, solaris);
(3, 2, linux);
(4, 2, windows);
tree_level_4 (id, parent_id, name) :
(1, 3, glibc1),
(2, 3, glibc2);
Metoda ta wybierana jest najczęściej przez początkujących programistów.
Bardziej doświadczeni bazo-danowcy, odrzucają ją ze względu na
koniecznośc modyfikowania *struktury bazy danych* przy zmianie danych!!!
Praktycznie rzecz biorąc nie powinna być nigdy stosowana.
Cechy:
+ trywialne w implementacji
+ dosyć szybkie tworzenie pełnej nazwy (z zastrzeżeniem o znajdywaniu
danych konkretnego (początkowego) ID)
- skomplikowane wyszukiwanie danych na podstawie konkretnego "ID"
- ograniczona ilość poziomów zagnieżdżeń
- bardzo wolne znajdowanie np. wszystkich książek w kategorii
"informatyka" i podkategoriach informatyki (dowolnie głęboko)
- wolne wyszukiwanie podkategorii niebezpośrednich.
*** Metoda 2 ***
Tabela typu:
create table kategorie (
id serial,
parent_id int8,
name text not null default '',
primary key (id)
);
create unique index ui_kategorie_pin on kategorie (parent_id, name);
alter table kategorie add foreign key (parent_id) references kategorie (id);
Cechy:
+ trywialne w implementacji
+ nieograniczona ilość poziomów zagnieżdżeń
+ błyskawiczne wyszukiwanie podkategoriii danej kategorii
- wolne tworzenie pełnej nazwy (chyba, że przechowujesz ją w polu name,
ale to marnotrawstwo miejsca)
- bardzo wolne znajdowanie np. wszystkich książek w kategorii "informatyka"
i podkategoriach informatyki (dowolnie głęboko)
- wolne wyszukiwanie podkategorii niebezpośrednich.
*** Metoda 3 ***
Układ typu nested sets (vide książka "SQL - zaawansowane programowanie", autor:
Joe Celko).
Tabela plus minus jak wyżej, ale zamiast parent_id jest left_mark i right_mark.
Left_mark i right_mark są wyliczane.
Przykład (w nawiasach przy nazwie odpowiednio: left_mark, right_mark).
(1, 18) sql
(2, 5) sql/postgresql
(6, 17) sql/oracle
(3, 4) sql/postgresql/linux
(7, 8) sql/oracle/solaris
(9, 14) sql/oracle/linux
(15, 16) sql/oracle/windows
(10, 11) sql/oracle/linux/glibc1
(12, 13) sql/oracle/linux/glibc2
Wartości left/right mark są nadawane w następujący sposób: zaczynając od
konkretnego miejsca w drzewie, nadajemy mu kolejny numer (np. 1), i znajdujemy
pierwsze "dziecko". "Pierwsze" definiujemy w dowolny sposób - tu akurat użyłem
odwzorowania graficznego.
Jeśli dany element nie posiada "dzieci", zwiekszam licznik o jeden, ustawiam
right-mark oraz wraz z numerowaniem jeden poziom w górę.
Przykład:
Zaczynam od "sql". Ustawiam mu left-mark na 1, znajduję pierwsze "dziecko" -
czyli postgresql, ustawiam mu left-mark na 2, znajduję kolejne pierwsze "dziecko"
czyli "linux", ustawiam mu left-mark na 3.
Ponieważ "linux" nie ma "dzieci", ustawiam mu right-mark na 4, po czym wracam
poziom wyżej.
"postgresql" nie ma innych dzieci, więc dostaje right-mark 5 i idę do kolejnego
"dziecka" sql -> czyli "oracle".
Proces powtarzam, aż wrócę do "sql" i nadam mu right-marka.
Cechy:
+ niesamowicie szybkie wyszukiwanie w dół drzewa od określonego elementu
(zakładając wyszukiwanie bez limitu głębokości)
+ nieograniczona ilość poziomów zagnieżdżeń
- nietrywialne w implementacji
- dużo więcej pracy przy wstawianiu i usuwaniu elementów
- utrudnione wyszukiwanie bezpośrednich podkategorii danej kategorii.
*** Metoda 4 ***
Metoda 1 + metoda 2, czyli wykorzystanie i parent_id i left/right mark-ów.
Opisu nie będę robił, bo jest oczywisty.
Cechy:
+ nieograniczona ilość poziomów zagnieżdżeń
+ błyskawiczne wyszukiwanie podkategoriii danej kategorii
+ niesamowicie szybkie wyszukiwanie w dół drzewa od określonego elementu
(zakładając wyszukiwanie bez limitu głębokości)
- sporo pracy przy wstawianiu i usuwaniu elementów
- nietrywialne w implementacji
- nadmiarowość informacji (choć w bazach danych to raczej standard)
*** Metoda 5 ***
Wymyśliliśmy ją z współpracownikami w trakcie pracy nad jednym z magicznych
projektów.
2 tabele:
create table kategorie (
id serial,
name text,
primary key (id)
);
-- ważne: name nie jest unique !!!!
create table powiazania (
first_id int8,
second_id int8,
depth int8,
primary key (first_id, second_id)
);
alter table powiazania add foreign key (first_id) references kategorie (id);
alter table powiazania add foreign key (second_id) references kategorie (id);
Pole depth oznacza, o ile poziomów "głębiej" jest kategoria second od first.
Np. dla sytuacji z metody 2:
kategorie:
id | name
----+------------
1 | sql
2 | postgresql
3 | oracle
4 | linux
5 | solaris
6 | linux
7 | windows
8 | glibc1
9 | glibc2
powiazania:
first_id | second_id | depth
----------+-----------+-------
1 | 2 | 1
1 | 3 | 1
1 | 4 | 2
1 | 5 | 2
1 | 6 | 2
1 | 7 | 2
1 | 8 | 3
1 | 9 | 3
2 | 4 | 1
3 | 5 | 1
3 | 6 | 1
3 | 7 | 1
3 | 8 | 2
3 | 9 | 2
6 | 8 | 1
6 | 9 | 1
Ze względów wydajnościowych oraz ułatwiajacych programowanie polecam dopisywanie
dodatkowo powiazań z głębokością 0, czyli w naszym przypadku 9 rekordów:
first_id | second_id | depth
----------+-----------+-------
1 | 1 | 0
2 | 2 | 0
3 | 3 | 0
4 | 4 | 0
5 | 5 | 0
6 | 6 | 0
7 | 7 | 0
8 | 8 | 0
9 | 9 | 0
Może nie wydaje się to bardzo potrzebne, ale wiele razy okazało się, że taka
dodatkowa ilość danych bardzo ułatwia późniejsze oprogramowywanie.
Zwrócić należy uwagę, że ilość dodatkowych danych jakie trzeba przechowywać
jest zależna od maksymalnej głębokości zagnieżdżenia drzewa.
W skrajnym przypadku ilość danych które trzeba zapisać jest zbliżona do
(n^2)/2 * wielkość rekordu w tablicy powiązania.
W praktyce jednak zazwyczaj nie przekracza się wartości 2n do 3n, co oznacza,
że do zapisania drzewa ze 100 elementami potrzebujemy (zazwyczaj) około
200-300 rekordów w tablicy powiązania. A dzięki temu, że dane tam są proste
(3 pola typu INT), wielkość pojedyńczego rekordu wynosi 12 (lub 24 dla INT8)
bajtów - co nie jest wielką wartością.
Cechy:
+ relatywnie proste w implementacji
+ nieograniczona ilość poziomów zagnieżdżeń
+ błyskawiczne wyszukiwanie podkategoriii danej kategorii
+ niesamowicie szybkie wyszukiwanie w dół drzewa od określonego elementu
(niezależnie od tego, czy z limitem, czy bez limitu głębokości)
+ proste wstawianie i usuwanie rekordów
+ szybkie (dużo szybsze niż w jakiejkolwiek innej implementacji)
tworzenie pełnych nazw
+ szybkie wyszukiwanie kategorii niebezpośrednich (np. znajdź
wszystkie podkategorie podkategorii "informatyki". czyli np.
informatyka/podręczniki/sql tak, ale informatyka/sql już nie)
- nadmiarowość informacji (choć w bazach danych to raczej standard).
Przenoszenie gałęzi drzewa w metodzie 5:
1. zakładamy, że X to id elementu który przenosimy
2. zakładamy, że Y to id elementu pod który przenosimy X
3. zakładamy, że nie powstaje pętla: not exists (select * from tree
where parent_id = X and child_id = Y);
Dwa zapytania:
DELETE FROM tree WHERE id in (
SELECT r2.id FROM tree r1 join tree r2 on r1.child_id = r2.child_id
WHERE r1.parent_id = X AND r2.depth > r1.depth
);
INSERT INTO tree (parent_id, child_id, depth)
SELECT r1.parent_id, r2.child_id, r1.depth + r2.depth + 1
FROM
tree r1,
tree r2
WHERE
r1.child_id = Y AND
r2.parent_id = X;
Więcej o drzewach w SQL:
A Look at SQL Trees - http://www.dbmsmag.com/9603d06.html
Nested Model Sets - http://www.dbmsmag.com/9604d06.html
Trees in SQL - http://www.dbmsmag.com/9605d06.html
___________________
1.10 Szukam modelu danych dla...
Zajrzyj na
___________________
1.11 Gdzie znajdę porównania baz danych?
Bazy danych - ocena i porównanie
Porównania baz danych bibliotecznych
IBM DB2 Universal Database, MS Access 2002, MS SQL Server 2000, MySQL 4.0, Oracle 9iDB
MS Access, MySQL, MS SQL Server
MySQL vs inne bazy
___________________
Literatura:
* Date C.J. - Wprowadzenie do systemów baz danych, WNT, Warszawa, 2000
* Ullman Jeffrey D., Widom Jennifer - Podstawowy wykład z systemów baz
danych, WNT, Warszawa, 2000
* Beynon-Davies Paul - Systemy baz danych, WNT, Warszawa, 1998, 2000
* Ullman S. - Systemy baz danych, WNT, 1988
* Codd E. - The Relational Model for Database Management, Adison-
Wesley Pub. Comp.,1990
* Date C. J. - An Introduction to Database System, vol. II, Adison-
Wesley Pub. Comp., 1991
* Elmasri R., Navathe S. - Fundamentals of Database Systems, Adison-
Wesley Pub. Comp., 1995
* Kim W. - Modern Database Systems, Addison-Wesley, ACM Press, 1994
* Ullman J.D. - Principles of database and knowledge base systems,
Vol. I and II, Computer Science Press, Rockville, Maryland, 1989
* Vossen G. - Data models, database languages and database management
systems, Addison-Wesley Pub. Company, 1991
* Barker R., Longman C. - CASE Method. Modelowanie funkcji i procesów,
WNT, Warszawa, 1996, 2001
* Barker R. - CASE Method. Modelowanie związków encji, WNT, Warszawa,
1996
* Muller Robert J. - Bazy danych. Język UML w modelowaniu danych,
Mikom, Warszawa, 2000
* Henderson K. - Bazy danych w architekturze klient/serwer, Robomatic,
Wrocław, 2000
* Riordan R. M. - Projektowanie systemów relacyjnych baz danych,
Wydawnictwo RM, Warszawa, 2000
* Banachowski L. - Bazy danych. Tworzenie aplikacji., Wydawnictwo
"Akademicka Oficyna Wydawnicza PLJ", Warszawa, 1998
* Fernandez M.J. - Bazy danych dla zwykłych śmiertelników, Mikom,
Warszawa, 1998
* Henderson K. - Bazy danych w architekturze klient/serwer,
Wydawnictwo Robomatic, Wrocław, 2000
* Hall L.C. - Techniczne podstawy systemów klient - serwer, WNT,
Warszawa, 1996
Bazy danych
Bazy danych - wykłady z AGH
Bazy danych - wykłady z PW
Diagramy ERD
webresource.net : Database Center
Bazy danych - wprowadzenie teoretyczne
Tu jest komplet wykladów o bazach, takie tam podstawy.
_____________________________________________________________________
2. Język SQL
Opracował Sławomir Szyszło
Pytania:
2.1 Jak to jest z limitem?
2.2 Jak przenumerować pole typu "autoincrement"?
2.3 Jak zapisać dane polecenie SQL w bazie ...?
2.4 Jak znaleźć luki w numeracji?
Odpowiedzi:
___________________
2.1 Jak to jest z limitem? Mam bazę danych z milionem elementów, a
chcę wyświetlić pierwszych 10, które spełniają określony warunek. Chyba
baza nie będzie niepotrzebnie szukać pozostałych, nie? Na początku
wydawało mi się to logiczne, ale zaczynam się nad tym zastanawiać...
Relacyjna baza danych zakłada nieuporządkowaną kolejność rekordów,
czyli dwa identyczne zapytania z identycznym limitem, ale bez
sortowania (order by) mogą dać dwa różne wyniki. Zdarza się to
relatywnie rzadko, ale tak już jest i np. używanie takiego zapytania
bez sortowania do wyświetlania "po kawałku" wyników wyszukiwania jest
pomyłką.
2.1.1 To znaczy, że gdy mówimy o pierwszych 10 osobach stojących w
kolejce to znaczy, że muszą one być "posortowane"? Chyba pierwsze 10
znaczy pierwsze 10 rekordów spełniających określony warunek i nie
potrzeba tutaj sortowania. Czy nie wystarczy SELECT blabla FROM tabelka
WHERE warunek limit 0,10; ?
Taka komenda jest równoważna "wybierz losowo dziesięć osób spośród
stojących w kolejce". Natomiast powiedzenie "wybierz pierwszych 10 osób
stojących w kolejce" zakłada konkretną kolejność - właśnie kolejność
osób w kolejce. Dlatego też wybranie 10 rekordów bez posortowania
zwykle zwraca losowe 10 rekordów, które za każdym razem mogą być inne
(tzn. teoretycznie - w praktyce zmiana nie będzie częsta).
___________________
2.2 Jak przenumerować pole typu "autoincrement"? Mam w tabeli pole
typu autoincrement. Jeżeli usunę jakiś rekord, to ta liczba pózniej nie
będzie wykorzystana - zrobi się "dziura". Czy można jakoś automagicznie
przenumerowac pozostałe elementy albo przynajmniej zrobić tak, by
następny element miał id równe temu brakującemu, a nie większe o 1 od
największego?
Sposób być może jest, ale mija się to z ideą takiego pola. Pole typu
autoincrement z założenia ma mieć wartości unikalne i ma służyć do
*jednoznacznego* identyfikowania rekordów. Pole typu autoincrement może
być wykorzystywane jako klucz obcy w innej tabeli, a po przenumerowaniu
rekordów powiązania pomiędzy rekordami z obu tabel znikną lub staną się
nieprawidłowe. Przykład:
Tabela pracownicy (id_wydzialu to klucz obcy z tabeli wydzialy (id_w)):
id_p nazwisko id_wydzialu
1 Kowalski 2
2 Nowak 3
3 Iksiński 3
4 Masztalski 1
Tabela wydzialy
id_w nazwa
1 Produkcja
2 Księgowość
3 Magazyn
4 Marketing
Jeśli usuniemy wydział nr 3 i przenumerujemy rekordy tak, że Marketing
będzie miał numer 3, to okaże się, że Nowak i Iksiński nie pracują w
Magazynie, tylko w Marketingu, co jest oczywiście błędne.
___________________
2.3 Jak zapisać dane polecenie SQL w bazie ...?
Tabela odpowiedników najczęściej używanych poleceń SQL w popularnych bazach
danych znajduje się tu:
___________________
2.4 Jak znaleźć luki w numeracji?
Mając tabelę TAB1 z polem numerycznym NUMER i chcąc znaleźć luki w numeracji należy:
- znaleźć wartość minimalną X
SELECT MIN(numer) FROM TAB1;
- znaleźć wartość maksymalną Y
SELECT MAX(numer) FROM TAB1;
- utworzyć tabelę pomocniczą TMP_NUMERACJA i wypełnić ją numerami od X do Y
- wykonać zapytanie:
SELECT numer FROM TMP_NUMERACJA
MINUS
SELECT numer FROM TAB1
ORDER BY numer;
___________________
Literatura:
* Date C. J., Darwen Hugh - SQL. Omówienie standardu języka ("A Guide
to the SQL Standard"), WNT, 2000
* Bowman J.S., Emerson S.L., Darnovsky M. - Podręcznik języka SQL,
WNT, Warszawa, 2001
SQL Tutorial
SQL Reference Page
Interactive/On-line SQL Tutorial with SQL Interpreter
SQL FAQ
Introduction to Structured Query Language
Onet.pl - SQL
Yahoo.com - SQL
_____________________________________________________________________
3. Clipper
Opracował Andrzej Woźniak
Aktualna wersja jest dostępna pod adresem:
Pytania:
3.1 Skąd wziąć?
3.2 Jaką polecacie wersję i dlaczego?
3.3 Gdzie jest FAQ?
3.4 Co to jest "Runtime error 6003"? Dlaczego nie działa _wait_4.obj?
3.5 Co to jest "Internal error 8002"?
3.6 Jak ustawić FILES= i SET CLIPPER= w Windows ME/NT/2000/XP?
3.7 Mój program nic nie robi, a pochłania 100% zasobów systemu.
Co z tym zrobić?
3.8 Jak drukować na drukarkę nie obsługiwaną przez DOS (GDI-windrukarkę
lub USB)?
3.9 Czy z mojego programu mogę wysyłać/odbierać pocztę elektroniczną?
3.10 Muszę odzyskać kod źródłowy programu. Czy jest jakiś dekompilator?
3.11 Chcę przenieść aplikację, czyli co dalej po Clipperze?
3.12 Gdzie mogę znaleźć jakąś bibliotekę do Clippera?
3.13 Windows Me nie pozwala na zmiany w CONFIG.SYS i AUTOEXEC.BAT. Jak przywrócić możliwość zmian?
3.14 Jak wyświetlić/wydrukować znak euro?
3.15 Mam jakieś pliki baz danych. Chyba to dbfy, chyba są uszkodzone...
Odpowiedzi:
___________________
3.1. Skąd wziąć?
Firma Computer Associates zaprzestała produkcji Clippera w drugiej
połowie 2000 roku. 22 kwietnia 2002 r. firma GrafXSoft z Florydy na
mocy porozumienia z Computer Associates faktycznie przejęła Clippera.
Szczegóły na stronie .
Przez cały czas firma GrafXSoft prowadzi
sprzedaż programu i inych narzędzi do Clippera.
Obecnie żaden z polskich dystrybutorów nie ma w magazynie ani Clippera,
ani pakietu narzędziowego CA-Tools. Można ewentualnie szukać w serwisie
Allegro ,
czy ktoś nie wystawił pakietu na sprzedaż.
___________________
3.2. Jaką polecacie wersję i dlaczego?
Do wyboru są dwie wersje Clippera:
* 5.2e - posiada najwięcej rozszerzeń;
* 5.3b - ostatnia dostępna w sprzedaży.
W obu przypadkach najlepiej używać indeksów CDX.
Poza tym są różne konsolidatory:
* dostępne z Clipperem
- 5.2e - RTLink (tryb rzeczywisty) i Exospace (tryb chroniony)
- 5.3b - Blinker v.1.0 (tryb rzeczywisty) i Exospace (tryb chroniony)
* komercyjne (właściwie tylko jeden)
- Blinker v.3.30, v.5.10, teraz już v.6.0
Oczywiście, przydadzą się też narzędzia CA-Tools (patrz p.3.4.)
___________________
3.3. Gdzie jest FAQ?
W wersji polskiej - dopiero powstaje.
W wersji angielskiej - mini
i pełne
lub
___________________
3.4. Co to jest "Runtime error 6003"? Dlaczego nie działa _wait_4.obj?
Polecam lekturę
lub
Problem rozwiązuje pobranie nowej wersji CA-Tools:
Jeśli brak źródeł, można ręcznie załatać program używając
poprawki
lub edytora heksadecymalnego. Trzeba znaleźć w pliku exe sekwencję
B8 52 17 8B CA 33 D2 F7 F1 i zamienić końcowe F7 F1 na 90 90.
___________________
3.5. Co to jest "Internal error 8002"?
Polecam lekturę:
Problem rozwiązuje ściągnięcie aktualizacji Clippera 5.3 do 5.3b i używanie
programu OPTEDIT.EXE.
___________________
3.6. Jak ustawić FILES= i SET CLIPPER= w Windows ME/NT/2000/XP?
W Windows NT/2000/XP trzeba znaleźć i zmodyfikować odpowiedniki plików
CONFIG.SYS - %windir%\SYSTEM32\CONFIG.NT
i AUTOEXEC.BAT - %windir%\SYSTEM32\AUTOEXEC.NT
gdzie %windir% - to najczęściej C:\WINNT
W Windows ME (można też próbować w innych wersjach Windows 9x) należy
zmodyfikować w plik SYSTEM.INI sekcję [386Enh] przez dopisanie linii
PerVMFiles=225 (dla FILES=255).
Dokładna informacja jest dostępna w Knowledge Base firmy Microsoft
Pozostałe parametry SET CLIPPER najprościej dopisać do wiersza poleceń we
właściwościach skrótu, z którego program jest wywoływany, np. tak:
MOJPROG.EXE //E:0 //TEMPPATH:'%TEMP' //SWAPPATH:'%TEMP%'
___________________
3.7. Mój program nic nie robi, a pochłania 100% zasobów systemu.
Co z tym zrobić?
Trzeba podzielić się zasobami z systemem, korzystając z funkcji OL_Yield()
lub OL_AutoYield() w bibliotece OSLib .
Ewentualnie można skorzystać z MULTI102.ZIP
___________________
3.8. Jak drukować na drukarkę nie obsługiwaną przez DOS (GDI-windrukarkę
lub USB)?
Najprościej - używając programu PageScript
Można w ten sposób drukować grafikę i wysyłać faksy!
Polecam też lekturę
___________________
3.9. Czy z mojego programu mogę wysyłać/odbierać pocztę elektroniczną?
Tak, oczywiście. Wystarczy skorzystać z dowolnego programu do
wysyłania/odbioru poczty z wiersza poleceń. Pod Windows dostępny jest
darmowy program BLAT do wysyłania i GETMAIL do odbioru poczty - do pobrania
ze strony
___________________
3.10. Muszę odzyskać kod źródłowy programu. Czy jest jakiś dekompilator?
Jest Rescue5 (słabszy) i Valkyrie. Ten drugi ma wersję dla Clippera
Summer'87 i Clippera 5.0x-5.2x, ale nie dekompiluje programów
konsolidowanych nowszymi wersjami Blinkera (powyżej 3.3).
Valkyrie powinna być dostępna w firmie GrafXSoft (patrz p.3.1).
Profesjonalną (tzn. płatną) pomoc można uzyskać od Rossa McKenzie z ValuSoft
- valusoft(at)mbox.com.au
___________________
3.11. Chcę przenieść aplikację, czyli co dalej po Clipperze?
Odpowiedzi jest wiele. Niektóre proponują zastosowanie rozszerzeń
do Clippera, inne próbują przenieść kod do nowego środowiska.
Wymienię najbardziej znane rozwiązania w kolejności alfabetycznej:
* Advantage Database Systems
* Alaska xBase++
* Apollo
* CA-Visual Objects , patrz p.3.1.
* Clip
* Clip4Win
* Delphi
* FiveWin
* Flagship
* Harbour
* OTC Mediator
___________________
3.12. Gdzie mogę znaleźć jakąś bibliotekę do Clippera?
Większość bibliotek komercyjnych można kupić w firmie GrafXSoft (patrz p.3.1).
Wersji demonstracyjnych/testowych tych bibliotek należy szukać
na stronach www ich producentów.
W ostatnich latach wielu autorów zmieniło status swych bibliotek/programów
na freeware czy public domain i przekazało je do udostępnienia w największej
kolekcji oprogramowania Clipperowego - prowadzonej przez Phila Barnetta Oasis
. Od tego adresu należy zacząć poszukiwania.
___________________
3.13 Windows Me nie pozwala na zmiany w CONFIG.SYS i AUTOEXEC.BAT. Jak przywrócić możliwość zmian?
Przeszukać grupę dyskusyjną pl.comp.os.ms-windows.win9x
Zajrzeć na Windows Online
Przeczytać artykuł
Polecam też lekturę na temat przywracania Dosa w Windows ME:
___________________
3.14 Jak wyświetlić/wydrukować znak euro?
Polecam lekturę
___________________
3.15 Mam jakieś pliki baz danych. Chyba to dbfy, chyba są uszkodzone...
Gdzie znaleźć opis struktur plików, jak te pliki naprawić?
Opisy struktur wielu różnych typów plików są zebrane na .
Artykuł zawiera opis plików dbf, plików
pól memo dbt i fpt, plików zmiennych pamięciowych mem oraz indeksów ndx, mdx,
ntx, idx i cdx.
Najprostsze narzędzie do naprawy plików DBF to FILEFIX z dosowego pakietu
Norton Utilities. Naprawia pliki dBase i Clippera (z polami memo *.DBT).
Do zaawansowanej naprawy plików służy program Recover firmy Abri
___________________
Literatura
* Rick Spence - Clipper 5.2 przewodnik programisty, t. 1, 2, PLJ, Warszawa 1994
* K. Walczak, Walczak - Programowanie w języku Clipper 5.3, W&W, 1995
* K. Walczak, Walczak - Programowanie w języku Clipper 5.0 - 5.2, W&W, 1994
* K. Walczak, Walczak - Clipper, Nauka programowania systemów baz danych dla
początkujących, W&W, 1995
* Cendrowski, Kozłowski, Rakowski - Clipper 5.0 - 5.2, Programowanie dla
zaawansowanych, LYNX-SFT, 1993
* Anders, Behrensdorf, Borges - Clipper 5.0, Seria Sufler PC, LUPUS, 1994
Clipper - Moje zdanie
Clipper - komunikaty błędów, system rozszerzeń
lub
CA-Clipper - opis, procedury, recenzje książek
Clipper...Clipper...Clipper - historia wersji, narzędzia, tips & tricks
_____________________________________________________________________
6. Interbase
Opracował Tomasz Zadora
Pytania:
6.1 Skąd wziąć?
6.2 Dokumentacja
6.3 Polskie znaki w InterBase
6.4 Narzędzia do zarządzania bazą danych
Odpowiedzi:
6.1 Skąd wziąć?
Zamiast InterBase polecam jego ulepszony klon: FireBird. FireBird ma
poprawione wszystkie błędy InterBase (m.in. dziurę w bezpieczeństwie)
oraz zawiera kilka rozszerzeń SQLa w stosunku do InterBase.
FireBirda mozna ściągnąć ze strony:
InterBase ze strony z działu "do pobrania".
___________________
6.1.1 Instalacja
Bardzo prosta,
w przypadku Linuxa: z RPM-a, zalecam architekturę ClassicServer,
w przypadku Windows: zalecam architekturę SuperServer.
___________________
6.2 Dokumentacja
Bogata dokumentacja InterBase w formacie PDF jest do ściągnięcia ze
strony
___________________
6.3 Polskie znaki w InterBase:
- przy tworzeniu bazy danych ustal domyślne kodowanie na WIN-1250, w
przypadku FireBirda możesz także ustalić kodowanie na ISO8859_2
czyli:
CREATE DATABASE 'mojadb.gdb' [inne opcje] DEFAULT CHARACTER SET WIN1250
- definiuj kolumny tekstowe jako (np.):
CREATE TABLE TEST (TEKST VARCHAR(1024) CHARACTER SET WIN1250 COLLATE
PXW_PLK)
atrybut COLLATE sprawia, że przy sortowaniu wg kolumny tekstowej
będą prawidłowo brane pod uwagę polskie litery
- jeżeli do bazy łączysz się przez ODBC, to nie zapomnij we
właściwościach źródła danych ustawić kodowania (charset) na WIN1250
Kodowanie ISO8859_2 jest dostępne tylko w niektórych wersjach FB.
Aby uzyskać polskie litery w IBConsoli przy wykonywaniu zapytań/skryptów,
na początku należy umieścić instrukcję:
SET NAMES WIN1250;
lub
SET NAMES ISO8859_2; (jeżeli masz wersję FireBirda która obsługuje ten charset).
___________________
6.4 Narzędzia do zarządzania bazą danych:
IMHO najlepsze narzędzie to IBExpert - odwiedź
___________________
Literatura
* Piotr Neil Gawroński - InterBase dla "delfinów", Helion, Gliwice, 2001
* Arkadiusz Jakubowski - SQL w InterBase dla Windows i Linuksa,
Helion, Gliwice, 2001
Firebird Relational Database
Strona domowa developerów FireBirda, zawierająca najnowsze informacje i zasoby:
Borland InterBase Open Source
Artykuły techniczne
Porady techniczne
InterBase product documentation
_____________________________________________________________________
7. Microsoft SQL Server
Opracował Waldemar Gil, uwagi i komentarze: waldemar.gil(at)wp.pl
Pytania:
7.1 Skąd wziąć?
7.2 Aktualne wersje oprogramowania
7.2.1 Co zostało istotnie ulepszone w wersji 2000 ? Czy warto dokonać
aktualizacji ?
7.3 Edycje SQL Servera
7.3.1 Jakie edycje mogę zainstalować na Windows 2000 Prof.?
7.3.2 Jakie edycje mogę zainstalować na Windows 98 ?
7.3.3 Jakie edycje mogę zainstalować na Windows CE ?
7.3.4 W jaki są sposób są licencjonowane poszczególne edycje ?
7.4 Narzędzia do zarządzania bazą danych
7.5 Czy przy pomocy Microsoft Access można tworzyć bezpośrednio bazy
danych na SQL Serverze?
7.6 Czy mogę zainstalować SQL Server 2000 na maszynie na której jest
zainstalowany SQL Server 7.0 ?
7.7 Czy mogę odłączyć bazę danych w wersji 7.0 i następnie załączyć w
wersji 2000?
7.8 Czy mogę odtworzyć kopię zapasową bazy danych z wersji 7.0
bezpośrednio na serwerze w wersji 2000?
7.9 Czy podczas upgrade do wersji 2000 mogę zaktualizować tylko
niektóre bazy danych?
7.10 Czy można ustawić dla jednej bazy inny porządek sortowania?
7.11 Jak sprawdzić ile osób korzysta z bazy danych w danej chwili?
Odpowiedzi:
___________________
7.1 Skąd wziąć?
Microsoft SQL Server jest produktem komercyjnym - należy go kupić.
Jeśli nie chcesz od razu wydawać pieniędzy możesz zamówić sobie wersję
testową, działającą przez 120 dni pod adresem
lub ściągnąć bezpośrednio z
sieci pod adresem
.
Warto pamiętać, że edycja MSDE jest rozprowadzana także z najnowszymi
wersjami Visual Studio oraz Office Proffesional.
___________________
7.2 Aktualne wersje oprogramowania
Aktualną wersją oprogramowania jest wersja 2000 z zainstalowanym
Service Pack 2.
W celu sprawdzenia numeru wersji należy zadać zapytanie (np. w SQL
Query Analyzer):
SELECT @@VERSION
Możesz także sprawdzić wersję bezpośrednio w Enterprise Managerze
wybierając właściwości serwera.
W obu przypadkach powinieneś uzyskać numer wersji w jednej z postaci:
8.00.532 - wersja 2000 z zainstalowanym Service Pack 2
8.00.384 - wersja 2000 z zainstalowanym Service Pack 1
8.00.194 - wersja 2000 RTM (czyli przeznaczona do produkcji)
Dla poprzedniej wersji SQL Servera 7.0 wydano do tej pory trzy
uaktualnienia serwisowe:
7.00.961 - wersja 7.0 z Service Pack 3
7.00.842 - wersja 7.0 z Service Pack 2
7.00.699 - wersja 7.0 z Service Pack 1
7.00.623 - wersja 7.0 RTM
Jeżeli w systemie zainstalowano jedną z gorących poprawek (HotFix) to
możesz uzyskać numer wersji różnych od wyżej wymienionych. Powinieneś
zadbać jednak o to, aby numer wersji był jak najwyższy - dzięki temu
unikniesz błędów w oprogramowaniu, które zostały już wykryte i
naprawione. Z drugiej strony musisz pamiętać o tym, że wszelkie
poprawki mogą także zawierać błędy. Zatem przed ich zainstalowaniem
warto je samodzielnie przetestować.
7.2.1 Co zostało istotnie ulepszone w wersji 2000 ? Czy warto dokonać
aktualizacji ?
Można wymienić wiele usprawnień, jednak o tym czy warto dokonać
aktualizacji (i wydać na to pieniądze) będziesz musiał sobie
odpowiedzieć sam. Najważniejsze (moim zdaniem) usprawnienia:
* wsparcie dla XML (bezpośrednie czytanie i zapisywanie w tym
formacie),
* funkcje definiowane przez użytkownika,
* wiele instancji na jednej maszynie (do 16),
* indexed view - widoki, których wynik (w dużym uproszczeniu) jest
przechowywany jak tabela,
* definiowane więzy integralności,
* definicja porządku sortowania oddzielnie dla każdej bazy danych (lub
nawet pola w tabeli),
* zintegrowany i rozszerzony Data Mining,
* znaczne ulepszenia m.in w obsłudze klastrów, replikacji,
wyszukiwaniu pełnotekstowym.
Jeśli jakieś funkcji spośród wyżej wymienionych brakuję Ci w wersji
7.0 to polecam aktualizację.
___________________
7.3 Edycje SQL Servera
SQL Server 2000 został opracowany w siedmiu edycjach:
* SQL Server 2000 Enterprise (Ent) - najbardziej rozbudowana,
przeznaczona dla produkcyjnych serwerów,
* SQL Server 2000 Server (Srv) - dla grup roboczych lub wydziałów w
przedsiębiorstwach,
* SQL Server 2000 Personal (Per) - dla pojedynczych użytkowników,
* SQL Server 2000 Developer (Dev) - dla programistów, odpowiednik
wersji Enterprise ze specjalną licencją dla celów rozwijania
oprogramowania, nie można stosować w środowisku produkcyjnym,
* SQL Server 2000 Desktop (MSDE) - jako motor bazy danych dla
aplikacji,
* SQL Server 2000 Windows CE (CE) - dla komputerów przenośnych
(palmtopów)
* SQL Server 2000 Enterprise Evaluation (EE) - dla celów testowowych
przez 120 dni.
Poniżej przedstawiłem porównanie wybranych cech edycji (wszystkie
parametry należy traktować pod warunkiem, że system operacyjny na to
pozwala):
Wersja Ent | Srv | Per | Dev | MSDE | CE | EE |
---------------------------------------------------------------------------------------
Cecha
---------------------------------------------------------------------------------------
Maksymalna 32 | 4 | 2 | 32 | 2 | n/d | 32 |
liczba | | | | | | |
procesorów | | | | | | |
---------------------------------------------------------------------------------------
Max wielkość
RAM 64 GB | 2 GB | 2 GB | 64 GB | 2 GB | n/d | 64 GB |
---------------------------------------------------------------------------------------
Max liczba | | | | | | |
instancji na | | | | | | |
jednej maszynie 16 | 16 | 16 | 16 | 16 | n/d | 16 |
---------------------------------------------------------------------------------------
Praca w klastrach + | - | - | + | - | - | + |
---------------------------------------------------------------------------------------
Zaawansowane techniki + | - | - | + | - | - | + |
(np. Log Shipping, | | | | | | |
Indexed View, SAN Support, | | | | | | |
itd.) | | | | | | |
---------------------------------------------------------------------------------------
Wyszukiwanie pełnotekstowe + | + | + | + | - | - | + |
---------------------------------------------------------------------------------------
Moduł analityczny (OLAP) + | + | + | + | - | - | + |
---------------------------------------------------------------------------------------
Data mining + | + | + | + | - | - | + |
---------------------------------------------------------------------------------------
English Query + | + | + | + | - | - | + |
---------------------------------------------------------------------------------------
Max. rozmiar bazy 1 mln TB |1 mln TB|1 mln TB|1 mln TB| 2 GB |1 mln TB|1 mln TB|
---------------------------------------------------------------------------------------
7.3.1 Jakie edycje mogę zainstalować na Windows 2000 Prof. ?
Developer, Personal, Desktop, Enterprise Evaluation.
7.3.2 Jakie edycje mogę zainstalować na Windows 98 ?
Personal, Desktop.
7.3.3 Jakie edycje mogę zainstalować na Windows CE ?
Jedynie SQL Server 2000 Windows CE.
7.3.4 W jaki są sposób są licencjonowane poszczególne edycje ?
Dla edycji Standard i Enterprise istnieją dwa modele licencjonowania:
na procesor i na nazwanego użytkownika (CAL). W przypadku licencji na
procesor wymaganej jest posiadanie licencji na każdy procesor w
maszynie na której pracuje SQL Server. W przypadku wykorzystywania
wielu instancji na jednej maszynie dla edycji Enterprise nie są
wymagane dodatkowe licencji, dla edycji Standard musimy mieć licencję
na każdy procesor oraz każdą instancję oddzielnie.
W modelu licencjonowania CAL musimy posiadać licencję na każdy serwer
oraz dla każdego użytkownika korzystającego z zasobów serwera.
Edycję Personal może zainstalować każdy użytkownik, który posiada
licencję na korzystanie z zasobów edycji Standard lub Enterprise.
Edycja Developer jest licencjonowana na pojedynczego programistę.
Edycja Desktop jest najczęściej rozprowadzana na z opracowanymi
specjalnie dla SQL Servera aplikacjami. Zatem musisz posiadać licencję
na taką aplikację. Warto zaznaczyć, że nie uprawnia to do korzystania z
edycji Desktop w inny sposób (np. projektowania własnego
oprogramowania).
Edycja Enterprise Evaluation upoważnia do zainstalowania i testowania
serwera przez okres 120 dni. Nie wolno jej jednak wykorzystywać do
zadań prodkcyjnych.
___________________
7.4 Narzędzia do zarządzania bazą danych
Zdecydowanie najlepszym i najbardziej popularnym jest Enterprise
Manager dostarczany wraz z serwerem (oprócz wersji Desktop).
___________________
7.5 Czy przy pomocy Microsoft Access można tworzyć bezpośrednio bazy
danych na SQL Serverze ?
Tak, posługując się tzw. projektami wprowadzonymi w Accessie od wersji
2000. Można utworzyć i modyfikować samą bazę danych, a także tabele,
widoki, procedury, uprawnienia użytkowników, itd.
Przy tworzeniu baz dla SQL Servera w wersji 2000 zalecane jest
używanie Accessa w wersji XP. W przypadku Access 2000 należy
zainstalować dodatkowo aktualizację znajdującą się pod adresem:
___________________
7.6 Czy mogę zainstalować SQL Server 2000 na maszynie na której jest
zainstalowany SQL Server 7.0 ?
Tak. Możesz zainstalować SQL Server 2000 jako nazwaną instancję, a
następnie możesz uruchomić jednocześnie serwer 2000 wraz z działającym
serwerem w wersji 7.0.
___________________
7.7 Czy mogę odłączyć bazę danych w wersji 7.0 i następnie załączyć w
wersji 2000 ?
Tak. Możesz odłączyć (detach) bazę danych w wersji 7.0, a następnie
załączyć ją (attach) w wersji 2000. Musisz pamiętać jednak o tym, że
załączenie bazy danych w wersji 2000 powojuje jej taką modyfikację, że
nie da się ponownie załączyć w wersji 7.0.
___________________
7.8 Czy mogę odtworzyć kopię zapasową bazy danych z wersji 7.0
bezpośrednio na serwerze w wersji 2000 ?
Tak. Możesz odtworzyć kopię zapasową bazy danych z wersji 7.0
bezpośrednio w wersji 2000. Niestety, odwrotna operacja (odtworzenia
bazy 2000 na wersji 7.0) nie jest możliwa.
___________________
7.9 Czy podczas upgrade do wersji 2000 mogę zaktualizować tylko
niektóre bazy danych ?
Nie. Jeśli dokonujesz procesu upgrade musisz zaktualizować wszystkie
bazy danych.
Jeśli zależy Ci na aktualizacji tylko niektórych baz danych zainstaluj
serwer 2000 jako dodatkową nazwaną instancję, następnie przenieść
wybrane bazy danych. Na jednej maszynie będą wtedy działały dwie wersje
SQL Servera: 7.0 oraz 2000.
___________________
7.10 Czy można ustawić dla jednej bazy inny porządek sortowania ?
W wersji 7.0 nie. W wersji 2000 tak - dla każdej bazy danych (a nawet
pola w tabeli) możesz ustawić innym porządek sortowania.
___________________
7.11 Jak sprawdzić ile osób korzysta z bazy danych w danej chwili ?
Istnieje kilka sposobów, np.:
Query Analizer - polecenie sp_who - informacje o użytkownikach.
Query Analizer - polecenie select * from sysprocesses - informacje o
procesach.
Enterprise Manager w opcji Current Activity
___________________
Literatura:
* Gunderloy M., Chipman M. - SQL Server 7, Mikom, Warszawa, 1999
* Microsoft SQL Server 7 Resource Kit, Wydawnictwo Microsoft Press,
wydane w Polsce przez A.P.N. Promise; Warszawa, 1999
* Baird S., Miller Ch. - SQL Server. Administracja, ROBOMATIC,
Wrocław, 2000
* Gallagher S. - Microsoft SQL Server 7. Księga Eksperta, Helion,
Warszawa, 2000
* Riordan R. M. - Programowanie Microsoft SQL Server 2000 krok po
kroku, READ-ME, Warszawa, 2001
Microsoft SQL Server
Dokumentacja on-line
_____________________________________________________________________
8. MySQL
Opracował Sławomir Szyszło
Pytania:
8.1 Skąd wziąć?
8.2 Aktualna wersja?
8.3 Szukam kompletnego, darmowego tutoriala dla MySQL.
8.4 Czy możecie polecić mi dobrego klienta MySQL pod Windows?
8.5 Jak wyeksportować tabele/dane do pliku?
8.6 Czy MySQL obsługuje podzapytania?
8.7 Czy MySQL obsługuje procedury wbudowane, triggery i perspektywy?
8.8 Jak wygląda obsługa różnych kodowań znaków?
Odpowiedzi:
___________________
8.1 Skąd wziąć?
Oficjalny serwis:
Mirrory w Polsce, np.:
___________________
8.2 Aktualna wersja?
Na 10-10-2004: wersja stabilna 4.0.21, wersja rozwojowa 4.1 i 5.0
___________________
8.3 Szukam kompletnego, darmowego tutoriala dla MySQL. Ale bez
tłumaczenia co znaczy SELECT itp. Tak dla kogoś kto pracował nad innym
DBMS.
___________________
8.4 Czy możecie polecić mi dobrego klienta MySQL pod Windows?
phpMyAdmin - zestaw skryptów PHP do zarządzania bazą MySQL przez WWW.
Wymagany serwer http obsługujący PHP.
MySQLWinAdmin - interfejs GUI do administracji
mysqlfront - klient dla Windows - oferuje dostęp i zarządzanie bazą,
tabelami, danymi, indeksami, plikami importu i eksportu
Dbtools - narzędzie do zarządzania bazą MySQL - oferuje zarządzanie
serwerem, bazami, tabelami, kolumnami, indeksami i użytkownikami.
Zawiera narzędzie do importu struktury i danych z MS Access, MS Excel,
Dbase, FoxPro, Paradox i baz obsługiujących ODBC.
Więcej narzędzi do MySQL:
Spis:
Pobieranie:
___________________
8.5 Jak wyeksportować tabele/dane do pliku?
Służy do tego program mysqldump. Szczegóły są podane w dokumentacji.
Import stworzonych danych z powrotem do bazy o nazwie "database":
shell> mysql database < nazwa_dumpa
Jeśli plik tekstowy zaczyna się od
USE db_name
to w tym przypadku dane zostaną wczytane do bazy "db_name" i nie trzeba podawać tej
nazwy w linii komend:
shell> mysql < text_file
___________________
8.6 Czy MySQL obsługuje podzapytania?
W wersjach 4.x i niższych MySQL obsługuje podzapytania tylko w instrukcjach
INSERT ... SELECT ... oraz REPLACE ... SELECT .... Podzapytania są już w wersji 4.1.
___________________
8.7 Czy MySQL obsługuje procedury wbudowane, triggery i perspektywy?
Obsługa procedur wbudowanych i perspektyw jest dodana w wersji 5.0, w tejże wersji
będą też triggery.
___________________
8.8 Jak wygląda obsługa różnych kodowań znaków?
Do wersji 4.0 serwer mógł być ustawiony na konkretny zestaw znaków.
W wersji 4.1 można korzystać z różnych zestawów na poziomie serwera, bazy danych, tabeli lub pola.
Są dostępne również możliwości konwertowania pomiędzy różnymi kodowaniami. Można też przechowywać
dane w formacie Unicode - są obsługiwane kodowania UCS2 i UTF8.
___________________
Literatura:
* Yarger R.J., Reese G., King T. - MySQL i mSQL ("MySQL and mSQL"),
Helion, Gliwice, 2001
* DuBois Paul - MySQL, Mikom, Warszawa, 2000
MySQL FAQ
Dokumentacja do MySQL
Artykuły o MySQL
_____________________________________________________________________
9. Oracle
Opracował Sławomir Szyszło
Pytania:
9.1 Skąd wziąć?
9.2 Jak zrobić automatyczną numerację rekordów?
9.3 Oracle FORMS - COMMIT problem.
9.4 Wyszukiwanie w polach znakowych zawierających znaki narodowe.
9.5 Czy można w procedurze PL/SQL wysłać komunikat na ekran?
9.6 Czy możliwe jest stworzenie procedury składowanej zwracającej
zestaw rekordów?
9.7 Jak zlikwidować ograniczenie NOT NULL nie znając jego nazwy?
9.8 Jak ograniczyć ilość zwracanych wierszy z zapytania select?
9.9 Jak zainstalować bazę Oracle i Developera na jednym komputerze?
[wersja beta]
9.10 Jak znaleźć rekordy z konkretnego dnia?
9.11 Jak znaleźć wszystkie "foreign key" założone na innych tabelach i
odnoszące się do kolumn w tabeli NAZWA_TABELI?
9.12 Instalacja Oracle pod Linuksem
9.13 Dlaczego podczas wykonywania triggera wyskakuje błąd "ORA-04091
table string.string is mutating, trigger/function may not see it"?
9.14 Mam problem z instalacją Oracle 8.1.x na komputerze z Pentium 4...
9.15 Poszukuję tutoriali do Forms i/lub innego oprogramowania Oracle
9.16 Jakie wybrać narzędzie zamiast SQL*Plus-a?
9.17 Jak sprawdzić, który element procedury/funkcji PL/SQL wykonuje się najdłużej?
Odpowiedzi:
___________________
9.1 Skąd wziąć?
___________________
9.2 Jak zrobić automatyczną numerację rekordów?
Do autonumerowania slużą sekwencje. Można je tworzyć w następujący
sposób:
create sequence [schemat.]nazwa_sekwencji [increment by x] [start withy]
[maxvalue max|nomaxvalue] [minvalue min|nominvalue] [cycle|nocycle]
[cache|nocache] [order|noorder];
Parametry podane w nawiasach kwadratowych są opcjonalne. Jeśli
sekwencja zostanie stworzona bez żadnych parametrów:
create sequence test;
to zostaną przyjęte parametry domyślne:
increment by 1 nominvalue nomaxvalue nocycle cache 20 noorder
co oznacza, że sekwencja będzie zwiększana co 1, nie ma minimalnej i
maksymalnej wartości, sekwencja nie będzie generować więcej wartości po
osiągnięciu maksimum lub minimum. Dwadzieścia kolejnych wartości będzie
przechowywanych w pamięci cache w celu szybszego dostępu; nie ma
gwarancji, że liczby będą generowane w kolejności przychodzenia żądań.
Jeśli sekwencja ma zmniejszać swoją wartość, należy zadeklarować ją w
ten sposób:
create sequence seq_zmniejszajaca increment by -1 start with 10000000
maxvalue 10000000 minvalue 1;
Parametry sekwencji można obejrzeć poprzez perspektywę USER_SEQUENCES
SQL> SELECT * FROM user_sequences;
SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
-------------------- --------- --------- ------------ - - ---------- -----------
SEQ_ZMNIEJSZAJACA 1 10000000 -1 N N 20 10000000
TEST 1 1,000E+27 1 N N 20 1
Widać, że sekwencja utworzona z parametrami domyślnymi ma maksymalną
wartość 1E+27, co wynika z maksymalnego rozmiaru liczby dla sekwencji,
czyli 28 cyfr.
Kolejne wartości z sekwencji pobieramy w ten sposób:
nazwa_sekwencji.nextval
a wartość bieżącą sekwencji:
nazwa_sekwencji.currval
SQL> SELECT test.nextval FROM dual;
NEXTVAL
---------
1
SQL> SELECT test.currval FROM dual;
CURRVAL
---------
1
Jak widać, pierwsze zwiększenie sekwencji po jej utworzeniu zwraca jej
wartość początkową. Odwołanie do bieżącej wartości (CURRVAL) zwraca
bieżącą wartość sekwencji, która jest wartością zwróconą przez ostatnie
odwołanie do NEXTVAL. Przed użyciem CURRVAL dla danej sekwencji w danej
sesji należy najpierw zainicjalizować sekwencję przy pomocy NEXTVAL. W
innym wypadku wyniki mogą być niespodziewane. Można to przetestować
tworząc nową sekwencję i sprawdzając jej wartość za pomocą CURRVAL.
Przykładowe użycie sekwencji:
INSERT INTO emp VALUES (empseq.nextval, 'LEWIS', 'CLERK', 7902,
SYSDATE, 1200, NULL, 20);
Wykorzystanie sekwencji do automatycznego numerowania rekordów przy wstawianiu:
create or replace trigger nadaj_id
before insert on tabela
for each row
begin
if :new.id is null then
select tab_seq.nextval into :new.id from dual;
end if;
end;
Jeśli nie będziemy sprawdzać, czy wstawiane pole id jest puste, to wtedy każdy
wpisany rekord będzie posiadał numer nadany przez sekwencję. Spowoduje to niemożność
wstawienia rekordu z zadanym numerem id - jeśli zaszłaby taka konieczność. Oczywiście
zawsze warto, aby na polu id był założony klucz unikalny bądź główny - pozwoli to
uniknąć ewentualnych duplikatów w tym polu.
___________________
9.3 Oracle FORMS - COMMIT problem. Przy wywoływaniu polecenia COMMIT w
procedurze pojawia sie okienko z napisem "FRM-40405: Brak zmian do
zastosowania". Dzieje się tak mimo iż używam zmiennej systemowej
:SYSTEM.MESSAGE_LEVEL (podstawiałem chyba wszystkie możliwe wartości
przed wywołaniem commit). Czy ktoś może wie jak wyłączyć wyświetlenie
takich komunikatów?
Komunikat bierze się stąd, że nie było żadnych zmian na blokach w
formie. Zamiast COMMIT; wpisz FORMS_DDL('commit'); To samo należy
zastosować w przypadku błędu FRM-40401.
___________________
9.4 Wyszukiwanie w polach znakowych zawierających znaki narodowe.
Mamy takie dane:
[1]
SELECT identyfikator FROM kontrahenci ORDER BY identyfikator;
IDENTYFIKATOR
-------------
(...)
K014
K015
K015
L010
L011
L012
Ł001
M001
M001
(...)
Standardowo, ciągi znakowe w klauzuli WHERE są porównywane wg
binarnych wartości
poszczególnych znaków, co może powodować nieprawidłową kolejność ciągów
znakowych - inną niż by to wynikało z kolejności znaków w alfabecie
danego języka.
Tak więc, zamiast zapytania
[2]
SELECT identyfikator FROM kontrahenci WHERE identyfikator > 'K%' and
identyfikator < 'N%' ORDER BY identyfikator;
które zwróci takie wyniki (nie pokaże się identyfikator 'Ł001'):
IDENTYFIKATOR
-------------
(...)
K015
K015
L010
L011
L012
M001
M001
M001
(...)
NALEŻY użyć takiego zapytania:
[3]
SELECT identyfikator FROM kontrahenci WHERE nlssort(identyfikator) >
nlssort('K%') and nlssort(identyfikator) < nlssort('N%')
ORDER BY identyfikator;
co spowoduje, że wyniki sortowania będą prawidłowe:
IDENTYFIKATOR
-------------
(...)
K014
K015
K015
L010
L011
L012
Ł001
M001
M001
(...)
Oczywiście należy mieć ustawione prawidłowe parametry sortowania w
NLS_SESSION_PARAMETERS:
SQL> SELECT * FROM nls_session_parameters;
PARAMETER VALUE
----------- ------
(...)
NLS_SORT POLISH
(...)
Jeśli parametr NLS_SORT jest bezpośrednio w bazie danych ustawiony na
wartość POLISH, to:
- gdy klient ma ustawienie NLS_SORT = POLISH znaki są prawidłowo
sortowane; przy wyszukiwaniu w polach znakowych ze znakami narodowymi
należy dodatkowo użyć funkcji nlssort
- gdy klient ma ustawienie NLS_SORT np. amerykańskie, to polskie znaki
są sortowane niepoprawnie, nawet gdy używamy funkcji nlssort.
- jeśli zmienimy klientowi parametry:
alter session set nls_sort='POLISH';
wtedy proste sortowanie typu
SELECT * FROM tabela ORDER BY pole_tekstowe;
jest wykonywane prawidłowo, ale gdy znaki narodowe występują w
klauzuli WHERE należy pamiętać o użyciu funkcji NLSSORT.
___________________
9.5 Czy można w procedurze PL/SQL wysłać komunikat na ekran?
Można, za pomocą procedur pakietu DBMS_OUTPUT, np.
dbms_output.put('Zmienna a = '||a);
dbms_output.put_line('Zmienna a = '||a);
Drugie polecenie powoduje wyświetlenie napisu z przejściem do nowej
linii. W SQL*Plus trzeba ustawić wcześniej:
set serveroutput on;
___________________
9.6 Czy możliwe jest stworzenie procedury składowanej zwracającej
zestaw rekordów?
Można to zrobić w ten sposób:
CREATE OR REPLACE PACKAGE PROBA_PCK IS
TYPE R IS RECORD
(
id NUMBER(15,0),
imie VARCHAR2(20), -- tutaj specyfikacje odpowiednich kolumn z
tabeli pracownicy
nazwisko VARCHAR2(50)
);
TYPE kursor_r IS REF CURSOR RETURN R;
procedure Test(k_r IN OUT kursor_r,x number);
END PROBA_PCK;
/
CREATE OR REPLACE PACKAGE BODY PROBA_PCK IS
procedure Test(k_r IN OUT kursor_r,x number) is
begin
open k_r for SELECT id,imie,nazwisko FROM pracownicy WHERE
wynagrodzenie > x;
end;
END PROBA_PCK;
/
Taki mechanizm jest wykorzystywany przez FORMSy, gdy blok jest oparty
na procedurach składowanych (a nie standardowo na tabeli).
___________________
9.7 Jak zlikwidować ograniczenie NOT NULL nie znając jego nazwy?
alter table nazwa_tabeli modify (id NULL);
___________________
9.8 Jak ograniczyć ilość zwracanych wierszy z zapytania SELECT?
- możesz użyć kursora:
declare
-- kursor pobierający dane z tabeli
cursor top is SELECT * FROM tabela ORDER BY pole1;
-- zmienna przechowująca zawartość bieżącego rekordu
top_zm top%rowtype;
ile_pobrac number(6) := 10;
l_pobranych number(6) := 0;
begin
open top;
while l_pobranych < ile_pobrac loop
fetch top into top_zm;
exit when top%NOTFOUND;
l_pobranych := l_pobranych + 1;
dbms_output.put_line(top_zm.pole1||top_zm.pole2||top_zm.pole3);
end loop;
close top;
end;
- jeśli nie zależy ci na kolejności:
SELECT * FROM tabela WHERE rownum < 10;
- jeśli zależy ci na kolejności (to działa dopiero od Oracle 8i):
SELECT * FROM (SELECT * FROM tabela ORDER BY jakaskolumna) WHERE
rownum < 10;
Dla wersji wcześniejszych niż 8i:
SELECT * FROM tabela a WHERE 10 >=
(SELECT count(distinct maxcol) FROM my_table b WHERE b.maxcol >=
a.maxcol)
order by maxcol;
___________________
9.9 Jak zainstalować bazę Oracle i Developera na jednym komputerze?
[wersja beta]
[na podstawie instalacji Personal Oracle8 i Developer 6i w Windows 98]
Co potrzebujemy? Jeśli posiadamy system Windows 98, to potrzebna jest
baza Oracle8i Personal Edition Release 8.x.x for Windows 98. Jeśli
naszym systemem jest Windows NT/2000, to potrzebna jest baza Oracle8i
Personal Edition Release 8.x.x for Windows NT. Kolejność instalacji
jest następująca: najpierw Developer w jednym katalogu ORACLE_HOME, a
następnie baza w innym ORACLE_HOME.
Konfiguracja przykładowej bazy:
Developer: DEV_HOME, d:\dev2000
Personal Oracle: ORACLE_HOME, d:\oracle
GLOBAL_DBNAME = slawek
SID = slawek
ORACLE_HOME = d:\oracle
DEV_HOME = d:\dev2000
Plik $ORACLE_HOME\network\admin\listener.ora:
--
# specyfikacja adresów, pod którymi listener "nasłuchuje"
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
)
(DESCRIPTION =
(PROTOCOL_STACK =
(PRESENTATION = GIOP)
(SESSION = RAW)
)
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 2481))
)
)
# lista serwisów, do których listener może łączyć klientów
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)(ORACLE_HOME = d:\Oracle)(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = slawek)(ORACLE_HOME = d:\Oracle)(SID_NAME = slawek)
)
)
# gdzie logować działania listenera
LOG_FILE_LISTENER = lsnr
LOG_DIRECTORY_LISTENER = d:\oracle\network\log
Plik $ORACLE_HOME\network\admin\sqlnet.ora:
--
names.default_domain = world
names.default_zone = world
names.directory_path= (TNSNAMES, HOSTNAME)
Plik $ORACLE_HOME\network\admin\tnsnames.ora:
--
slawek.world =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =
(COMMUNITY = tcp.world)(PROTOCOL = TCP)(Host = localhost)(Port = 1521)
)
(ADDRESS =
(COMMUNITY = tcp.world)(PROTOCOL = TCP)(Host = localhost)(Port = 1526)
)
)
(CONNECT_DATA = (SERVICE_NAME = slawek)(SID = slawek)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(CONNECT_DATA =
(SID = PLSExtProc)(PRESENTATION = RO)
)
)
Plik $DEV_HOME\net80\admin\sqlnet.ora:
--
names.directory_path = (TNSNAMES, HOSTNAME)
names.default_domain = world
name.default_zone = world
Plik $DEV_HOME\net80\admin\tnsnames.ora
--
slawek.world =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =
(COMMUNITY = tcp.world)(PROTOCOL = TCP)(Host = localhost)(Port = 1521)
)
(ADDRESS =
(COMMUNITY = tcp.world)(PROTOCOL = TCP)(Host = localhost)(Port = 1526)
)
)
(CONNECT_DATA = (SID = slawek)
)
)
W celu automatycznego startu listenera (procesu "nasłuchującego")
zmieniamy w Rejestrze w HKEY_LOCAL_MACHINE\Software\ORACLE\HOME0
wartość ciągu LISTENER_STARTUP na AUTO.
Jeśli chcemy, aby w narzędziach Developera nie trzeba było wpisywać
"connect string", należy dodać nową wartość ciągu w Rejestrze Windows:
LOCAL="slawek" w HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME1. Oczywiście
zamiast "slawek" wpisujemy nazwę aliasu, którą wpisaliśmy do
TNSNAMES.ORA, a zamiast HOME1 wybieramy ten ORACLE_HOME, w którym jest
zainstalowany Developer.
___________________
9.10 Jak znaleźć rekordy z konkretnego dnia?
Załóżmy, że w tabeli znajduje się pole data typu "date"; chcemy
znaleźć rekordy np. z dnia 2001/05/21. Należy wiedzieć, że data w bazie
Oracle składa się z dnia i godziny, tak więc jeśli w warunku WHERE nie
podamy godziny, to baza domyślnie przyjmuje godzinę 0:00:00. Aby
otrzymać prawidłowe wyniki należy więc albo podać godzinę albo usunąć
ją z pola data (za pomocą funkcji trunc).
[1 - obcinamy godzinę i zostają zwrócone rekordy tylko z żądaną datą]
select ... where trunc(data) = to_date('2001/05/21', 'YYYY/MM/DD');
[2 - pobieramy rekordy, w których data jest większa lub równa żądanej
i jednocześnie mniejsza od następnego dnia]
select ... where data >= to_date('2001/05/21','YYYY/MM/DD') and data <
to_date('2001/05/22','YYYY/MM/DD');
[3 - pobieramy rekordy, w których data jest równa żądanej;
wykorzystujemy tu konwersję daty pobranej z rekordu na ciąg znaków; bez
tej konwersji to zapytanie będzie zwracać nieprawidłowe wyniki!]
select ... where to_char(data, 'YYYY/MM/DD') = '2001/05/21';
Funkcja to_date jest potrzebna, gdy nie znamy formatu daty ustawionego
u klienta. Należy zwrócić uwagę na to, że gdy użyjemy pierwszego lub
trzeciego sposobu, dla każdego rekordu pobranego z tabeli będzie
wykonywana funkcja trunc lub to_char, co przy większej liczbie rekordów
może mieć ujemny wpływ na wydajność. W drugim zapytaniu funkcja
konwersji będzie wykonana tylko 2 razy.
Rozwiązania z użyciem godziny:
[4 - wybieramy daty z godziną większą lub równą godzinie 0:00
szukanego dnia oraz z godziną mniejszą lub równą godzinie 24:00 (czyli
końcu doby) szukanego dnia]
select ... where to_char(data, 'YYYY/MM/DD, HH24:MI:SS') >=
'2001/05/21, 00:00:00' and to_char(data, 'YYYY/MM/DD, HH24:MI:SS') <=
'2001/05/21, 24:00:00';
[5 - wybieramy daty z godziną większą lub równą godzinie 0:00
szukanego dnia oraz z godziną mniejszą niż godzina 0:00 następnego dnia]
select ... where to_char(data, 'YYYY/MM/DD, HH24:MI:SS') >=
'2001/05/21, 00:00:00' and to_char(data, 'YYYY/MM/DD, HH24:MI:SS') <
'2001/05/22, 00:00:00';
___________________
9.11 Jak znaleźć wszystkie "foreign key" założone na innych tabelach i
odnoszące się do kolumn w tabeli NAZWA_TABELI?
Można tu wykorzystać następujące zapytanie:
SELECT c.owner,c.table_name "TABELA Z FK",
c.constraint_name "NAZWA FK",
ucc.table_name "TABELA Z PK",
ucc.column_name "KOLUMNA Z PK"
FROM user_constraints c, user_cons_columns ucc
WHERE c.r_constraint_name=ucc.constraint_name
AND ucc.table_name='NAZWA_TABELI';
Pokaże ono mniej więcej takie wyniki:
OWNER TABELA Z FK NAZWA FK TABELA Z PK KOLUMNA Z PK
------ ------------- ----------- ------------ ------------
PO8 PRACOWNICY SYS_C00926 NAZWA_TABELI ID
PO8 PRACOWNICY2 SYS_C00931 NAZWA_TABELI ID
Mamy tutaj tabele, które zawierają klucze obce do tabeli NAZWA_TABELI
i wiemy, której kolumny w tejże tabeli dotyczy klucz obcy. Jeśli chcemy
wiedzieć, na jakich kolumnach są założone klucze obce, to trzeba
wykorzystać takie zapytanie:
SELECT ucc.constraint_name "NAZWA FK",
ucc.owner,
ucc.table_name "TABELA Z FK",
ucc.column_name "KOLUMNA Z FK"
FROM user_cons_columns ucc where ucc.constraint_name IN
(
SELECT c.constraint_name
FROM user_constraints c, user_cons_columns cc
WHERE c.r_constraint_name=cc.constraint_name
AND cc.table_name='NAZWA_TABELI'
);
Wyniki powinny być podobne do tych:
NAZWA FK OWNER TABELA Z FK KOLUMNA Z FK
------------ ------ ------------ -------
SYS_C00926 PO8 PRACOWNICY ID_EMP
SYS_C00931 PO8 PRACOWNICY2 ID_FK
Poniższe zapytanie również poda nam nazwy szukanych tabel i nazwy
kluczy obcych:
SELECT c.owner,c.table_name "TABELA Z FK",
c.constraint_name "NAZWA FK"
FROM user_constraints c
WHERE c.constraint_type = 'R'
AND c.r_constraint_name IN
(SELECT uc.constraint_name FROM user_constraints uc WHERE
uc.table_name = 'NAZWA_TABELI');
OWNER TABELA Z FK NAZWA FK
------ ------------ ----------
PO8 PRACOWNICY SYS_C00926
PO8 PRACOWNICY2 SYS_C00931
___________________
9.12 Instalacja Oracle pod Linuksem
Opracował: Robert Diak
Najlepsze opracowania instalacji Oracla8i na platformę Linux znajdują
się w nastepujących miejscach:
W tym opracowaniu skupię na opisie instalacji Oracla8i na systemie
operacyjnym RedHat 6.2. Na wyżej wymienionych stronach znajdują się
wyczerpujące opisy instalacji Oracla na innych wersjach tego systemu.
1. Ściagamy odpowiednią wersję Oracla z ulubionego serwera. Z
można ściągnąć najnowszą dystrybucję
linux81701.tar. Zajmuje ona ponad 500MB więc trzeba się uzbroić w
cierpliwość.
2. Z serwisu musimy wziąć JDK oraz JRE,
odpowiednio pakiety:
jdk118_v3-glibc-2.1.3.tar.bz2 oraz
jre118_v3-glibc-2.1.3.tar.bz2
3. Rozpakowujemy obydwa archiwa do odpowiednich katalogow w /usr/local
i robimy odpowiednie dowiązania symboliczne (linki) nazywając je
odpowiednio JAVA i JRE.
4. Logujemy się jako root i zakładamy użytkowników oraz grupy
konieczne do instalacji Oracla.
4a) groupadd dba
4b) groupadd oper
4c) groupadd oinstall
4d) useradd oracle -g oinstall -G dba
4e) passwd oracle
4f) mkdir /u01 /u02
4g) chown oracle.oinstall /u01 /u02
4h) chmod 775 /u01 /u02
5. Ustawiamy odpowiednie zmienne środowiskowe
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=/u01/app/oracle/product/8.1.7
ORACLE_SID=MAP
PATH=$PATH:/u01/app/oracle/product/8.1.7/bin
CLASSPATH=.:/u01/app/oracle/product/8.1.7/jdbc/lib/classes111.zip
LD_LIBRARY_PATH=/u01/app/oracle/product/8.1.7/lib
ORA_NLS33=/u01/app/oracle/product/8.1.7/ocommon/nls/admin/data
NLS_LANG=polish
Zmienną ORACLE_SID możemy wybrać dowolnie.
6. Logujemy się na użytkownika oracle, uruchamiamy Xwindow, odpalamy
terminal, wchodzimy do katalogu z rozpakowaną dystrybucją Oracla i
uruchamiamy skrypt runInstaller.
7. Jeśli skrypt uruchomi się bez problemu to przez następne kroki
poprowadzi nas program instalacyjny. Jeśli dostaniemy na ekranie
informacje o wyjątku javy to trzeba zrobić następującą rzecz:
7a. w pliku oraparam.ini (katalog install) należy zmienić ścieżkę
dla zmiennej JRE na lokalizację w której znajduje się JRE, które
zainstalowaliśmy samodzielnie.
8. Po tym zabiegu program instalacyjny powinien uruchomić się bez
problemu.
9. Nastepnie odpowiadamy na pytania progamiu instalacyjnego i
wykonujemy wszystko według podpowiedzi, których udziela nam instalator.
10. Jeśli po instalacji chcemy stworzyć przykładową bazę danych
instalator automatycznie uruchomi program dbassist. Jeśli uruchomienie
progamu nie powiedzie się nie wpadajmy w panikę. Kończymy instalacje w
normalny sposob i robimy następującą rzecz.
10a. w katalogu product/8.1.7 lub product/8.1.6 (w zależności od
tego, jaką wersję bazy zainstalowaliśmy) znajduje się dowiązanie
symboliczne JRE. Wskazuje ono na JRE dostarczane razem z dystrybucja
Oracla. Należy tak zmienić ten link, aby wskazywał on na JRE które
zainstalowaliśmy w punkcie 3.
11. Pod Xwindow wchodzimy do katalogu bin i próbujemy uruchomic
program dbassist i tworzymy baze danych zgodnie z naszymi potrzebami.
12. Jeśli tworzenie bazy zakończy sie sukcesem możemy jeszcze
profilaktycznie zajrzeć do pliku oratab w katalogu etc i sprawdzić czy
znajduje się tam linijka podobna do poniższej:
MAP:/u01/app/oracle/product/8.1.7:Y
gdzie MAP to sid bazy bazy danych. Jeśli na końcu znajduje się literka
N należy zmienić ją na Y.
13. Jeśli baza już działa (co możemy sprawdzić wydając np. polecenie
ps -aux | grep $ORACLE_SID) możemy odpalić sqlplus pisząc:
sqlplus system/manager
lub
sqlplus scott/tiger
14. Jeśli baza jeszcze nie działa wykonujemy następujące instrukcje.
dbstart
lsnrctl start
oczywiście jako użytkownik oracle a nie root.
15. I teraz możemy wrócić do punktu 13 i rozpocząć pracę z bazą danych.
16. Ze względów bezpieczeństwa należy zmienić domyślne hasła
administracyjne, jeśli nie chcemy, aby każdy kto ma jakieś pojęcie o
Oraclu grzebał nam w bazie.
Przy opracowywaniu tego dokumentu korzystałem z nastepujących źródeł:
-
-
- Michał Lentner "Oracle System zarządzania bazą danych", EXIT, 2001
___________________
9.13 Dlaczego podczas wykonywania triggera wyskakuje błąd "ORA-04091
table NAZWA is mutating, trigger/function may not see it"?
Trigger lub funkcja PL/SQL próbuje przeglądać/modyfikować tabelę,
która jest w trakcie modyfikacji przez wyrażenie, które wywołało
trigger-a. Jeśli tablica jest w trakcie modyfikacji (przed
zatwierdzeniem zmian), to w ogólności nie wiadomo, jaki jest jej stan i
które rekordy zostały już zmodyfikowane, a które jeszcze nie. Dlatego
też trigger nie może przeglądać/modyfikować tabeli, na której jest
założony.
___________________
9.14 Mam problem z instalacją Oracle 8.1.x na komputerze z Pentium 4...
Problem występuje na komputerach z procesorem Pentium 4 w instalatorze
wykorzystującym Sun JRE i Symantec JIT (Oracle Universal Installer for RDBMS 8.1.x).
Należy zainstalować odpowiedni patch z Metalink-a albo:
- skopiować zawartość płyty instalacyjnej lokalnie na komputer (np. do katalogu
TEMP)
- znaleźć w instalce plik symcjit.dll i zamienic rozszerzenie np. na symcjit.old
- uruchomić SETUP.EXE z: \TEMP\install\win32 i zainstalować.
Może też po prostu pomóc podmiana pliku symcjit.dll na ten z JDK 1.2.2 (należy
skopiować oba pliki: symcjit.dll i jvm.dll) ze strony
___________________
9.15 Poszukuję tutoriali do Forms i/lub innego oprogramowania Oracle
Proszę zajrzeć pod adresy:
___________________
9.16 Jakie wybrać narzędzie zamiast SQL*Plus-a?
TOra
Rozbudowany program umożliwiający korzystanie z SQL, PL/SQL oraz zarządzanie bazą
http://sourceforge.net/projects/tora/
System operacyjny: Windows, Linux, SunOS/Solaris
Środowisko: Win32 (MS Windows), KDE
Licencja: GNU General Public License (GPL)
(wersja pod Windows jest darmowa do użytku niekomercyjnego;
do użytku komercyjnego jest płatna - jest możliwość darmowego testowania przez 30 dni)
yasql
Zamiennik dla SQL*Plus-a napisany w Perlu
http://sourceforge.net/projects/yasql/
System operacyjny: POSIX
Środowisko: Konsola
Licencja: GNU General Public License (GPL)
SQL Navigator
Program dla programistów PL/SQL
http://www.quest.com/sql_navigator/
System operacyjny: Windows
Środowisko: Windows 95/98/2000 lub Windows NT
Licencja: program komercyjny
TOAD
Program do programowania w PL/SQL i zarządzania bazą
http://www.quest.com/toad/
System operacyjny: Windows
Środowisko: Windows 95/98/NT/2000
Licencja: program komercyjny
PL/SQL Developer
IDE do PL/SQL
http://www.allroundautomations.nl/plsqldev.html
System operacyjny: Windows
Środowisko: Windows 95, 98, ME, NT4, 2000 i XP
Licencja: program komercyjny
Oracle SQL Developer
Dla programistów SQL i PL/SQL
http://www.oracle.com/technology/products/database/sql_developer/
System operacyjny: Windows, Linux, Unix, Mac OS X
Środowisko:
Licencja: program darmowy
___________________
9.17 Jak sprawdzić, który element procedury/funkcji PL/SQL wykonuje się najdłużej?
Potrzebny do tego jest pakiet DBMS_PROFILER. Jeśli na twojej bazie jeszcze go nie ma, trzeba go zainstalować:
-- instalacja DBMS_PROFILER
CONNECT sys/password@service AS SYSDBA
@$ORACLE_HOME/rdbms/admin/profload.sql
CREATE USER profiler IDENTIFIED BY profiler DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;
GRANT connect TO profiler;
CREATE PUBLIC SYNONYM plsql_profiler_runs FOR profiler.plsql_profiler_runs;
CREATE PUBLIC SYNONYM plsql_profiler_units FOR profiler.plsql_profiler_units;
CREATE PUBLIC SYNONYM plsql_profiler_data FOR profiler.plsql_profiler_data;
CREATE PUBLIC SYNONYM plsql_profiler_runnumber FOR profiler.plsql_profiler_runnumber;
CONNECT profiler/profiler@service
@$ORACLE_HOME/rdbms/admin/proftab.sql
GRANT SELECT ON plsql_profiler_runnumber TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON plsql_profiler_data TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON plsql_profiler_units TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON plsql_profiler_runs TO PUBLIC;
Jak to uruchomić? Bardzo prosto:
DECLARE
profiler_n BINARY_INTEGER;
BEGIN
profiler_n := DBMS_PROFILER.start_profiler(run_comment => 'procedura GRZEJ_PROCESOR: ' || SYSDATE);
GRZEJ_PROCESOR; -- testowana procedura
profiler_n := DBMS_PROFILER.stop_profiler;
END;
W zmiennej profiler_n znajdzie się numer, dzięki któremu możemy zidentyfikować dane
w tabelach użytkownika PROFILER:
SELECT runid,
run_date,
run_comment,
run_total_time
FROM plsql_profiler_runs
WHERE runid = &p_runid
ORDER BY runid;
Szczegółowe wyniki wykonania procedury otrzymamy dzięki zapytaniu:
SELECT u.runid,
u.unit_number,
u.unit_type,
u.unit_owner,
u.unit_name,
d.line#,
d.total_occur,
d.total_time,
d.min_time,
d.max_time
FROM plsql_profiler_units u
JOIN plsql_profiler_data d ON u.runid = d.runid AND u.unit_number = d.unit_number
WHERE u.runid = &p_id
ORDER BY u.unit_number, d.line#;
Najbardziej interesująca jest kolumna TOTAL_TIME, a LINE# powie, który wiersz w procedurze
wykonywał się najdłużej:
RUNID UNIT_NU UNIT_TYPE UNIT_OWNER UNIT_NAME LINE# TOTAL_OCCUR TOTAL_TIME MIN_TIME MAX_TIME
----- ------- --------------- ----------- ------------ ----- ----------- ---------- -------- --------
1 1 ANONYMOUS BLOCK 4 1 0 0 0
1 1 ANONYMOUS BLOCK 5 1 0 0 0
1 1 ANONYMOUS BLOCK 6 1 0 0 0
1 2 PROCEDURE SCOTT GRZEJ_PROCESOR 4 101 0 0 0
1 2 PROCEDURE SCOTT GRZEJ_PROCESOR 5 100 5601000 0 6048000
Która to linia w naszej procedurze - łatwo sprawdzić zapytaniem:
SELECT line || ' : ' || text
FROM all_source
WHERE owner = &UZYTKOWNIK
AND type = 'PROCEDURE'
AND name = &NAZWA_PROC; -- tu: GRZEJ_PROCESOR
___________________
Literatura:
* Theriault Marlene, Carmichael Rachel, Viscusi James - Oracle DBA.
Administrowanie bazą danych, Wydawnictwo RM, 2001
* Wrembel R., Wieczerzycki W. - Projektowanie aplikacji bazy danych
ORACLE, Wydawnictwo NAKOM, Poznań, 1997
* Wrembel R., Jezierski J., Zakrzewicz M. - System zarządzania bazą
danych Oracle7 i Oracle8, Wydawnictwo Nakom, Poznań, 1999
* Widera Michał - Oracle Form Builder, Helion, Gliwice, 2000
* Greene J. - Oracle 8 Server - księga eksperta, Helion, Warszawa, 2000
* Morle J. - Skalowanie Oracle8i, Helion, Warszawa, 2001
* Ramalho J. A. - Oracle 8i, Mikom, Warszawa, 2001
* Gnybek J. - Oracle - łatwiejszy niż przypuszczasz, wyd. 2, Helion,
Warszawa, 2000
* Urman S. - Oracle8 PL/SQL Programming, Osborne McGraw-Hill (po angielsku)
* Urman S. - Oracle9i PL/SQL Programming, Osborne McGraw-Hill (po angielsku)
* Urman S. - Oracle8i Advanced PL/SQL Programming, Osborne McGraw-Hill (po angielsku)
* Thomas Kyte - Effective Oracle by Design, Osborne ORACLE Press Series (po angielsku)
Oracle Underground Frequently Asked Questions
Designer/2000 i Developer/2000
SQL*Plus - interaktywny kurs języka
Oracle - sztuczki i niebezpieczeństwa
Oracle: SQL*Plus Tutorial
Oprogramowanie i dokumentacja do Oracle
Wprowadzenie do PL/SQL i język PL/SQL
Oprogramowanie serwera Oracle7 (PL/SQL, procedury, wyzwalacze)
Materiały o Oracle (SQL, PL/SQL, wyzwalacze, indeksy, Oracle Forms)
Artykuły o optymalizacji, administracji, bezpieczeństwie i innych
zagadnieniach związanych z Oracle
Serwis dla programistów i administratorów Oracle
René Nyffenegger on Oracle
PL/SQL technology center
Oracle Magazine
PLOUG - Polish Oracle User Group
The Knowledge Center for Oracle Professionals
http://www.dbasupport.com
Covering todays Oracle topics
http://searchoracle.com
Red-Database-Security GmbH
http://www.red-database-security.com/
_____________________________________________________________________
10. PostgreSQL
Opracował hubert depesz lubaczewski, Grzegorz Brzeziński
Zawsze aktualna wersja rozdziału o PostgreSQL:
Pytania:
10.1 Skąd wziąć?
10.2 Aktualna wersja?
10.3 Co potrafi?
10.4 Jak usunąć pole/zmienić jego typ?
10.5 Co to są języki proceduralne?
10.6 Ile jest języków proceduralnych i czym się różnią?
10.7 Który z języków proceduralnych jest najlepszy
10.8 U mnie nie działają procedury plXXXXXXX. Dlaczego?
10.9 Gdzie znajdę dokumentację do pl/pgsql? To co jest w manualach to
za mało.
10.10 Czy postgres obsługuje bloby/duże pliki binarne?
10.11 W moim psql'u nie działają klawisze kursora. Czemu?
10.12 Jak wywołuję psql'a z konta roota dostaję informację: psql:
FATAL 1: Database "root" does not exist in the system catalog. Dlaczego?
10.13 Jak zrobić, żeby dostęp do bazy dla konkretnego użytkownika
wymagał podania hasła (domyślnie jest bez haseł)?
10.14 Co i jak z polskimi literami?
10.15 Jak zainstalować/uruchomić PostgreSQL pod Windows?
10.16 Jak zrobić AUTO_INCREMENT i czym się różnią sekwencje od seriali?
10.17 Jak pobrać pierwsze/następne/kolejne 5/10/15/??? wartości?
10.18 Jak zapewnić całkowity brak dostępu do bazy użytkownika A
użytkownikowi B?
10.19 Jak czytać/zapisywać timestamp w postaci unixowej?
10.20 Jak zwracać z funkcji pl/pgsql'owych recordsety?
10.21 Jak wylistować tabele lub ich strukturę?
10.22 Jak zmienić nazwę pola(kolumny) w tabeli?
10.23 Jak wyeksportować zawartość bazy danych do pliku SQL, żeby przenieść ją z jednego serwera na drugi?
10.24 Jak zmusić PostgreSQLa do użycia indeksów na polach INT2 i INT8?
10.25 Czy istnieje sposób na import tabeli dbf do postgresql?
10.26 Jak zapisać warunek by nie zwracał uwagi na wielkość liter?
10.27 Czy są jakieś narzędzia do wizualnego projektowania baz PostgreSQL'a?
10.28 Jak szybko zliczyć ilość rekordów w tabeli? select count(*) jest taki wolny...
10.29 Jak obciąć część danych z danej typu timestamp?
10.30 Co to jest i do czego używać contrib'a?
10.31 Co jest w contribie?
10.32 Jakiego programu użyć aby administrować PostgreSQL'em?
Odpowiedzi:
___________________
10.1 Skąd wziąć?
Oficjalny site:
Mirror w Polsce, np.: lub
___________________
10.2 Aktualna wersja?
Na 10-10-2004: 7.4.5, wersja beta: 8.0
___________________
10.3 Co potrafi?
Bardzo dużo. Implementacja standardu SQL dużo pełniejsza niż w
konkurencyjnym MySQL'u. Ciut wolniejszy przy prostych bazach i małej
ilości jednoczesnych użytkowników, ale "dostaje skrzydeł" przy większej
komplikacji danych (duża ilość joinów) i dużej ilości jednoczesnych
połączeń.
___________________
10.4 Jak usunąć pole/zmienić jego typ?
Jednyną realna szansą na zrobienie czegoś takiego (w wersjach < 7.3)
jest zamiana całej tabeli. Przykład:
CREATE TABLE t (a text, b int4, c int4);
aby pole (b) usunąć:
SELECT a,c into temp_table FROM t;
drop table t;
alter table temp_table rename to t;
W wersjach postgresql'a od 7.3 wzwyż jest już zaimplementowana składnia:
alter table tt drop column b;
aby zmienić typ pola (c):
select a, b, c::int8 as c into temp_table from t;
drop table t;
alter table temp_table rename to t;
___________________
10.5 Co to są języki proceduralne?
Języki proceduralne są to specjalne języki programowania w których można
tworzyć funkcje rozszerzające standardową funkcjonalność PostgreSQL'a.
Przykładem takich funkcji może być np. funkcja zamieniająca dowolny ciąg
znaków na inny, licząca silnię czy dowolną inną rzecz.
Ze względu na fakt, że języki te umożliwiają korzystanie ze zmiennych,
wyrażeń warunkowych czy pętli są nieocenionym narzędziem pracy każdego
zawodowego bazo-danowca.
___________________
10.6 Ile jest języków proceduralnych i czym się różnią?
Na chwilę obecną w PostgreSQL'u są 4 języki proceduralne:
plperl
plpgsql
plpython
pltcl
Różnią się głównie składnią - bazującą na perlu, pythonie, tclu czy
rozszerzonej składni sql'a (plpgsql) - zbliżonej do składni języka pl/sql
z baz danych Oracle.
Dodatkowo funkcje w PostgreSQL'u można tworzyć także w C (funkcje
skompilowane do postaci bibliotek dzielonych .so dołącza się do postgresql'a
w czasie pracy), czy w samym język SQL (choć tu pole manewru jest mocno ograniczone.
W planach jest stworzenie dodatkowych języków, np. plphp.
___________________
10.7 Który z języków proceduralnych jest najlepszy?
To jest pytanie na które nie ma dobrej odpowiedzi. Każdy język wyewoluował
z czego innego i do czego innego się najlepiej nadaje.
Można założyć, że najlepszym językiem będzie ten który bazuje na czymś
co sie najlepiej zna. Dlatego jeśli znasz Python'a - najlepiej będzie
Ci się pisało w plpythonie, jak twoim ulubieńcem jest perl, to bez
wątpienia polubisz plperla. itp.
Sam osobiście piszę większość rzeczy w plpgsql'u, pewne rzeczy w plperlu
(funkcje obróbki tekstu), a część w C (gdy potrzebuję wydajności).
___________________
10.8 U mnie nie działają procedury plXXXXXXX. Dlaczego?
Domyślnie żaden język proceduralny nie jest obsługiwany. Aby włączyć
możliwość tworzenia w nim funkcji należy (wszędzie poniżej zamień
plXXXXXXX na odpowiednią nazwę wybranego przez siebie języka):
- Stworzyć tzw. handler języka.
Robi się to w ten sposób:
CREATE OR REPLACE FUNCTION plXXXXXXX_call_handler () RETURNS language_handler
AS '/usr/local/pgsql/lib/plXXXXXXX.so' LANGUAGE 'C';
Ewentualnie zamiast '/usr/local/pgsql/lib/plXXXXXXX.so' należy podać
właściwą ścieżkę do pliku plXXXXXXX.so.
- Następnie należy zadeklarować język:
CREATE TRUSTED PROCEDURAL LANGUAGE 'plXXXXXXX' HANDLER plXXXXXXX_call_handler LANCOMPILER 'PL/XXXXXXX';
I od tej pory można już korzystać z dodatkowej funkcjonalności jaką dają
procedury składowane.
Zaleca się użycie powyższych dwóch komend będąc przyłączonym do bazy "template1".
Dzięki temu, każda następna stworzona baza będzie miała od razu zadeklarowany
język plpgsql.
Istotne jest to, że nowe wersje PostgreSQL'a przychodzą razem ze skryptem
createlang (skrypt shella). wykonuje się go tak:
createlang plXXXXXXX template1
Oczywiście zamiast template1 może być jakaś inna baza, ale idea pozostaje
ta sama. ten skrypt tworzy zarówno funkcję-handler jak i sam język.
___________________
10.9 Gdzie znajdę dokumentację do pl/pgsql? To co jest w manualach to
za mało.
Niestety dokumentacji na razie nie ma. Można co najwyżej poczytać kody
funkcji pl/pgsql użyte do tzw. regression test. Kody te są w pliku
plpgsql.sql w katalogu "src/test/regress/sql/" względem głównego
katalogu źródeł postgresa - testy te nie są standardowo instalowane w
procesie instalacji binarek!
___________________
10.10 Czy postgres obsługuje bloby/duże pliki binarne?
Częściowo tak: istnieje coś takiego jak "Large Object". Każdy zapisany
tak "blob" jest zapisywany na dysk do oddzielnego pliku a w tabeli są
tylko i wyłącznie odnośniki do plików.
Należy wziąć pod uwagę, że nie istnieje w tej chwili możliwość łatwego
przeszukiwania czy indeksowania zawartości blobów.
Od wersji 7.1 jest możliwość przechowywania w tabelach danych o
dowolnej wielkości (technologia T.O.A.S.T.). Pozostaje tylko pytanie:
czy na pewno przechowywanie dużych, nieindeksowalnych plików w bazie
danych jest słusznym rozwiązaniem?
___________________
10.11 W moim psql'u nie działają klawisze kursora. Czemu?
Aby w psql'u działała obsługa klawiszy kursora musisz mieć bibliotekę
readline. Jeśli dodatkowo samodzielnie kompilujesz PostgreSQLa ze
źródeł to (przynajmniej w czasie kompilacji) musisz posiadać także
readline-devel. Jeśli po dograniu biblioteki do systemu nadal nie
możesz używać klawiszy kursora musisz przekompilować PostgreSQLa. Po
samodzielnym kompilowaniu możesz zajrzeć do pliku config.cache, gdzie
powinny być takie wpisy:
(pgdba@depeszws[tty4]) 10:31:15 [~/src]
$ cat config.cache | grep readline
ac_cv_header_readline_history_h=${ac_cv_header_readline_history_h=yes}
ac_cv_header_readline_readline_h=${ac_cv_header_readline_readline_h=yes}
ac_cv_search_readline=${ac_cv_search_readline=-lreadline}
___________________
10.12 Jak wywołuję psql'a z konta roota dostaję informację: psql:
FATAL 1: Database "root" does not exist in the system catalog. Dlaczego?
Podstawową sprawą jest to by nie korzystać z systemu z konta roota. To
raz. Natomiast co do samego problemu. System kont PostgreSQLa jest
całkowicie oddzielony od systemu kont maszyny na której baza danych
pracuje. Najważniejszą sprawą jest, że "główne" - czyli administracyjne
konto w PostgreSQLu to nie jest root tylko postgres lub pgdba lub
podobnie - nazwa jest identyczna z nazwą użytkownika systemu z którego
był uruchomiony initdb (zazwyczaj jest to ten sam użytkownik z którego
działa proces postmastera). Czyli aby wejść do psql'a z konta roota
musisz wydać polecenie:
(root@depeszws[tty4]) 10:40:54 [~]
$ psql -U pgdba
Dodatkowo pamiętaj, że psql domyślnie stara się podłączyć do bazy o
nazwie takiej samej jak baza użytkownika, a sam fakt założenia
użytkownika nie oznacza, że istnieje już dla niego baza.
___________________
10.13 Jak zrobić, żeby dostęp do bazy dla konkretnego użytkownika
wymagał podania hasła (domyślnie jest bez haseł)?
Sposób autoryzacji (czy ma pytać o hasła czy nie) jest definiowany w
pliku pg_hba.conf znajdującym się w katalogu z danymi PostgreSQLa. Na
końcu tego pliku znajdziecie dwie takie linie:
local all trust
host all 127.0.0.1 255.255.255.255 trust
Oznaczają one, że:
- dla połączeń lokalnych (local) - czyli takich gdzie łączymy się nie
korzystająć z socketów tcp/ip, dla dowolnej bazy (all) system ma
przyjąć regułę niepytania o hasło (trust).
- dla połączeń zdalnych, ale tylko z maszyny o adresie 127.0.0.1
(czyli z tego samego komputera, ale przez sockety tcp/ip), też będzie
ta sama reguła.
Aby to zmienić należy zmienić ostatnie słowo (trust) na "password" lub
"crypt" (różnią się one metodą przesyłania hasła. Np. zapis:
host all 148.81.17.60 255.255.255.0 password
Oznacza, że osoby łączące się z serwera o ip 148.81.17.60 oraz z całej
klasy C (czyli naprawdę adres ip musi być 148.81.17.*) muszą podać
hasło aby dostać się do dowolnej bazy.
A zapis:
host template1 148.81.17.60 255.255.255.0 password
(oczywiście bez poprzedniego zapisu) oznacza, że te same osoby będą
mogły teraz dostać się tylko do bazy template1 i będą musiały podać
hasło.
Przy pisaniu reguł dostępu należy pamiętać o kolejności. Użyta
zostanie ta reguła która jest pierwsza w pliku i pasuje do sytuacji.
Dlatego zapis ten jest bez sensu:
local all trust
host all 127.0.0.1 255.255.255.255 trust
local template1 password
host template1 127.0.0.1 255.255.255.255 password
a aby uzyskać to co się chce zapis powinien być taki:
local template1 password
host template1 127.0.0.1 255.255.255.255 password
local all trust
host all 127.0.0.1 255.255.255.255 trust
___________________
10.14 Co i jak z polskimi literami?
Wbrew wszelkim obawom uzyskanie prawidłowej obsługi polskich liter
jest trywialne. Aha. poniższy tekst tyczy się tylko i wyłącznie
środowisk U*IX'owych - w windows jest to jakaś magia.
Przede wszystkim czego nie potrzebujesz:
- obsługi "multibyte"
- obsługi Unicode
- definiowania "ENCODING'u" przy każdym CREATE DATABASE
Potrzebujesz za to:
- "wsparcia" locale w postgresie
- zainstalowanego prawidłowego locale w systemie
Najprostszą i najskuteczniejszą metodą jest własnoręczna kompilacja.
Czemu? proste: nigdy nie mamy pewności z jakimi opcjami zostało
skompilowane to co dostajemy w paczce z binarkami. Przebiegu kompilacji
nie będę opisywał (każdy chyba czytał plik INSTALL???), ale:
na etapie kompilacji musimy włączyć locale. robi się to tak:
./configure --enable-locale
i to w zasadzie wszystko. oczywiście configre'owi można podać także
stado innych parametrów, ale z punktu widzenia przeciętnego zjadacza
ogonków to co powyżej jest tym najistotniejszym. Po kompilacji i
zainstalowaniu czas na "initdb". już w tym momencie polecam mieć
ustawione locale (do wersji 7.1 locale trzeba było mieć ustawione tylko
w czasie uruchamiania postmastera, ale w 7.1 i później należy locale
ustawiać przy initdb) czyli:
export LC_COLLATE=pl_PL
export LC_CTYPE=pl_PL
export LC_MESSAGES=pl_PL
export LC_MONETARY=pl_PL
export LC_NUMERIC=pl_PL
export LC_TIME=pl_PL
Powyższe zadziała jak używasz bash'a lub czegoś kompatybilnego. Jeśli
używasz innego shella - poradź się swojego lokalnego guru jak się w nim
ustawia zmienne środowiskowe.
Ponieważ zmienne te się ogólnie rzecz biorąc przydają także po initdb
polecam wpisanie powyższego do pliku ~/.bash_profile lub ~/.bashrc lub
odpowiedniego - wywoływanego przy zalogowaniu się na konto.
Po wykonaniu initdb z ustawionymi zmiennymi LC_* i wystartowaniu
postmastera (zmienne LC_* nadal powinny być ustawione) wszystko powinno
działać jak trzeba.
___________________
10.15 Jak zainstalować/uruchomić PostgreSQL pod Windows?
Pełno informacji na ten temat znajdziesz na stronie
Sam Windows nie używam. Jak chcesz aby było tu coś więcej na ten temat
- napisz i podeślij.
Możesz ściągnąć gotową, skompilowaną wersję PostgreSQL'a dla Windows
(adres poniżej). Pliki tu umieszczone są przygotowane przez Ronalda Kuczka.
___________________
10.16 Jak zrobić AUTO_INCREMENT i czym się różnią sekwencje od seriali?
Aby stworzyć pole typu AUTO_INCREMENT należy zastosować jedną z dwóch
metod:
SERIAL
SEKWENCJA (SEQUENCE)
Jak się używa?
SERIAL:
depesz=# CREATE TABLE a (id serial, pole text);
NOTICE: CREATE TABLE will create implicit sequence 'a_id_seq' for
SERIAL column 'a.id'
NOTICE: CREATE TABLE/UNIQUE will create implicit index 'a_id_key' for
table 'a'
CREATE
depesz=# INSERT INTO a (pole) VALUES ('wartość pierwsza');
INSERT 529488 1
depesz=# INSERT INTO a (pole) VALUES ('wartość druga');
INSERT 529489 1
depesz=# SELECT * FROM a;
id | pole
---+------------------
1 | wartość pierwsza
2 | wartość druga
(2 rows)
SEQUENCE:
depesz=# CREATE SEQUENCE b_id;
CREATE
depesz=# CREATE TABLE b (id int4 not null default nextval('b_id'),
pole text);
CREATE
depesz=# INSERT INTO b (pole) VALUES ('wartość pierwsza');
INSERT 529536 1
depesz=# INSERT INTO b (pole) VALUES ('wartość druga');
INSERT 529537 1
depesz=# SELECT * FROM b;
id | pole
---+------------------
1 | wartość pierwsza
2 | wartość druga
(2 rows)
Czyli jak widać obie metody dają mniej więcej to samo. W dodatku
wewnętrznie użycie typu serial powoduje zdefiniowanie sekwencji i
stworzenia bardzo podobnej struktury jak to co pokazałemw drugim
przykładzie. Jakie są więc różnice?
- serial definiuje automatycznie indeks unikalny na polu
- w serialu nie mamy wpływu na nazwę utworzonej sekwencji
- w serialu nie możemy wpływać na inne parametry sekwencji (skok,
wartość początkowa czy końcowa)
Tak więc: jeśli potrzebujesz tylko licznika od 1 do około 2 miliardów:
używaj seriala. Jeśli jednak potrzebujesz czasem mieć licznik liczący w
dół (od -1 do -dwóch miliardów), albo przeskakujący co dwie lub więcej
liczb to używaj sekwencji.
Nie zapomnij jednak, że niezależnie czego użyjesz w obu przypadkach
powstaje sekwencja, która nie zniknie po usunięciu tabeli.
___________________
10.17 Jak pobrać pierwsze/następne/kolejne 5/10/15/??? wartości?
Zakładając, że jest SELECT typu:
SELECT * FROM tabela;
Aby móc pobierać wiersze porcjami należy po pierwsze zdefiniować
sposób sortowania. W najprostszej wersji będzie to:
SELECT * FROM tabela ORDER BY OID;
w innych np.:
SELECT * FROM tabela ORDER BY pole;
Następnie definiujemy ile chcemy wierszy uzyskać:
SELECT * FROM tabela ORDER BY pole LIMIT 5;
Wyciągnie to z bazy 5 pierwszych rekordów. Aby wyciągnąć kolejne
rekordy należy zrobić:
SELECT * FROM tabela ORDER BY pole LIMIT 5 OFFSET 5;
Wyświetli to pięć rekordów poczynając od rekordu o numerze 6 (pominie
5).
___________________
10.18 Jak zapewnić całkowity brak dostępu do bazy użytkownika A
użytkownikowi B?
Bez stosowania żadnych sztuczek możliwe jest tylko i wyłączenie
odebranie innym użytkownikom praw do odczytu, zapisu, itp. istniejących
tabel, natomiast nie można zakazać im w ogóle dostępu do baz innych
użytkowników - oraz np. zakładania tam własnych tabel.
O ile w/g mnie nie jest to problem, o tyle części ludzi to
przeszkadza. Skonfigurowanie tego polega na zmianie zawartości pliku
pg_hba.conf i pg_ident.conf.
Przykład (pg_hba.conf):
local all reject
local sameuser password
host sameuser 127.0.0.1 255.255.255.255 password
host all 127.0.0.1 255.255.255.255 ident postgres
Przykład (pg_ident.conf):
#MAP IDENT POSTGRES USERNAME
postgres postgres postgres
Po kolei (plik pg_hba.conf):
linia 1: blokuje dostęp z localhosta (nie powinna być potrzebna, ale
nie zaszkodzi)
linia 2: zapewnia, że użytkownicy z localhosta będą się mogli dostać
tylko do swojej bazy (sameuser) i to po podaniu hasła
linia 3: to samo co linia 2, ale przez TCP/IP
linia 4: zapewnia dostęp do wszystkich baz dla użytkowników
zdefiniowanych w idencie pod mapą "postgres".
Wpis w pliku pg_ident.conf oznacza, że mapa postgres definiuje, że
użytkownik łączący się z konta postgres będzie widziany wewnętrznie
jako konto postgres.
I już. Powinno działać.
Powyższe rozwiązanie (nieprzetestowane przeze mnie) przetłumaczyłem (w
skrócie) z listu na grupę pgsql-admin (autor: jkm(at)patriot.net (Kevin
McFadden)).
___________________
10.19 Jak czytać/zapisywać timestamp w postaci unixowej?
Aby dostać czas w postaci unix-timestamp, należy odczytać go (czas)
przez:
# select extract(epoch from now());
date_part
------------
1003126751
(1 row)
Natomiast aby przekształcić z powrotem taki timestamp na timestamp postgresql'owy
wystarczy wiedzieć (pamiętać), że unix-timestamp jest to po prostu liczba sekund
od "epoch". czyli poniższe zapytanie zadziała dokładnie tak jak chcemy:
# select 'epoch'::timestamp + interval('999999999 seconds');
?column?
------------------------
2001-09-09 03:46:39+02
(1 row)
___________________
10.20 Jak zwracać z funkcji pl/pgsql'owych recordsety?
Do wersji 7.1.x jedyną możliwością było tworzenie tabeli tymczasowej,
insert do niej i odczyt z zewnątrz. Brzydkie. Od wersji 7.2 istnieje
możliwość zwracania z funkcji pl/pgsql'owych kursorów. Oczywiście
wymaga to używania transakcji (kursory działają tylko wewnątrz
transakcji), ale nie jest to przecież wielki problem. Czyż nie?
Zaczynamy: robimy tabelę:
# CREATE TABLE tabela (
# id INT4,
# name TEXT
# );
CREATE
Wstawiamy tam kilka testowych rekordów:
# INSERT INTO tabela VALUES (1, 'bart');
INSERT 48525 1
# INSERT INTO tabela VALUES (2, 'lisa');
INSERT 48526 1
# INSERT INTO tabela VALUES (3, 'marge');
INSERT 48527 1
# INSERT INTO tabela VALUES (4, 'homer');
INSERT 48528 1
# INSERT INTO tabela VALUES (5, 'maggie');
INSERT 48529 1
No i nasza magiczna funkcja:
# CREATE FUNCTION funkcja(INTEGER) RETURNS REFCURSOR AS '
# DECLARE
# num ALIAS FOR $1;
# cur REFCURSOR;
# BEGIN
# cur:=''new_cursor'';
# OPEN cur FOR SELECT * FROM tabela WHERE id >= num ORDER BY id;
# RETURN cur;
# END;
# ' LANGUAGE 'plpgsql';
(oczywiście nazwa kursora (tu: new_cursor) może być dowolna). No to
testujemy:
# BEGIN;
BEGIN
# select funkcja(3);
funkcja
------------
new_cursor
(1 row)
# fetch from new_cursor;
id | name
----+-------
3 | marge
(1 row)
# fetch from new_cursor;
id | name
----+-------
4 | homer
(1 row)
# fetch backward 2 from new_cursor;
id | name
----+-------
3 | marge
(1 row)
# fetch ALL from new_cursor;
id | name
----+--------
3 | marge
4 | homer
5 | maggie
(3 rows)
# close new_cursor;
CLOSE
# end;
COMMIT
Działa. Oczywiście (jak już nadmieniałem) działa to tylko w postgresie
7.2 i wyższych. Powyższy kod jest autorstwa Tomka Zielonki - ja
naniosłem tam tylko drobne poprawki (możliwość zwracania kursora bez
przekazywania go jako parametru).
Począwszy od wersji 7.3 można już zwracać z funkcji bezpośrednio recordsety.
Służy do tego konstrukcja return NEXT:
CREATE OR REPLACE FUNCTION test_srf() RETURNS SETOF RECORD AS '
DECLARE
temprec RECORD;
BEGIN
for temprec in SELECT oid, lanname FROM pg_language loop
RETURN next temprec;
END loop;
RETURN;
END;
' language 'plpgsql';
SELECT * FROM test_srf() x(pole1 oid, nazwa name);
Zwrócić należy uwagę na pusty RETURN kończący funkcję.
Dodatkowo należy pamiętać, że select'y z funkcji muszą zawierać alias pod jakim
dane z funkcji mają być widziane (x) oraz specyfikacje tabel (nazwy pól i typy
danych).
___________________
10.21 Jak wylistować tabele lub ich strukturę?
Aby wylistować tabele (widoki, sekwencje, funkcje) należy użyć w
psql'u komendy \d lub \d gdzie parametr to np. t, s, v, S, f czy inne.
Jeśli natomiast potrzebujesz zrobić to ze swojego programu bez
pośrednictwa psql'a, to uruchom psql'a z opcją -E po czym wydaj
interesującą cię komendę.
Poza wynikiem działania komendy dostaniesz także zapytanie jakie jest
wysyłane do bazy aby pokazać ci te informacje. np:
$ psql template1 -E
Password:
********* QUERY **********
SELECT usesuper FROM pg_user WHERE usename = 'pgdba'
**************************
Welcome to psql, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help on internal slash commands
\g or terminate with semicolon to execute query
\q to quit
template1=# \d
********* QUERY **********
SELECT c.relname as "Name",
CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'i'
THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' END as
"Type", u.usename as "Owner"
FROM pg_class c LEFT JOIN pg_user u ON c.relowner = u.usesysid
WHERE c.relkind IN ('r','v','S','')
AND c.relname !~ '^pg_'
ORDER BY 1;
**************************
List of relations
Name | Type | Owner
------------+------+--------
hdl_custom | view | depesz
(1 row)
___________________
10.22 Jak zmienić nazwę pola(kolumny) w tabeli?
Należy użyć komendy
ALTER TABLE tabela RENAME COLUMN nazwa_pola TO nowa_nazwa_pola;
___________________
10.23 Jak wyeksportować zawartość bazy danych do pliku SQL, żeby przenieść
ją z jednego serwera na drugi?
Aby wyeksportować bazę danych do pliku .sql wystarczy wydac polecenie:
pg_dump > dump.sql
Oczywiście w trakcie wykonywania tej operacji trzeba mieć dostęp do bazy
danych na poziomie administratora.
Aby natomiast skopiować tak wyeksportowane dane do innej bazy wystarczy:
- stworzyć docelową bazę danych: CREATE DATABASE docelowa_baza;
- wykonać polecenie: psql -i dump.sql
To wszystko. Po tym baza powinna być już skopiowana.
___________________
10.24 Jak zmusić PostgreSQLa do użycia indeksów na polach INT2 i INT8?
Zakładając, że masz już indeks na polu które jest typu INT2 lub INT8,
wykonujesz regularne vacuum analyze, danych w tabeli jest odpowiednio
dużo i postgresql nadal nie wykorzystuje index scanów przy wyszukiwaniu:
SELECT * FROM tabela WHERE pole = 12;
musisz wymusić na nim odpowiednie rzutowanie podanej liczby (12). Robi
się to tak:
SELECT * FROM tabela WHERE pole = 12::int8;
lub tak:
SELECT * FROM tabela WHERE pole = CAST(12 as int8);
Przyczyna takiego zachowania postgresa leży w fakcie, że domyślnym
typem danych na jaki są rzutowane podane liczby jest int4. Przy polu
typu int2 czy int8 musi zostać zrobiona później odpowiednia konwersja,
a liczby skonwertowane nie są już indeksowane.
___________________
10.25 Czy istnieje sposób na import tabeli dbf do postgresql?
Poniższy tekst jest kompilacją wypowiedzi poniższych osób na grupie dyskusyjnej
pl.comp.bazy-danych w marcu 2002:
"Sławomir Szyszło"
"Ronald Kuczek"
"Sylwester Szady"
Aby przenieść dane z plików .dbf do PostgreSQL'a można się posłużyć jedną
z poniższych metod:
1) Tak wszystkiego, to się chyba nie da opisać w paru słowach. Jak dla mnie
kroki to:
a) konwersja do pliku tekstowego *.csv (np z EXCELA) - czyli plik tekstowy
z polami dzielonymi ";"
b) obróbka pod vi do pliku sql [- jak się uprzeć to można to zrobić pod
EXCELEM poprzez zamiane wartości poszczególnych kolumn] (do postaci
każdy wiersz przekształcony jako:
insert into tabela values (coś,coś,cośtamjeszcze..); )
c) utworzenie bazy pod psql-em albo pgAdmin II (pod Windows)
d) utworzenie struktury tabeli z odpowiednimi polami; lepiej z pgAdmin II
e) zapuszczenie pliku sql.
2) Pg2Xbase - program do konwersji tabel PostgreSQL do DBF i odwrotnie
3) dbfdump - dumps/updates xBase files in human-readable, NoSQL, or PostgreSQL script forms
4) Access->Import z dbf, potem PGAdmin->Import z Accessa (bezposrednio przez *.mdb).
4) ODBC, PGADmin->Import z ODBC.
6) Access->Polacz tabele przez ODBC->Exportuj tabele do PostgreSQL przez ODBC.
7) Datapump (Borland).
8) własny programik w Delphi/BCB/VC++
9)
Ze swojej (depesza) strony mogę powiedzieć, że gdybym potrzebował coś takiego
zrobić to przypuszczalnie napisałbym programik w perlu przy użyciu biblioteki
DBD::Xbase, wyciągnął dane, zapisał jako INSERTy w pliku .sql i wykonał przez
psql'a.
___________________
10.26 Jak zapisać warunek by nie zwracał uwagi na wielkość liter?
Jeśli chcesz po prostu sprawdzić, czy dane pole jest równe jakiemuś stringowi,
ale bez sprawdzania wielkości liter to zrób tak:
CREATE INDEX nazwa_indeksu ON nazwa_tabeli (upper(nazwa_pola));
i potem wyszukiwanie:
SELECT * FROM nazwa_tabeli WHERE upper(nazwa_pola) = upper('jakiś ciąg znaków');
Jeśli natomiast chcesz wyszukiwać używając operatorów LIKE lub ~ (tylda - do
wyrażeń regularnych); to użyj ich wersji odpornych na wielkość liter:
SELECT * FROM nazwa_tabeli WHERE nazwa_pola ILIKE 'jakiś%';
SELECT * FROM nazwa_tabeli WHERE nazwa_pola ~* '^jakiś';
Należy jedynie zwrócić uwagę na to, że operator ILIKE pojawił się dopiero od
wersji 7.1 PostgreSQL'a, dla wersji wcześniejszych należy używać albo
operatora ~* lub funkcji upper/lower.
___________________
10.27 Czy są jakieś narzędzia do wizualnego projektowania baz PostgreSQL'a?
Pełną lista programów wspierających graficzne tworzenie baz danych (UML) można
znaleźć na techdocs'ach
Ze swojej strony polecam program dia ,
którego używam od dłuższego czasu i sprawdza się bardzo dobrze. Powstałe diagramy
można przekształcić do skryptów sql na przykład za pomocą programu dia2sql
lub tedia2sql
- przy czym ten drugi wydaje się być
zdecydowanie lepszy. (informacja o dia2sql i tedia2sql dostarczona przez Łukasza
Lukasz(at)Nowak.eu.org)
___________________
10.28 Jak szybko zliczyć ilość rekordów w tabeli? select count(*) jest taki wolny...
Pytanie wbrew pozorom nie jest trywialne. Jeśli zrobiłeś już vacuum tabeli
którą chcesz zliczyć i nadal jest to wolne to pora się rozejrzeć za dopalaczem.
Jedyną sensowną i realną metodą zrobienia takiego czegoś jest:
- zrobienie dodatkowej tabeli która będzie zawierała pola: nazwa_tabeli
typu text, oraz ilosc_rekordow typu integer
- triggera, który przy każdym insert'cie do tabeli która nas interesuje
zwiększy o jeden wartość w polu ilosc_rekordow w naszej dodatkowej tabeli
- triggera, który przy każdym delete'cie z tabeli która nas interesuje
zmniejszy o jeden wartość w polu ilosc_rekordow w naszej dodatkowej tabeli
Kodu przykładowych triggerów nie będę zamieszczał - można to potraktować
jako wprawkę z programowania w językach proceduralnych.
Zwrócić jednakże należy uwagę na 3 rzeczy:
1. przy dużej ilości jednoczesnych insertów i/lub delete'ów system może zwolnić
2. tak naprawdę bardzo rzadko potrzebujemy wartości select count(*) from tabela;
3. dodawanie funkcjonalności typu: przechowywanie liczby rekordów w tabeli
z podziałem w/g jakiegoś pola tej tabeli jest oczywiście też możliwe,
ale dodatkowo zwoli proces wstawiania i kasowania rekordów.
___________________
10.29 Jak obciąć część danych z danej typu timestamp?
Należy użyć wbudowanej funkcji to_char. np. tak:
depesz=# select now(), to_char(now(),'YYYY-MM-DD HH24:MI:SS'), to_char(now(),'Day, DD of Month YYYY BC, HH AM');
now | to_char | to_char
------------------------------+---------------------+-------------------------------------------
2002-09-10 10:09:05.15999+02 | 2002-09-10 10:09:05 | Tuesday , 10 of September 2002 AD, 10 AM
(1 row)
___________________
10.30 Co to jest i do czego używać contrib'a?
contrib jest to podkatalog w źródłach PostgreSQL'a. Zawiera on dodatkowe rozszerzenia
funkcji bazy danych. Standardowo w procesie kompilacji bazy danych, contrib nie
jest ruszany - jeśli coś stamtąd chcesz musisz to sobie skompilować samodzielnie.
W contribie znajduje się wiele bardzo przydatnych programów i rozszerzeń, w związku
z czym każdy kto chce robić coś poważnego z PostgreSQL'em powinien znać przynajmniej
częściowo to co contrib oferuje.
___________________
10.31 Co jest w contribie?
W miarę możliwości postaram się tu opisać wszystkie moduły contriba. Na początek
te których sam używam:
- miscutil
3 drobne, ale użyteczne funkcje:
* backend_pid - zwraca pid procesu postgres który obsługuje aktualne połączenie.
inaczej mówiąć - pis aktualnego backendu bazy
* min(x,y) oraz
* max(x,y) - zwracają odpowiednio mniejszą lub większą z dwóch podanych liczb.
- pgbench
Program do testowania wydajności postgresql'a. wielokrotnie krytykowany, lecz
w chwili obecnej jedyny *sensowny* test wydajnościowy postgresql'a (istnieje
jeszcze osdb, ale na razie do niczego się nie nadaje - może niedługo)
- pgcrypto
Fenomenalna biblioteka dostarczająca funkcji szyfrujących, deszyfrujących i haszujących
przy użyciu wielu algorytmów. m.in. szyfrowanie haseł md5, haseł crypt.
- pgstattuple
Jedna funkcja zwracająca w ultra-przejrzystej formie statystyki nt. danej tabeli.
Pozwala to np. podjąć decyzję czy tabelę warto już vacuumować,
czy nie i co ogólnie w niej "siedzi". Przykład:
# select * from pgstattuple('bleble');
-[ RECORD 1 ]------+-------
table_len | 106496
tuple_count | 591
tuple_len | 87468
tuple_percent | 82.13
dead_tuple_count | 97
dead_tuple_len | 14356
dead_tuple_percent | 13.48
free_space | 1608
free_percent | 1.51
- tablefunc
Kilka funkcji, które w założeniach miały pokazać do czego można używać srf'ów
(set returning functions).
* normal_rand - zwraca ciąg licz losowych (float8) rozłożonych równomiernie (?)
w zadanym zakresie, z zadanym standardowym odchyleniem
* crosstab* - odpowiednik funkcji PIVOT znanej w innych bazach
* connectby - zwraca drzewo powstałe na bazie struktury typu "parent_id"
- ltree
Fenomenalnie szybka oraz posiadająca wiele możliwości biblioteka do zapisywania
drzew w sql'u. pozwala np. na *indeksowane* wyszukiwanie drzewa takim kluczem:
Top.*{0,2}.sport*@.!football|tennis.Russ*|Spain
co oznacza, że:
1) drzewo zaczyna się od gałęzi "Top"
2) następnie są 0 do dwóch poziomów podgałęzi
3) następnie jest gałąź o nazwie zaczynającej się od sport (bez zwracania uwagi na wielkość znaków
4) następnie jest gałąź o nazwie innej niż "football" lub "tennis"
5) ostatnia gałąź musi się zaczynać od Russ, lub po prostu ma być to Spain
To jest akurat bardzo wydumany przykład, jednakże także standardowo potrzebne
rzeczy ltree załatwia prosto i co najważniejsze: bardzo szybko.
- tsearch
Bardzo szybka (choć i tak wolniejsza niż kod rolanda) implementacja full text
indexing/searching w postgresql'u. Testy przeprowadzone przez ludzi z list
postgresql'owych dowodzą, że w niektórych przypadkach jest ona o 300 *razy*
szybsza niż drugi fti/s contribowy - fulltextsearch.
Jeśli potrzebujecie wyszukiwania w tekstach, a macie tych tekstów naprawdę dużo
- polecam tsearcha. Będziecie naprawdę zaskoczeni wydajnością.
- dbsize
Proste narzędzie podające wielkość wskazanej tabeli lub całej bazy. Idealne np.
dla adminów, którzy w oparciu o to mogą zbudować system quoty dla postgresql'a.
___________________
10.32 Jakiego programu użyć aby administrować PostgreSQL'em?
Większość znanych mi zaawansowanych programistów i administratorów PostgreSQL'a
używa po prostu psql'a - dostarczanego wraz z bazą danych, tekstowego narzędzie
o naprawdę wielkich możliwościach.
Jeśli jednak potrzebujesz czegoś graficznego (klikalnego) to pozwolę sobie zwrócić
twoją uwagę na dwa produkty:
- phpPgAdmin - zbliżony do znanego phpMyAdmina program
o sporych możliwościach. Udostępnia administrację bazą danych przez interface
WWW. (Informacja dostarczona przez Łukasza)
- pgAccess - stworzony na podobieństwo Microsoft Access,
wieloplatformowa aplikacja zarządzająca bazą danych.
___________________
Literatura:
* PostgreSQL, Robomatic; w/g informacji jakie dostałem: "z tego co mi brakuje w niej
to zbyt wąski opis działania trigger'ów i funkcji pl/pgsql i niektórych (choć często
egzotycznych funkcji -> przekierowanie do manual'a)"
* Dybikowski Zdzisław - PostgreSQL, Helion, Gliwice, 2001
* SQL Almanach - Opis poleceń języka - Kevin Kline i Daniel Kline, Helion
Oficjalna stron projektu PostgreSQL
PostgreSQL Non-FAQ Documentation - liczne artykuły dotyczące m.in.
zwiększania wydajności bazy, użycia różnych funkcji, konwersji innych
baz do formatu PostgreSQL, opisy instalacji, lista błędów i poprawek
itd.
DevShed - Instalacja PostgreSQL
Tutorial do PostgreSQL'a 7.1.3, przetłumaczony na polski przez A.L.E.C.'a.
Site poświęcony informowaniu gdzie PostgreSQL jest używany, do czego i innych spraw,
które pomogą wam przekonać innych, że PostgreSQL jest najlepszy :)
Miejsce gdzie znajdziesz wiele projektów rozszerzających PostgreSQL'a - klientów,
biblioteki, aplikacje.
_____________________________________________________________________
11. Sybase
Opracował Bartosz Żyszkiewicz, Rafał Posmyk
Pytania:
11.1 Co to jest Sybase ASE i Sybase ASA?
11.2 Skąd wziąć?
11.3 Sybase ASE
11.3.1 Informacje o serwerze i bazach danych
11.3.2 Informacje o kolumnach i ich typach w tabeli.
11.3.3 Dla zadanej nazwy zależności wskazuje tabela.klucz i tabreferencyjna.klucz
11.3.4 Wyszukiwanie w bazie tabel/kolumn o podanej nazwie.
11.4.5 Polecenia do usuwania zależności dla zadanej tabeli
11.3.6 Sprawdzanie logu transakcji.
11.3.7 Szybkie kasowanie logu transakcji.
11.3.8 Sprawdzanie procesów na serwerze.
11.3.9 Uruchamianie isql.
11.3.10 Kopiowanie zawartości tabel do/z pliku.
11.4 Sybase ASA
Odpowiedzi:
______________________________________
11.1 Co to jest Sybase ASE i Sybase ASA?
Najbardziej popularnymi serwerami baz danych są: Sybase ASE - Sybase Adaptive Server Enterprise,
oraz Sybase ASA - Sybase Adaptive Server Anywhere (wchodzi w skład pakietu SQL Anywhere Studio).
______________________________________
11.2 Skąd wziąć?
Ze strony .
Prawie wszystkie produkty Sybase wymagają zakupy licencji. Wyjątkiem jest Sybase ASE Express Edition
(http://www.sybase.com/linuxpromo/). Jest to w pełni darmowy RDBMS przeznaczony do zastosowań komercyjnych.
Nie wymaga licencji, a zakup wsparcia jest opcjonalny.
Pozostałe produkty można sprawdzić i przetestować ściągając wersje ewaluacyjne lub deweloperskie
(wymagana jest /darmowa/ rejestracja).
______________________________________
11.3.1 Informacje o serwerze i bazach danych
-- Aktualnie wybrany serwer:
1> SELECT @@servername
2> go
-- Informacja o wersji serwera:
1> SELECT @@version
2> go
-- Aktualnie wybrana baza danych:
1> SELECT db_name()
2> go
-- Informacja o dostępnych bazach danych na serwerze:
1> EXEC sp_helpdb
2> go
______________________________________
11.3.2 Informacje o kolumnach i ich typach w tabeli.
1> EXEC sp_columns TableName
2> go
--lub
1> SELECT object_name(id)||'.'||name
2> FROM SysColumns
3> WHERE object_name(id) = 'TableName'
4> ORDER BY id,colid
5> go
______________________________________
11.3.3 Dla zadanej nazwy zależności wskazuje tabela.klucz i tabreferencyjna.klucz
SELECT
object_name(SR.ConstrID) AS Referencja,
object_name(SR.TableID)||'.'||SC.name AS Tabela,
object_name(SR.RefTabID)||'.'||SC2.Name AS "Tabela Ref"
FROM SysReferences SR
INNER JOIN SysColumns SC
ON SC.ID = SR.TableID
INNER JOIN SysColumns SC1
ON SC1.ID = SR.RefTabID
AND SC1.ColID = SR.KeyCNT
INNER JOIN SysColumns SC2
ON SC2.ID = SR.RefTabID
AND (SC2.ColID = SR.RefKey1 AND SC.ColID = SR.fokey1
OR SC2.ColID = SR.RefKey2 AND SC.ColID = SR.fokey2
OR SC2.ColID = SR.RefKey3 AND SC.ColID = SR.fokey3
OR SC2.ColID = SR.RefKey4 AND SC.ColID = SR.fokey4
OR SC2.ColID = SR.RefKey5 AND SC.ColID = SR.fokey5
OR SC2.ColID = SR.RefKey6 AND SC.ColID = SR.fokey6
OR SC2.ColID = SR.RefKey7 AND SC.ColID = SR.fokey7
OR SC2.ColID = SR.RefKey8 AND SC.ColID = SR.fokey8
OR SC2.ColID = SR.RefKey9 AND SC.ColID = SR.fokey9
OR SC2.ColID = SR.RefKey10 AND SC.ColID = SR.fokey10
OR SC2.ColID = SR.RefKey11 AND SC.ColID = SR.fokey11
OR SC2.ColID = SR.RefKey12 AND SC.ColID = SR.fokey12
OR SC2.ColID = SR.RefKey13 AND SC.ColID = SR.fokey13
OR SC2.ColID = SR.RefKey14 AND SC.ColID = SR.fokey14
OR SC2.ColID = SR.RefKey15 AND SC.ColID = SR.fokey15
OR SC2.ColID = SR.RefKey16 AND SC.ColID = SR.fokey16
)
WHERE object_name(SR.ConstrID) = '@CONSTRAINT_NAME'
______________________________________
11.3.4 Wyszukiwanie w bazie tabel/kolumn o podanej nazwie.
--Szukamy wszystkich tabel zawierajacych kolumn %KolumnaID%
SELECT object_name(id)||'.'||name
FROM SysColumns
WHERE name LIKE '%KolumnaID%'
ORDER BY object_name(id)
--Szukamy wszystkich tabel/obiektow w bazie o nazwie %Tabela%
EXEC sp_tables '%Tabela%'
--lub
SELECT name
FROM SysObjects
WHERE name like '%Tabela%'
AND type = 'U' -- U = UserTables
ORDER BY name
______________________________________
11.3.5 Polecenia do usuwania zależności dla zadanej tabeli @TableName
1> SELECT 'ALTER TABLE '||SO.name||' DROP CONSTRAINT '||object_name(SR.ConstrID)||'' from SysReferences SR
2> INNER JOIN SysObjects SO
3> ON SO.ID = SR.RefTabID
4> WHERE SO.name='@TableName'
5> go
______________________________________
11.3.6 Sprawdzanie logu transakcji
Istnieje wbudowana procedura sp_helpsegment, która dla parametru logsegment przedstawia aktualny stan logu transakcji:
1> EXEC sp_helpsegment logsegment
2> go
______________________________________
11.3.7 Szybkie kasowanie logu transakcji.
Jeżeli zdarzy się sytuacja, że log transakcji zostanie przepełniony, wówczas można (nie jest polecane)
wyczyścić log przy z opcją truncate_only:
1> DUMP TRANSACTION DatabaseName WITH truncate_only
2> go
______________________________________
11.3.8 Sprawdzanie uruchomionych procesów na serwerze.
1> SELECT spid,status,program_name,cmd,loggedindatetime,ipaddr,loginame=convert(char(12),
2> suser_name(suid)),hostname,dbname=convert(char(10),db_name(dbid)),cpu,physical_io,memusage
3> FROM master..sysprocesses
4> ORDER BY loggedindatetime desc
-- sprawdzanie procesów, które uruchomione są przez wiecej niż podana wartość @Value (zadana w sekundach):
1> SELECT
2> 'TIMES',convert(varchar,datediff(hour,loggedindatetime,getdate()))||
3> '.'||convert(varchar,(datediff(minute,loggedindatetime,getdate()))%60)||
4> '.'||convert(varchar,(datediff(second,loggedindatetime,getdate()))%60) AS "Hours.Minutes.Seconds",
5> spid,status,program_name,cmd,loggedindatetime,ipaddr,loginame=convert(char(12), suser_name(suid)),
6> hostname,dbname=convert(char(10),db_name(dbid)),cpu,physical_io,memusage
7> FROM master..sysprocesses
8> WHERE datediff(second,loggedindatetime,getdate()) > @Value
9> ORDER BY loggedindatetime desc
______________________________________
11.3.9 Uruchamianie isql'a [unix].
isql (Interactive SQL) znajduje się w $SYBASE/OCS-12_5/bin/isql
Atrybuty przełączników są pisane dużymi literami.
-U USER
-P PASSWORD
-S SERVER
-D DATABASE
-E EDITOR
-c SEPARATOR
-p uaktywnia statystyki : Execution Time oraz Clock Time
-e Zawiera wszystkie polecenia isql w wynikach
-n Usuwa numerowania i znaki zachęty (zwykle używane w generowaniu wyników do pliku)
-i InputFile // lub < InputFile
-o OutputFile // lub > OutputFile
Uwaga 1 : Plik InputFile powinien zawierać separator(y) poleceń w nowych wierszach.
Uwaga 2 : Nie jest możliwe połączenie się isql'em bez podania nazwy serwera // :).
Uwaga 3 : Jeżeli isql zostanie wywołany bez określenia bazy danych, to domyślnie połączy się z domyślną bazą (zwykle jest to mater).
Uwaga 4 : Polecenie
1> use database_name
2> go
zmienia domyślnie używaną bazę danych.
Uwaga 5 : Czasy przy statystykach podawane są w ms.
Np.:
Uruchamia isql z włączonymi statystykami i edytorem joe
# $SYBASE/OCS-12_5/bin/isql -Uuser_name -Sserver_name -Ddatabase_name -p -Ejoe
Uruchamia isql dla poleceń(nia) z pliku InputFile.sql i generuje wyniki do pliku output.txt.
Plik wyjściowy zawiera poza wynikami, wszystkie komendy, statystyki oraz brak numerowania wierszy.
Oba poniższe wywołania są równoważne.
# $SYBASE/OCS-12_5/bin/isql -Uuser_name -Sserver_name -Ddatabase_name -i InputFile.sql -o output.txt -e -n -p
# $SYBASE/OCS-12_5/bin/isql -Uuser_name -Sserver_name -Ddatabase_name < InputFile.sql > output.txt -e -n -p
______________________________________
11.3.10 Kopiowanie zawartości tabel do/z pliku.
Za pomocą programu bcp możliwe jest kopiowanie danych z tabeli do zadanego pliku, w formacie określonym przez użytkownika.
-c uaktywnia tryb znakowy
-t SEPARATOR
Np.:
Kopiuje tabelę TABELA z bazy danych BAZA na serwerze SERWER do pliku out_TABELA.txt, z separatorem %
# bcp BAZA.dbo.TABELA out out_TABELA.txt -SSERWER -Uvibart -c -t "%"
Aby uzyskać informację o danej tabeli w postaci database_name.owner.table_name, najlepiej wykorzystać poniższe zapytanie:
SELECT db_name()||"."||user_name(uid)||"."||name
FROM SysObjects
WHERE name = "ObjectName"
W celu importu danych do bazy z pliku wystarczy wydać polecenie:
# bcp BAZA.dbo.TABELA in out_TABELA.txt -SSERWER -Uvibart -c -t "%"
______________________________________
11.3.11 Sprawdzanie akutalnie wykonywanego polecenia SQL.
Dla procesu o ID = @SPID (w celu sprawdzenia procesu można wykorzystać zapytanie z punktu 11.3.8)
1> dbcc traceon(3604)
2> go
1> dbcc sqltext(@SPID)
2> go
1> dbcc traceoff(3604)
2> go
Informacje o produktach i oprogramowaniu do Sybase
Sybase homepage
Sybase dla Linuxa
ASE dla Linuxa FAQ (ASE on Linux FAQ)
Sybase ISUG FAQ (Intenational Sybase Users Group)
Sybase Technical Documents
Sybase Product Manuals
Sybase Shareware
FreeTDS (implementacja protokolu komunikacji mniedzy serverem a app.
klienckimi). Poniekad dotyczy to takze MS SQL Server
SQSH - SQL Shell (mieszanka isql i shell'a). Ciekawe dla wszyskich,
ktorzy uwazaja isql/bcp za plage ;-)
BCPtool (bcp ubrany w GUI)
BDA Devil - zbior informacji i ciekawych tool'i
Blink Public Folder - Portal do informacji na temat Sybase
Sybase ASE Tools & Documentation by Rob Verschoor
_____________________________________________________________________
12. (Visual) FoxPro
Opracował Kamil Paszkiewicz
Pytania:
12.1 Dlaczego nie działa SET COLLATE TO "POLISH"
12.2 Jak pozbyć się komunikatu "Source is out of date" ?
12.3 Jak zamknąć program krzyżykiem bez komunikatu "Cannot quit
Microsoft Visual FoxPro" ?
12.4 Jak pozbyć się komunikatu "The control is read-only" przy
wciśnięciu klawisza na gridzie ?
12.5 Jak sprawdzić ilość stron w raporcie ?
12.6 Jak wyłączyć okienko z pytaniem o stronę kodową ?
12.7 Jak sprawdzić, czy katalog istnieje ?
12.8 Ile znaków dopuszcza polecenie "sqlexec" ?
12.9 Jak uniknąć ostrzeżenia o istnieniu indeksu, tagu przy ponownym
indeksowaniu INDEX ON ... TAG ?
Odpowiedzi:
___________________
12.1 Dlaczego nie działa SET COLLATE TO "POLISH"?
Należy zainstalować ServicePack co najmniej 3.
___________________
12.2 Jak pozbyć się komunikatu "Source is out of date"?
set development on
___________________
12.3 Jak zamknąć program krzyżykiem bez komunikatu "Cannot quit
Microsoft Visual FoxPro"?
Znaleźć w dokumentacji "on shutdown"
___________________
12.4 Jak pozbyć się komunikatu "The control is read-only" przy
wciśnięciu klawisza na gridzie?
set notify off
___________________
12.5 Jak sprawdzić ilość stron w raporcie?
Jest _PAGENO, która mówi na jakiej aktualnie jesteśmy stronie raportu.
Jednak przed puszczeniem jej wartość końcowa nie jest znana. Jeżeli
raport nie jest czasochłonny, to można puścić "w próżnię", przeczytać
_PAGENO i puścić właściwy.
___________________
12.6 Jak wyłączyć okienko z pytaniem o stronę kodową?
SET CPDIALOG OFF
___________________
12.7 Jak sprawdzić, czy katalog istnieje?
W VFP3 lub fox for dos, za pomocą funkcji "adir". W wersjach > 3 :
directory()
___________________
12.8 Ile znaków dopuszcza polecenie "sqlexec"?
Co najmniej tyle ile ile zmieści zmienna znakowa, czyli 64kb. Jeśli
pojawi się komunikat typu
"command contains unrecognized phraze/keyword", zwykle pomaga
"pocięcie" zapytania na kawałki (np. a=a+'...).
___________________
12.9 Jak uniknąć ostrzeżenia o istnieniu indeksu, tagu przy ponownym
indeksowaniu INDEX ON ... TAG?
SET SAFETY OFF. Polecenie to wyłącza również komunikaty przy próbie
nadpisania pliku, zap-owania i paru innych operacjach.
_____________________________________________________________________
13. Inne źródła o bazach danych i zagadnieniach pokrewnych
___________________
1. Progress
Sporo materiałów w postaci plików PDF, niestety w języku angielskim
Lista dyskusyjna Progress'a
Polski Klub Użytkowników Systemu Progress
Na tychże stronach kurs PROGRESS od A do Z, czyli to co znajdziesz w książce
wymienionej poniżej.
Projekt possenet.org
Literatura:
* "PROGRESS baza danych, język i środowisko programistyczne"
___________________
2. Lista baz danych open source
--------------------------
I. Relacyjne
--------------------------
1. MySQL
http://www.mysql.com/
2. PostgreSQL
http://www.postgresql.org/
3. Firebird
http://www.firebirdsql.org/
http://www.ibphoenix.com/
4. Berkeley DB
http://www.sleepycat.com/products/db.shtml
5. MaxDB (SAP DB od wersji 7.5)
http://www.mysql.com/products/maxdb/
6. Ingres
http://opensource.ca.com/projects/ingres
7. HSQLDB
http://hsqldb.sourceforge.net/
8. Cloudscape
http://www-306.ibm.com/software/data/cloudscape/
--------------------------
II. Obiektowe
--------------------------
--------------------------
III. XML
--------------------------
1. Berkeley DB XML
http://www.sleepycat.com/products/xml.shtml
2. eXist - Open Source native XML database
http://exist.sourceforge.net/
--------------------------
III. Embedded
--------------------------
1. Berkeley DB Java Edition
http://www.sleepycat.com/products/je.shtml
2. SQLite - biblioteka języka C
http://www.sqlite.org/
--------------------------
V. Nieaktywne projekty
--------------------------
1. GNU SQL Server
http://www.ispras.ru/~gsql/
2. SAP DB
http://www.sapdb.org/
___________________
3. Gdzie mogę znaleźć bazę polskich kodów pocztowych?
Bazy kodów pocztowych, miejscowości, jednostek terytorialnych są oferowane przez:
- Hoga.pl: miejscowości, województwa, powiaty, gminy, kody pocztowe, ulice, liczba ludności,
numery kierunkowe, sądy powszechne, urzędy administracyjne (z numerami kont), numeracja NTS, współrzędne geograficzne
___________________
Literatura:
* Lausen George, Vossen Gottfried - Obiektowe bazy danych. Modele
danych i języki, WNT, Warszawa, 2000
* Poe Vidette, Klauer Patricia, Brobst Stephen - Tworzenie hurtowni
danych, WNT, Warszawa
* Harrington Jan L. - Obiektowe bazy danych, Mikom, Warszawa, 2001
* Yourdon Edward, Argila Carl - Analiza obiektowa i projektowanie.
Przykłady zastosowań, WNT, Warszawa, 2000
* Yourdon E. - Marsz ku klęsce. Poradnik dla projektanta systemów, WNT,
Warszawa, 2000
* Beynon-Davies P. - Inżynieria systemów informacyjnych, WNT,
Warszawa, 1999
* Adamczewski P. - Zintegrowane systemy informatyczne w praktyce,
Mikom, Warszawa, 1998
* Dumnicki R., Kasprzyk A., Kozłowski M. - Analiza i projektowanie
obiektowe, Helion, Gliwice, 1998
* Pomykała J.M., Pomykała J.A. - Systemy informacyjne, Mikom,
Warszawa, 1999
* Hurtownie danych - Microsoft SQL Server 7.0. Przewodnik Techniczny,
Wydawnictwo Microsoft Press; wydane w Polsce przez A.P.N. Promise,
Warszawa, 2000
* Harrington J. L. - Obiektowe bazy danych dla każdego, Mikom,
Warszawa, 2001
Dużo linków (także MS Access)
Obiektowe bazy danych
FAQ grupy pl.comp.www.server-side
FAQ grupy pl.comp.lang.php
FAQ grupy pl.comp.lang.perl
dBase KnowledgeBase
Artykuły o bazach danych, certyfikaty, recenzje
____________________________koniec FAQ_______________________________