PostgreSQL (www.postgresql.org) Plan wykładu: Wprowadzenie Użytkowanie Administracja
Wprowadzenie Licencjonowanie BSD w pełni darmowy 2
Wprowadzenie (2) Serwer dostępny na różne systemy operacyjne Unix/Linux Microsoft Windows (od PostgreSQL 8.0) Maksymalny rozmiar tabeli: 32TB Uniwersalność obiektowo-relacyjna baza danych dziedziczenie własne typy danych własne funkcje Zaimplementowany bardzo duży podzbiór ANSI SQL 92/99 3
Przykładowe typy (1/2) Użytkowanie (1) Liczby całkowite: SMALLINT, INTEGER, BIGINT Liczby zmiennoprzecinkowe: REAL, DOUBLE PRECISION Liczby stałoprzecinkowe: DECIMAL(M, N) Waluta: MONEY (ustawienia lokalne) Data i czas: DATETIME, DATE, TIMESTAMP, TIME, INTERVAL Logiczny: BOOLEAN Napisy: CHAR, VARCHAR, TEXT Typ danych bitowy: BIT, VARBIT Typ danych binarnych: BYTEA 4
Użytkowanie (2) Przykładowe typy (2/2) Typ danych binarnych: Large objects (pozostałość, przed BYTEA) Typ danych geometrycznych: POINT, LINE, LSEG, BOX, PATH, POLYGON, CIRCLE Internet: CIDR, INET, MACADDR Tablice: [] Oraz własne typy... 5
Użytkowanie (3) Konwersja typów i kodowania napis można poprzedzić docelowym typem REAL '1.23' === CAST( '1.23' AS REAL ) to_char(timestamp now, HH12:MI:SS ) convert( PostgreSQL using iso_8859_1_to_utf_8) 6
Użytkowanie (4) Napisy: 'napis' $$inny napis$$ $tag$inny napis2$tag$ ' w napisie otoczonym ' można zapisać jako ' ' Można także poprzedzić znakiem \ 7
Przykład użycia (2/2) Użytkowanie (5) Wyrażenia regularne SIMILAR TO ('%' oznacza '.*', '_' oznacza '.') SELECT * FROM pet WHERE name LIKE '%b%' SELECT * FROM pet WHERE name SIMILAR TO %(b d)% Wyrażenia regularne POSIX REGEXP Operator Opis Przykład ~ pasuje, ważna wielkość liter thomas ~.*thomas.* ~* pasuje, nieważna wielkość liter thomas ~*.*Thomas.*!~ nie pasuje, ważna wielkość liter thomas!~.*thomas.*!~* nie pasuje, nieważna wielkość liter thomas!~*.*vadim.* 8
Operacje na czasie time 01:00 + interval 3 hours Użytkowanie (6) timestamp 2001-09-28 01:00 + interval 23 hours interval 1 hour * int 3 date_part( hour, timestamp 2001-02-16 20:38:40 ) 9
Użytkowanie (7) BOOLEAN t (domyślna wartość zwracana przez SELECT), true, y, yes, TRUE, 1 f (domyślna wartość zwracana przez SELECT), false, n, no, FALSE, 0 10
Użytkowanie (8) BIT B'0101011' bitowy napis BIT(7) B 0011 B 01 => 001101 B 0011 & B 0101 => 0001 B 0011 B 0101 => 0111 B 0011 # B 0101 => 0110 ~ B 0011 => 1100 B 0011 << 2 => 1100 B 0011 >> 1 => 0001 11
Operacje geometryczne Użytkowanie (9) translacja: box ((0,0),(1,1)) + point (2.0,0) obliczenie obszaru: area(box ((0,0),(1,1)) ) 12
Użytkowanie (10) Operacje na adresach internetowych zawieranie się: inet 192.168.1/24 >> inet 192.168.1.5 utworzenie adresu z maską ('192.168.1.5/32'): text(inet 192.168.1.5 ) 13
Użytkowanie (11) Tablice (indeksowane od 1) CREATE TABLE dochody_pracownik ( nazwisko text, zaplacone integer[], planowane text[][] ); INSERT INTO dochody_pracownik VALUES ( Bill, {10000, 10000, 10000, 10000}, {{"meeting", "lunch"}, {}} ); INSERT INTO dochody_pracownik VALUES ( Carol, {20000, 25000, 25000, 25000}, {{"rozmowa", "konsultacje"}, {"meeting"}} ); SELECT nazwisko FROM dochody_pracownik WHERE zaplacone[1] <> zaplacone[2]; UPDATE dochody_pracownik SET zaplacone[1:2] = {27000,27000} WHERE nazwisko = Carol ; 14
Użytkowanie (12) BYTEA dane wpisywać jak do pola tekstowego kody niewyświetlane należy utworzyć przez użycie '\' 15
Użytkowanie (13) Large Objects (przesył danych poprzez pliki) CREATE TABLE image ( name text, raster oid ); INSERT INTO image (name, raster) VALUES ( obrazek, lo_import( /tmp/motd )); SELECT lo_export(image.raster, /tmp/motd ) FROM image WHERE name = obrazek ; 16
Użytkowanie (14) Własne typy CREATE TYPE typename ( INPUT = input_functiontxt, OUTPUT = output_functiontxt, INTERNALLENGTH = { internallength VARIABLE } [, RECEIVE = receive_functionbin ] [, SEND = send_functionbin ] [, DEFAULT = default ] [, ALIGNMENT = alignment ] ); CREATE TYPE typename AS ( column_name data_type [,... ] ); 17
Własne operatory Użytkowanie (15) CREATE OPERATOR oper ( PROCEDURE = proc, [ LEFTARG = type_left, ] [ RIGHTARG = type_right, ] [ COMMUTATOR = oper ] ); 18
Użytkowanie (16) Generowanie unikalnego klucza (SERIAL, BIGSERIAL) CREATE TABLE tab ( kol SERIAL ); Sekwencja (odpowiednik) CREATE SEQUENCE tab_kol_seq; CREATE TABLE tab ( kol integer DEFAULT nextval( tab_kol_seq ) NOT NULL ); Funkcje do obsługi sekwencji nextval(text) zwiększa wartość sekwecji i zwraca nową wartość currval(text) zwraca ostation uzyskaną wartość sekwencji setval(text,bigint) ustawia wartość sekwencji 19
Użytkowanie (17) Ograniczenia zastrzeżone nazwy kolumn (1/2) oid (object ID) Identyfikator wiersza. Numer seryjny dodawany automatycznie. tableoid (table OID) Identyfikator tabeli zawierającej dany wiersz. Ma zastosowanie przy pobieraniu danych z tabel na różnych poziomach w hierarchi dziedziczenia. Nazwę tabeli o danym identyfikatorze można znaleźć w tabeli pg_class. ctid Fizyczne położenie krotki w tabeli. Zmienia się z każdym UPDATE lub VACUUM FULL. Nie nadaje się jako długo terminowy identyfikator. 20
Użytkowanie (18) Ograniczenia zastrzeżone nazwy kolumn (2/2) xmin (transaction ID) Identyfikator transakcji wstawiającej zadaną wersję wiersza. cmin (command ID) Numer polecenia w transakcji wstawiającej. xmax (transaction ID) Identyfikator transakcji usuwającej zadaną wersję wiersza. cmax (command ID) Numer polecenia w transakcji usuwającej (lub 0) 21
Użytkowanie (19) Dziedziczenie CREATE TABLE miasta ( nazwa text, populacja float, wysokosc int); CREATE TABLE wojewodztwa ( woj_skr char(2) ) INHERITS (miasta); Zwraca wyniki także z potomków (pochodzenie wiersza można ustalić po tableoid): SELECT nazwa, wysokosc FROM miasta WHERE wysokosc > 170; Zwraca wyniki tylko z wybranej tabeli: SELECT nazwa, wysokosc FROM ONLY miasta WHERE wysokosc > 170; 22
Użytkowanie (20) Indeksy B-tree (<, <=, =, >=, >) indeks domyślny R-tree (<<, &<, &>, >>, @, ~=, &&) CREATE INDEX nazwa ON tab USING RTREE (kol); Hash (=) CREATE INDEX nazwa ON tab USING HASH (kol); Indeksy funkcyjne (gdy używamy przy porównaniu funkcji): SELECT * FROM test1 WHERE lower(kol) = wartosc ; CREATE INDEX test1_lower_col1_idx ON test1 (lower(kol)); Indeks częściowy (gdy korzystamy z podzbioru wierszy przy porónaniu): CREATE INDEX rachunki_niezaplacone_index ON rachunki (nr) WHERE zaplacony is not true; 23
Użytkowanie (21) Własne funkcje (PL/pgSQL, PL/Tcl, PL/Perl, PL/Python) CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [,...] ] ) RETURNS rettype { LANGUAGE langname IMMUTABLE STABLE VOLATILE CALLED ON NULL INPUT RETURNS NULL ON NULL INPUT STRICT [EXTERNAL] SECURITY INVOKER [EXTERNAL] SECURITY DEFINER AS definition AS obj_file, link_symbol }... [ WITH ( attribute [,...] ) ] CREATE FUNCTION sales_tax(real) RETURNS REAL AS DECLARE subtotal ALIAS FOR $1; BEGIN return subtotal * 0.06; END; LANGUAGE plpgsql ; 24
Użytkowanie (22) Transakcje BEGIN [ WORK TRANSACTION ] / START TRANSACTION COMMIT / ROLLBACK [ WORK TRANSACTION ] Punkty kontrolne możliwość wycofania się do określonego miejsca wewnątrz transakcji SAVEPOINT identifier ROLLBACK TO SAVEPOINT identifier Dwufazowy commit (dane sesji pamiętane na dysku) BEGIN PREPARE TRANSACTION 'tr1'... COMMIT/ROLLBACK PREPARED 'tr1' 25
Użytkowanie (23) Transakcje Blokowanie tabel LOCK [ TABLE ] name [,...] [ IN lockmode MODE ]... lockmode = ACCESS SHARE ROW SHARE ROW EXCLUSIVE SHARE UPDATE EXCLUSIVE SHARE SHARE ROW EXCLUSIVE EXCLUSIVE ACCESS EXCLUSIVE Tabela zwolniona po zakończeniu transakcji 26
Poziomy izolacji Użytkowanie (24) SET TRANSACTION [ ISOLATION LEVEL { READ COMMITTED SERIALIZABLE } ] [ READ WRITE READ ONLY ] READ COMMITTED domyślny, czyta zatwierdzone SERIALIZABLE pełna szeregowalność 27
Przykład użycia (1/2) Użytkowanie (25) Utworzenia klastera bazodanowego (powstanie wzorzec bazy: template1) i uruchomienie serwera initdb -D /usr/local/pgsql/data postmaster -D /usr/local/pgsql/data 28
Przykład użycia (2/2) Utworzenie bazy danych Użytkowanie (26) CREATE DATABASE menagerie; -- sklonowanie template1 CREATE DATABASE dbname OWNER username; CREATE DATABASE dbname TEMPLATE template0; Odświeżenie indeksów szczególnie gdy były usuwane dane REINDEX Odświeżenie statystyk, zwolnienie miejsca po usuniętych krotkach VACUUM Informacje o planie wykonania EXPLAIN SELECT * FROM tab1 29
Użytkownicy i uprawnienia Administracja ACL (Access Control Lists) informacja jest przechowywana w tabelach systemowych (pg_*) pg_user pg_group pg_roles... 30
Administracja (2) Użytkownicy i uprawnienia (2) Użytkownicy (autoryzacja) nazwa roli (użytkownika/grupy) adres, z którego się łączy (może być podana maska) 31
Administracja (3) Użytkownicy i uprawnienia (3) Dostęp do zasobów - poziomy hierarchii Database level GRANT... ON DATABASE db Table level GRANT... ON TABLE table Routine level GRANT... ON FUNCTION fun... 32
Administracja (4) Rodzaje uprawnień ALL PRIVILEGES -------------- SELECT INSERT UPDATE DELETE RULE REFERENCES TRIGGER -------------- CREATE TEMPORARY -------------- EXECUTE -------------- USAGE 33
Użytkownicy CREATE USER name; Atrybuty: Administracja (5) superuser nie obejmują go żadne ograniczenia CREATE USER name CREATEUSER database creation może tworzyć nową bazę CREATE USER name CREATEDB password ustawienie hasła dla połączenia CREATE USER name PASSWORD string DROP USER name; ALTER USER name WITH PASSWORD pass ; 34
Administracja (6) Grupy CREATE GROUP name ALTER GROUP name ADD USER uname1,... ALTER GROUP name DROP USER uname1,... 35
Role (użytkownicy i grupy) Administracja (7) CREATE ROLE name; (synonim CREATE GROUP) CREATE ROLE uname1 LOGIN; (synonim CREATE USER) GRANT name TO uname1,... DROP ROLE name SET ROLE name (przełączanie się między rolami) Hierarchia dziedziczenie uprawnień (domyślnie) CREATE ROLE name INHERIT Hierarchia bez dziedziczenia uprawnień CREATE ROLE name NOINHERIT 36
Użytkownicy i uprawnienia Administracja (8) Plik: pg_hba.conf informacja o prawach dostępu do serwera # local DATABASE USER METHOD [OPTION] # host DATABASE USER IP-ADDRESS IP-MASK METHOD [OPTION] # hostssl DATABASE USER IP-ADDRESS IP-MASK METHOD [OPTION] # METHOD = "trust", "reject", "md5", "crypt", "password", # "krb4", "krb5", "ident", or "pam". # TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD local all all trust host all all 127.0.0.1 255.255.255.255 trust 37
Administracja (9) Program do zrzucenia bazy do pliku SQL pg_dump dbname > outfile pg_dumpall > outfile psql dbname < infile 38
Administracja (10) Kanały komunikacyjne TCP/IP 5432 Potoki zawiera SSL, od klienta wymagana konfiguracja tunelu dla portu 5432 39