Akademia Górniczo Hutnicza Im. St. Staszica w Krakowie Wydział EAIiE Katedra Automatyki Laboratorium specjalizacyjne Porównanie systemów relacyjnych baz danych PostgreSQL i Oracle Mirosław Jąkała Maciej Michno
Plan prezentacji Reprezentacja danych Przetwarzanie danych Wyzwalacze Perspektywy / Widoki Transakcje Rozszerzenia Narzędzia 2
PostgreSQL: Reprezentacja danych Typy numeryczne smallint, int2 (2 bajty) zakres: -32768 do +32767 integer, int, int4 (4 bajty) zakres:-2147483648 do +2147483647 bigint, int8 (8 bajtów) zakres: -9223372036854775808 do 9223372036854775807 Numeric [(p,s)], Decimal [(p,s)] (zmienna długość) zakres: bez limitu p precision, musi być dodatnia s scale, musi być większe bądź równe zero Numeric może przyjąć wartość NaN not a number (niezdefiniowane wyniki operacji) 3
Reprezentacja danych Typy numeryczne Real, float4 (4 bajty) zakres: 1E-37 do 1E+37, 6 miejsc precyzji. Real może przyjmować NaN, Infinity, -Infinity UPDATE table SET x = Infinity Double precision, float8 (8 bajtów) 1E-307 to 1E+308 15 miejsc precyzji Serial, serial4 (4 bajty) 1 do 2147483647 Bigserial,serial8 (8 bajtów) 1 do 9223372036854775807 CREATE TABLE t ( colname SERIAL ); CREATE SEQUENCE t_colname_seq; CREATE TABLE t ( colname integer DEFAULT nextval( t_colname_seq ) NOT NULL ); Money (4 bajty) zakres: -21474836.48 do +21474836.47 4
Reprezentacja danych Typy numeryczne Oracle: NUMBER typ danych numerycznych stało- i zmiennoprzecinkowych Zakres: Liczby dodatnie: 1 * 10-130 do 9.99...9 * 10 125 precyzji Liczby ujemne: -1 * 10-130 do -9.99...9 * 10 125 precyzji do 38 cyfr do 38 cyfr Może przechowywać także: Zero +/- nieskończoność Niezdefiniowane wyniki operacji (NAN not a number) 5
Reprezentacja danych Typy numeryczne Definiowanie kolumny typu numerycznego: column_name NUMBER - bez podania precyzji i skali column_name NUMBER (precision, scale) - precyzja i skala column_name NUMBER (*, scale) - specyfikacja skali bez precyzji Przykład zastosowania: Dane wejściowe Specyfikacja typu Zapisane dane 7456123.89 NUMBER 7456123.89 7456123.89 NUMBER(*,1) 7456123.9 7456123.89 NUMBER(9) 7456124 7456123.89 NUMBER(9,2) 7456123.89 7456123.89 NUMBER(9,1) 7456123.9 7456123.89 NUMBER(6) Przekroczona precyzja 7456123.89 NUMBER(7,-2) 7456100 6
Reprezentacja danych Typy numeryczne Dane numeryczne przechowywane są w bazie ORACLE w formacie naukowym: 1 bajt cecha, do 20 bajtów mantysy. Ilość zajmowanych bajtów w bazie danych można obliczyć według zależności: ROUND((length(p)+s)/2))+1 gdzie: p precyzja, s = 0 gdy dodatnia, s = 1 gdy liczba ujemna. Zero oraz nieskończoność przechowywane są na jednym bajcie natomiast +nieskończoność na 2 bajtach w unikalnej reprezentacji. 7
Reprezentacja danych Typy numeryczne Typ zmiennoprzecinkowy w odróżnieniu od typu NUMBER wykorzystuje precyzję binarna, a nie dziesiętną, co skutkuje zwiększeniem szybkości obliczeń arytmetycznych oraz zredukowaniem wymaganej przestrzeni do przechowywania danych. BINARY_FLOAT 32 bity, pojedyncza precyzja, 5 bajtów (liczba całkowita 8 bitów, znak 1 bit, eksponenta 8 bitów, część ułamkowa 23 bity) BINARY_DOUBLE 64 bity, podwójna precyzja, 9 bajtów (liczba całkowita 8 bitów, znak 1 bit, eksponenta 11 bitów, część ułamkowa 52 bity) 1234.56789 -> 1.235E+003 8
PostgreSQL: Reprezentacja danych Typy znakowe Rozmiar: (4 bajty + długość ciągu + [długość dopełnienia]) character varying(n), varchar(n) - zmienna długość z limitem znaków n character(n), char(n) -stała długość n z dopełnieniem spacjami text - zmienna nielimitowana długość (nie jest w standardzie SQL) Character varying = text Character = character(1) 9
Reprezentacja danych Typy znakowe CREATE TABLE test2 (b varchar(5)); INSERT INTO test2 VALUES ( ok ); INSERT INTO test2 VALUES ( good ); INSERT INTO test2 VALUES ( too long ); ERROR: value too long for type character varying(5) INSERT INTO test2 VALUES ( too long ::varchar(5)); SELECT b, char_length(b) FROM test2; b char_length -------+------------- ok 2 good 5 too l 5 Specjalne typy znakowe: char - 1 bajt, typ wewnętrzny, pojedynczy znak name - 64 bajty, typ wewnętrzny dla nazw obiektów (63 znaki + terminator) 10
Oracle: Reprezentacja danych Typy znakowe CHAR - przechowuje ciągi znakowe, zakres: do 2000 bajtów. Domyślnie przyjmowana długość ciągu to 1 bajt. VARCHAR2, VARCHAR - przechowuje ciągi znakowe o zmiennej długości. Zakres: do 4000 bajtów. Semantyka znakowa i semantyka bajtowa: VARCHAR2(20 BYTE) wtedy SUBSTRB(<string>, 1, 20) używa semantyki bajtowej VARCHAR2(10 CHAR) wtedy SUBSTR(<string>, 1, 10) używa semantyki znakowej NCHAR i NVARCHAR2 - przechowują dane zapisane w Unicode: UTF8 i AL16UTF16. Jedyną semantyką jest semantyka znakowa. NCHAR zakres: do 2000 bajtów NVARCHAR2 zakres: do 4000 bajtów. LONG - przechowuje ciągi znakowe o długości do 2GB 11
Reprezentacja danych PostgreSQL: Typy daty i czasu timestamp [(p)] [withouttime zone] - data i czas (8 bajtów), zakres: 4713 BC do 5874897 AD timestamp [(p)] withtime zone - data i czas ze strefą czasową (8 bajtów), zakres: 4713 BC do 5874897AD interval[(p)] -interwał czasowy (12 bajtów), zakres: - 178000000 do 178000000 lat date - tylko data (4 bajty), zakres: 4713 BC do 5874897 AD time [(p)] [withouttime zone] - tylko czas (8 bajtów), zakres: 00:00:00 do 24:00:00 time [(p)] with timezone -czaszestrefą czasową (12 bajtów), zakres: 00:00:00+1359 do 24:00:00+1359 p od 0 do 6 dla timestamp i interval p od 0 do 10 dla time 12
Reprezentacja danych Typy daty i czasu abstime i reltime są wewnętrznymi typami o niskiej precyzji. Nie zaleca się ich stosowania, mogą wkrótce zniknąć. Specjalne wartości: String wejściowy Typy Opis epoch date, timestamp 1970-01-01 00:00:00 zerowy czas systemu infinity timestamp + nieskończoność -infinity timestamp - nieskończoność now date, time Aktualny czas today date, timestamp Północ tomorrow date, timestamp Północ dnia następnego yesterday date, timestamp Północ dnia poprzedniego allballs time 00:00:00.00 UTC 13
Reprezentacja danych Typy daty i czasu Oracle: DATE -przechowuje datę i czas (rok, miesiąc, dzień, godzina, minuta, sekunda ) w polach o stałej długości (7 bajtów każde). Zakres: January 1, 4712 BC - December 31, 4712 AD Standardowy format daty: DD-MON-YY Standardowy 24 godzinny format czasu: HH:MI:SS Typ daty Strefa czasowa Części sekundy DATE Nie Nie TIMESTAMP Nie Tak TIMESTAMP WITH TIME ZONE TIMESTAMP WITH LOCAL TIME ZONE Bezpośrednia Względna Tak Tak 14
Reprezentacja danych Typy binarne PostgreSQL: bytea (4 bajty + string binarny) zmiennej długości string binarny. Pozwalają przechowywać: Ciąg binarny dla wartości zero, Ciągi binarne typu non-printable spoza zakresu 32 126 Wartość dziesiętna Opis Reprezentacja wejściowa Przykład 0 Zerowy bajt \\000 SELECT \\000 ::bytea; 39 Apostrof \ lub \\047 92 backslash \\\\ lub \\134 0 do 31 oraz 127 do 255 nonprintable \\xxx (ósemkowo) SELECT \ ::bytea; SELECT \\\\ ::bytea; SELECT \\001 ::bytea; Reprezentacja wyjściowa \000 \\ \001 15
Reprezentacja danych Typy binarne Oracle: BLOB, CLOB, NCLOB oraz BFILE umożliwiają przechowywanie dużych bloków danych (tekst, grafika, pliki video, dźwiękowe itp. ) w postaci znakowej lub binarnej. BLOB przechowuje dane binarne CLOB przechowuje dane typu znakowego NCLOB przechowuje dane typu znakowego z użyciem kodowania UNICODE BFILE przechowuje binarne dane w pliku poza bazą danych. 16
Reprezentacja danych Typy binarne Różnice pomiędzy LOB a LONG: Tabela może zawierać wiele kolumn typu LOB natomiast tylko jedną typu LONG Tabela zawierająca LOB y może być partycjonowana, natomiast maksymalny rozmiar LOB a 8 TB, LONG a 2 GB LOB y (prócz NCLOB) mogą być atrybutem w stworzonym przez użytkownika typie obiektowym Tymczasowe LOB y działające jako lokalne zmienne mogą być wykorzystywane do transformacji na danych typu LOB. Tymczasowe LOBy są tworzone w tymczasowej niezależnej od innych tablic przestrzeni. Dla LONG ów nie istnieje struktura tymczasowa. Tablice zawierające LOB y mogą być replikowane. 17
PostgreSQL: Reprezentacja danych Typ bitowy i ciągów bitowych boolean - (1 bajt) trójstanowy: PRAWDA: t true y yes 1 FAŁSZ: f false n no 0 NIEZNANY: NULL Ciągi bitowe (ciągi 1 lub 0) bit(n) -dokładnie n bitów bit varying(n) maksylanien bitów bit = bit(1) bit varying nieograniczony ciąg bitowy 18
PostgreSQL: Reprezentacja danych Typy geometryczne Nazwa Rozmiar Reprezentacja Opis point 16 bajtów Punkt na płaszczyźnie (x,y) line 32 bajty Prosta ((x1,y1),(x2,y2)) lseg 32 bajty odcinek ((x1,y1),(x2,y2)) box 32 bajty Prostokąt ((x1,y1),(x2,y2)) path 16 + 16 n bajtów Zamknięta scieżka ((x1,y1), ) path 16 + 16 n bajtów Otwarta ścieżka [(x1,y1), ] polygon 40 + 16 n bajtów Poligon ((x1,y1), ) circle 24 bajty Okrąg <(x,y),r> 19
PostgreSQL: Reprezentacja danych Typy adresów sieciowych Nazwa Rozmiar Opis Cidr 12 lub 24 bajty Adres sieci IPv4 lub IPv6 Inet 12 lub 24 bajty Adres hosta i sieci IPv4 lub IPv6 Macaddr 6 bajtów Adres MAC 20
Reprezentacja danych Typ tablicowy PostgreSQL: Kolumny tabel mogą być wielowymiarowymi tablicami typów wbudowanych lub zdefiniowanych przez użytkownika CREATE TABLE sal_emp ( name text, pay_by_quarter integer[4], schedule text[2][2] ); INSERT INTO sal_emp VALUES ( Bill, {10000, 10000, 10000, 10000}, {{"meeting", "lunch"}, {"training", "presentation"}} ); 21
Oracle: Reprezentacja danych RAW, LONG RAW - zmiennej długości, służą do przechowywania danych nie interpretowanych podczas przenoszenia między systemami. XMLType - służy do przechowywanie danych XML. Może być używany do definicji kolumn tabel i widoków, w PL/SQL, SQL, Java oraz przez JDBC, OCI. URI (uniform resource identifier) (URIType, DBURIType, XDBURIType, HTTPURIType) jest uogólnieniem URL. Wykorzystywany do przechowywania adresów typu URL, wskazującego na dokument lub specyficzną część dokumentu. Any Types (anytype, anydata, anydataset) pozwalają na modelowanie parametrów procedur oraz kolumn tablic aktualnie nieznanego typu danych. 22
Reprezentacja danych Oracle: Spatial Types pozwalają na przechowywanie informacji geograficznych (GIS). Do obsługi tych typów danych wymagany jest Oracle Spatial. SDO_GEOMETRY opis geometryczny obiektów przestrzennych SDO_TOPO_GEOMETRY opis geometrii topologii SDO_GEORASTER sieć rastrowa lub obraz 23
Reprezentacja danych - Media Types Oracle: ORDAudio typ obiektowy służący do przechowywania i zarządzania danymi audio. ORDImage - typ obiektowy służący do przechowywania i zarządzania obrazkami. ORDImageSignature - typ obiektowy służący do pełnej reprezentacji koloru, tekstury oraz kształtu przechowywanych obrazów. ORDVideo - typ obiektowy służący do przechowywania i zarządzania danymi video. ORDDoc - typ obiektowy służący do przechowywania i zarządzania danymi multimedialnymi przechowywanie wszystkich typów mediów w jednej kolumnie. 24
Reprezentacja danych - Media Types Oracle: SI_StillImage - typ obiektowy służący do reprezentacji obrazów cyfrowych wraz z wysokością, szerokością oraz formatem. SI_Color typ obiektowy przechowujący wartości kolorów. SI_AverageColor - typ obiektowy reprezentujący cechę charakteryzującą obraz za pomocą jego średniej wartości koloru. SI_ColorHistogram - typ obiektowy reprezentujący cechę charakteryzującą obraz za pomocą jego histogramu. SI_PositionalColor obraz przedstawiony jest jako n x m prostokątów. Ten typ obiektowy reprezentuje cechę obrazu za pomocą najbardziej znaczącego koloru n x m prostokątów. SI_Texture typ obiektowy reprezentujący cechę charakteryzującą obraz za pomocą rozmiaru powtarzających się elementów, kontrastu oraz kierunkowości. SI_FeatureList typ obiektowy zawierający listę do czterech cech obrazu zdefiniowanych przy pomocy następujących typów obiektowych: SI_AverageColor, SI_ColorHistogram, SI_PositionalColor i SI_Texture, powiązanych za pomocą wagi każdej z cech. 25
T1 CROSS JOIN T2 Przetwarzanie danych Łączenie tablic T1 { [INNER] { LEFT RIGHT FULL } [OUTER] } JOIN T2 ON boolean_expression T1 { [INNER] { LEFT RIGHT FULL } [OUTER] } JOIN T2 USING ( join column list ) T1 NATURAL { [INNER] { LEFT RIGHT FULL } [OUTER] } JOIN T2 INNER i OUTER są opcjonalne. INNER jest wartością domyślną. LEFT, RIGHT i FULL występują jedynie w OUTER JOIN. ON jest najbardziej ogólnym warunkiem przyjmującym wartości binarne na takiej samej zasadzie jak warunek WHERE. Para wierszy zostanie połączona, gdy wyrażenie po ON jest prawdziwe. USING zawiera listę nazw kolumn oddzielonych przecinkami, które są wspólne dla złączanych tablic. 26
Przetwarzanie danych Łączenie tablic CROSS JOIN t1 num name -----+------ 1 a 2 b 3 c t2 num value -----+------- 1 xxx 3 yyy 5 zzz SELECT * FROM t1 CROSS JOIN t2; num name num value -----+------+-----+------- 1 a 1 xxx 1 a 3 yyy 1 a 5 zzz 2 b 1 xxx 2 b 3 yyy 2 b 5 zzz 3 c 1 xxx 3 c 3 yyy 3 c 5 zzz (9 rows) 27
Przetwarzanie danych Łączenie tablic INNER JOIN t1 num name -----+------ 1 a 2 b 3 c t2 num value -----+------- 1 xxx 3 yyy 5 zzz SELECT * FROM t1 INNER JOIN t2 ON t1.num = t2.num; num name num value -----+------+-----+------- 1 a 1 xxx 3 c 3 yyy SELECT * FROM t1 INNER JOIN t2 USING (num); num name value -----+------+------- 1 a xxx 3 c yyy SELECT * FROM t1 NATURAL INNER JOIN t2; num name value -----+------+------- 1 a xxx 3 c yyy 28
Przetwarzanie danych Łączenie tablic LEFT OUTER JOIN t1 num name -----+------ 1 a 2 b 3 c t2 num value -----+------- 1 xxx 3 yyy 5 zzz SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num; -- składnia Oracle SELECT * FROM t1, t2 WHERE t1.num = t2.num(+); num name num value -----+------+-----+------- 1 a 1 xxx 2 b 3 c 3 yyy (3 rows) SELECT * FROM t1 LEFT JOIN t2 USING (num); num name value -----+------+------- 1 a xxx 2 b 3 c yyy (3 rows) 29
Przetwarzanie danych Łączenie tablic RIGHT OUTER JOIN t1 num name -----+------ 1 a 2 b 3 c t2 num value -----+------- 1 xxx 3 yyy 5 zzz SELECT * FROM t1 RIGHT JOIN t2 ON t1.num = t2.num; -- składnia Oracle SELECT * FROM t1, t2 WHERE t1.num(+) = t2.num; num name num value -----+------+-----+------- 1 a 1 xxx 3 c 3 yyy 5 zzz (3 rows) 30
Przetwarzanie danych Łączenie tablic FULL OUTER JOIN t1 num name -----+------ 1 a 2 b 3 c t2 num value -----+------- 1 xxx 3 yyy 5 zzz SELECT * FROM t1 FULL JOIN t2 ON t1.num = t2.num; num name num value -----+------+-----+------- 1 a 1 xxx 2 b 3 c 3 yyy 5 zzz (4 rows) 31
PostgreSQL: Przetwarzanie danych query1 UNION [ALL] query2 query1 INTERSECT [ALL] query2 query1 EXCEPT [ALL] query2 Łączenie zapytań UNION jest złączeniem wyników zapytań pierwszego i drugiego, eliminujące duplikaty chyba że użyto parametru ALL. INTERSECT zwraca wszystkie wiersze, które występują zarówno w wynikach pierwszego i drugiego zapytań. Eliminowane są duplikaty, chyba że użyto parametru ALL. EXCEPT zwraca wszystkie wiersze wyniku zapytania pierwszego, które nie występują w wyniku zapytania drugiego. Eliminowane są również duplikaty, chyba że użyto parametru ALL. 32
Przetwarzanie danych Oracle: Łączenie zapytań query1 UNION [ALL] query2 query1 INTERSECT query2 query1 MINUS query2 UNION jest złączeniem wyników zapytań pierwszego i drugiego, eliminujące duplikaty chyba że użyto parametru ALL. INTERSECT zwraca wszystkie wiersze, które występują zarówno w wynikach pierwszego i drugiego zapytań. MINUS zwraca wszystkie wiersze wyniku zapytania pierwszego, które nie występują w wyniku zapytania drugiego. Eliminowane są również duplikaty. Aby można było skorzystać z łączenia zapytań, muszą one zwracać taką samą ilość kolumn oraz odpowiadające kolumny muszą mieć odpowiedni typ danych. 33
Przetwarzanie danych PostgreSQL: LIMIT i OFFSET SELECT select_list FROM table_expression [LIMIT { number ALL }] [OFFSET number] LIMIT służy do ograniczenia ilości wierszy wyniku zapytania. Wynik będzie zawierał number lub mniej wierszy. W przypadku użycia parametru ALL zwracane są wszystkie wiersze zapytania. OFFSET służy do pominięcia pierwszych number wierszy zapytania. W przypadku użycia LIMIT/OFFSET konieczne jest użycie klauzuli ORDER BY w celu jednoznacznego posortowania wierszy wyniku. 34
Oracle: Przetwarzanie danych Zapytania hierarchicznie Gdy tablica zawiera dane hierarchiczne możliwe jest z wybór wierszy w sposób hierarchiczny wykorzystując przeznaczone do tego celu zapytania hierarchiczne. Parametry zapytania: START WITH warunek określa wiersz będący korzeniem drzewa hierarchii CONNECT BY warunek określa relację pomiędzy wierszami nadrzędnymi i potomnymi W zapytaniach hierarchicznych jeden z członów warunku musi być poprzedzony operatorem PRIOR odnoszącym się do wiersza nadrzędnego 35
Przetwarzanie danych Zapytania hierarchicznie Oracle:... PRIOR expr = expr lub... expr = PRIOR expr W przypadku gdy warunek jest złożony tylko jeden jego człon musi być poprzedzony operatorem PRIOR natomiast może ich być więcej: CONNECT BY last_name!= 'King' AND PRIOR employee_id = manager_id... CONNECT BY PRIOR employee_id = manager_id and PRIOR account_mgr_id = customer_id... 36
Przetwarzanie danych Zapytania hierarchicznie Oracle: SELECT employee_id, last_name, manager_id FROM employees CONNECT BY PRIOR employee_id = manager_id; EMPLOYEE_ID LAST_NAME MANAGER_ID ----------- ---------- ---------- 101 Kochhar 100 108 Greenberg 101 109 Faviet 108 110 Chen 108 111 Sciarra 108 112 Urman 108 113 Popp 108 200 Whalen 101 37
Przetwarzanie danych Tablica DUAL Oracle: Dual jest tablicą automatycznie tworzoną przez bazę Oracle. Znajduje się w schemacie użytkownika SYS, ale jest dostępna dla wszystkim użytkowników pod nazwą DUAL. Zbudowana jest z jednej kolumny DUMMY zdefiniowanej jako VARCHAR(1) i zawiera jeden wiersz o wartości X. Tablica DUAL jest bardzo przydatna w przypadku obliczeń stałych wartości. Zawsze zwraca jeden wiersz. SELECT TO_CHAR(TO_DATE('27-OCT-98', 'DD-MON-RR'),'YYYY') "Year" FROM DUAL; Year ---- 1998 SELECT CHR(67) CHR(65) CHR(84) "Dog" FROM DUAL; Dog --- CAT 38
Przetwarzanie danych Schematy PostgreSQL: Klaster bazy PostgreSQL może zawierać jedną lub więcej baz. Użytkownicy lub grupy użytkowników są dzielone pomiędzy cały klaster, natomiast nie są dzielone dane z poszczególnych baz danych. Baza danych może zawierać jeden lub więcej nazwanych schematów, w których znajdują się tablice. Schematy mogą zawierać inne obiekty np. typy danych, funkcje, operatory. Tak samo nazwane obiekty mogą być używane w różnych schematach bez żadnych ograniczeń. Zalety stosowania schematów: Pozwalają wielu użytkownikom na korzystanie z jednej bazy danych bez żadnych konfliktów Pozwalają organizować obiekty bazodanowe w łatwiejsze w zarządzaniu grupy 39
PostgreSQL: Tworzenie schematu Przetwarzanie danych Schematy CREATE SCHEMA schemaname AUTHORIZATION username; Dostęp do obiektów: database.schema.table Tworzenie tablic w schemacie CREATE TABLE myschema.mytable (... ); Domyślny schemat publiczny: CREATE TABLE products (... ); lub CREATE TABLE public.products (... ); 40
Przetwarzanie danych Schematy Oracle: Oracle rozpoznaje obiekty, które są powiązane z poszczególnymi schematami lub obiekty, które nie należą wyłącznie do danego schematu. Schemat jest własnością użytkownika o tej samej nazwie. Do każdego użytkownika należy tylko jeden schemat. Dostęp do obiektów baz: schema.object.part@dblink 41
Przetwarzanie danych Schematy Oracle: CREATE SCHEMA AUTHORIZATION oe CREATE TABLE new_product (color VARCHAR2(10) PRIMARY KEY, quantity NUMBER) CREATE VIEW new_product_view AS SELECT color, quantity FROM new_product WHERE color = 'RED' GRANT select ON new_product_view TO hr; Polecenie CREATE SCHEMA właściwie nie tworzy schematu, gdyż jest on domyślnie tworzony podczas tworzenia użytkownika (CREATE USER). Za pomocą tego polecenia możemy stworzyć wiele tablic oraz widoków oraz nadać uprawnienia dla tych obiektów innym użytkownikom. 42
Wyzwalacze Wyzwalacze bazodanowe to zazwyczaj krótkie programy, Które reagują na operacje na tabelach tej bazy. PostgreSQL: CREATE TRIGGER name { BEFORE AFTER } { event [ OR... ] } ON table [ FOR [ EACH ] { ROW STATEMENT } ] EXECUTE PROCEDURE funcname ( arguments ) CREATE TRIGGER tworzy nowy trigger dla danej tablicy, który wywołuje procedurę określoną przez nazwę funcname w przypadku wystąpienia zdarzenia event. Procedury wywoływane przez trigger y można tworzyć w następujących językach: PL/pgSQL, PL/Tcl, PL/Perl, PL/Pyton oraz C. 43
Wyzwalacze PostgreSQL: Parametry: name nazwa nowego trigger a unikalna dla danej tablicy. W przypadku wielu trigger ów zdefiniowanych dla tego samego zdarzenia, są one wywoływane według kolejności alfabetycznej. BEFORE AFTER określają czy funkcja będzie wywoływana przed zdarzeniem go wywołującym czy po. BEFORE oznacza, że wywołanie następuje przed sprawdzeniem ograniczeń oraz wykonaniem INSERT, UPDATE lub DELETE. Możliwe jest pominięcie lub zmiana aktualnie wstawianego wiersza dla operacji INSERT lub UPDATE. AFTER oznacza wywołanie funkcji po sprawdzeniu ograniczeń oraz zakończeniu INSERT, UPDATE lub DELETE. Zmiany wywołane przez ostatnią instrukcję INSERT, UPDATE, DELETE są dostępne dla funkcji trigger a. 44
Wyzwalacze PostgreSQL: Parametry: event jedno z INSERT, UPDATE, DELETE lub wiele oddzielonych operatorem OR. table tablica dla której tworzony jest trigger. FOR EACH ROW wykonywany dla każdego wiersza objętego danym zdarzeniem. FOR EACH STATEMENT wykonywany tyko raz dla danego zdarzenia (domyślnie). Wywoływany również w przypadku, gdy nastąpiła modyfikacja zerowej ilości wierszy. funcname nazwa procedury, która jest wywoływana przez trigger nie przyjmująca domyślnie żadnych parametrów oraz zwracająca typ trigger. Opcjonalna lista argumentów oddzielona przecinkami jest udostępniania do funkcji gdy trigger jest wywoływany. Parametry są konwertowane na stałe znakowe. 45
Wyzwalacze PostgreSQL: Zgodność ze standardem SQL: PostgreSQL nie pozwala na wywoływanie trigger ów w związku z aktualizacją konkretnej kolumny AFTER UPDATE OF col1, col2 SQL powala na definiowanie aliasów dla starego i nowego wiersza tabeli używanych w definicji akcji triggera. CREATE TRIGGER... ON tablename REFERENCING OLD ROW AS somename NEW ROW AS othername...). Ze względu na fakt, iż procedury triggerów w PostgreSQL mogą być pisane w różnych językach, dostęp do danych jest specyficzny dla danego języka. 46
Wyzwalacze PostgreSQL: Zgodność ze standardem SQL: PostgreSQL pozwala jedynie na wykonanie zdefiniowanej w akcji trigger a funkcji. Standard natomiast zezwala na wykonanie licznych instrukcji SQL np. CREATE TABLE. Standard SQL określa kolejność wykonywania wielu trigger ów w kolejności ich utworzenia, natomiast PostgreSQL przyjmuje kolejność alfabetyczną. PostgreSQL umożliwia wykonywanie wielu akcji w jednym trigger ze przy użyciu operatora OR, co jest rozszerzeniem standardu SQL. 47
Wyzwalacze PostgreSQL: ALTER TRIGGER name ON table RENAME TO newname RENAME -służy do zmiany nazwy istniejącego trigger a. Aby możliwa była ta operacja użytkownik musi być właścicielem tablicy, do której przypisany jest trigger a. ALTER TRIGGER jest rozszerzeniem standardu SQL. DROP TRIGGER name ON table [ CASCADE RESTRICT ] CASCADE automatycznie usuwa obiekty zależne od trigger a RESTRICT odmawia usunięcia trigger a w przypadku istnienia obiektu zależnego od trigger a (domyślnie). 48
Wyzwalacze Oracle: CREATE [OR REPLACE] TRIGGER [schema.]trigger {BEFORE AFTER INSTEAD OF} {DELETE INSERT UPDATE [OF column [, column]...]} [OR {DELETE INSERT UPDATE [OF column [, column]...]}]... ON [schema.]{table view} [ [REFERENCING { OLD [AS] old [NEW [AS] new][parent [AS] parent] NEW [AS] new [OLD [AS] old][parent [AS] parent] PARENT [AS] parent [OLD [AS] old][new [AS] new]} ] FOR EACH ROW [WHEN (condition)] ] pl/sql_block call_procedure_statement Wewnątrz wyzwalacza typu ROW mamy dostęp do starej i nowej wartości wiersza. Tzw. correlation names istnieją dla każdej modyfikowanej kolumny. Kwantyfikatory pozwalające się odnosić do tych wartości to NEW i OLD. 49
Wyzwalacze Oracle: BEFORE -Nie można używać BEFORE trigger na widoku Można zapisywać do :NEW, ale nie można do :OLD AFTER -Nie można używać AFTER trigger na widoku Nie można zapisywać ani do :OLD ani do :NEW INSTEAD OF -opcja ta umożliwia transparentną metodę modyfikacji danych w widoku, które nie mogą być modyfikowane bezpośrednio. Te wyzwalacze uruchamiane są zamiast zwykłych operacji INSERT lub UPDATE, które nie są możliwe do wykonania na widoku. Domyślnie wyzwalacze INSTEAD OF są uruchamiane dla każdego wiersza FOR EACH ROW. Możliwy jest odczyt zarówno :OLD oraz :NEW, ale niemożliwy jest ich zapis. REFERENCING -opcja ta została wprowadzona, aby uniknąć konfliktów pomiędzy ciałem wyzwalacza, a kolumnami, które mogą nazywać się OLD lub NEW. 50
Wyzwalacze Oracle: CREATE VIEW order_info AS SELECT c.customer_id, c.cust_last_name, c.cust_first_name, o.order_id, o.order_date, o.order_status FROM customers c, orders o WHERE c.customer_id = o.customer_id; CREATE OR REPLACE TRIGGER order_info_insert INSTEAD OF INSERT ON order_info DECLARE duplicate_info EXCEPTION; PRAGMA EXCEPTION_INIT (duplicate_info, -00001); BEGIN INSERT INTO customers (customer_id, cust_last_name, cust_first_name) VALUES ( :new.customer_id, :new.cust_last_name, :new.cust_first_name); INSERT INTO orders (order_id, order_date, customer_id) VALUES ( :new.order_id, :new.order_date, :new.customer_id); EXCEPTION WHEN duplicate_info THEN RAISE_APPLICATION_ERROR ( num=> -20107, msg=> 'Duplicate customer or order ID'); END order_info_insert; 51
Wyzwalacze Oracle: ALTER TRIGGER [schema.]trigger {DISABLE ENABLE} {RENAME to name } {COMPILE [DEBUG] [COMPILER_PARAMETERS] [REUSE SETTINGS]}; COMPILE - pozwala na jawną kompilację ciała trigger a po wcześniejszej kompilacji obiektów, od których zależy. Kompilacja ta pozwala na wcześniejsze wykrycie błędów niż podczas kompilacji uruchomieniowej. REUSE SETTINGS - pozwala zachować wyspecyfikowane parametry kompilatora sprzed uruchomienia kompilacji dla danego trigger a z jego własnymi parametrami. DROP TRIGGER [schema.]trigger; 52
Perspektywy / Widoki PostgreSQL: CREATE [ OR REPLACE ] [ TEMP TEMPORARY ] VIEW name [ ( column_name [,...] ) ] AS query CREATE VIEW definiuje perspektywę z zapytania. Zapytanie na podstawie, którego tworzona jest perspektywa jest wykonywane każdorazowo, gdy następuje odwołanie do niej w jakimkolwiek zapytaniu. TEMPORARY lub TEMP - tworzy perspektywę tymczasową, która jest usuwana wraz z zakończeniem aktualnej sesji. W przypadku, gdy tworzona jest perspektywa do tablic tymczasowych, domyślnie jest ona tymczasowa. column_name opcjonalna lista nazw kolumn perspektywy. query zapytanie, które udostępnia wybrane kolumny i wiersze perspektywie. 53
Perspektywy / Widoki PostgreSQL: Zgodność ze standardem SQL Standard SQL specyfikuje dodatkowe opcje dla CREATE VIEW CREATE VIEW name [ ( column_name [,...] ) ] AS query [ WITH [ CASCADED LOCAL ] CHECK OPTION ] CHECK OPTION używany przy perspektywach aktualizowalnych. Powoduje, że w przypadku użycia komend INSERT lub UPDATE wprowadzane dane są sprawdzane z warunkami tworzącymi perspektywę. LOCAL sprawdza integralność danej perspektywy. CASCADED sprawdza integralność perspektywy oraz perspektyw zależnych (domyślnie). 54
Perspektywy / Widoki PostgreSQL: DROP VIEW name [,...] [ CASCADE RESTRICT ] CASCADE automatycznie usuwa obiekty zależne od perspektywy (inne perspektywy) RESTRICT zapobiega usunięciu perspektywy w przypadku, gdy istnieją inne obiekty zależne (domyślnie). Standard SQL zezwala jedynie na usunięcie tylko jednej perspektywy przy pomocy pojedynczej komendy. 55
Perspektywy / Widoki Oracle: CREATE [OR REPLACE] [FORCE NOFORCE] VIEW [schema.]view [(alias,...) inline_constraint(s)] [out_of_line_constraint(s)] [XMLType_view_clause] AS subquery options options: WITH READ ONLY WITH CHECK OPTION [CONSTRAINT constraint] XMLType_view_clause: OF XMLTYPE [XMLSCHEMA XMLSchema_URL] ELEMENT element WITH OBJECT IDENTIFIER {DEFAULT (expr,...)} OF XMLTYPE [XMLSCHEMA XMLSchema_URL] ELEMENT XMLSchema_URL#element WITH OBJECT IDENTIFIER {DEFAULT (expr,...)} 56
Perspektywy / Widoki Oracle: REPLACE trigger y INSTEAD OF zdefiniowane dla widoku są usuwane gdy widok jest tworzony ponownie. W przypadku, gdy zmaterializowane widoki są zależne od widoku, wtedy zostają oznaczone jako UNUSABLE i wymagają pełnego odświeżenia danych. UNUSABLE nie mogą być używane ani odświeżane, aż nie zostaną ponownie skompilowane. FORCE ustawienie, które specyfikuje widok tworzony bez względu czy tablice bazowe istnieją oraz czy właściciel schematu zawierającego widok posiada do nich uprawnienia. W przypadku gdy definicja widoku zawiera ograniczenia odnoszące się do nieistniejących kolumn tabeli, widok nie zostanie stworzony. NO FORCE (domyślne) ustawienie, które specyfikuje widok tworzony wyłącznie na istniejących tablicach bazowych oraz gdy właściciel schematu zawierającego widok posiada do nich uprawnienia. 57
Perspektywy / Widoki Oracle: XMLType_view_clause - klauzuli tej używamy w przypadku tworzenia widoków XMLType, które wyświetlają dane z tablic bazujących na typie XMLType. subquery options: WITH READ ONLY -specyfikuje, że widok lub tablica jest tylko do odczytu. WITH CHECK OPTION - specyfikuje, że baza zabrania jakichkolwiek zmian w tablicach lub widokach, które mogą generować nowe wiersze a nie są zawarte w podzapytaniu. CONSTRAINT constraint - specyfikuje nazwę ograniczenia CHECK OPTION. DROP VIEW [schema.]view [CASCADE CONSTRAINTS] 58
Widoki zmaterializowane Oracle: Widok zmaterializowany jest obiektem bazy danych zawierającym rezultat zapytania. Aby stworzyć widok zmaterializowany na własnym schemacie należy: posiadać uprawnienia tworzenia zmaterializowanego widoku oraz tablic. posiadać dostęp do macierzystych tablic, których nie jesteśmy właścicielami, a które są wykorzystywane do tworzenia tego widoku. CREATE MATERIALIZED VIEW [schema.]materialized_view [BUILD {IMMEDIATE DEFFERED }] [REFRESH { FAST COMPLETE FORCE }] [ON COMMIT ON DEMAND] [WITH {PRIMARY KEY ROWID}] [START WITH NEXT] AS SELECT ; 59
Widoki zmaterializowane Oracle: BUILD określa kiedy ma zostać wypełniony widok zmaterializowany: IMMEDIATE - parametr domyślny, określający natychmiastowe wypełnienie widoku DEFERRED -określa wypełnienie widoku podczas pierwszej operacji odświeżania REFRESH: FAST odświeżanie przyrostowe, uaktualnienie o zmiany w tablicy macierzystej, dodatkowo musi istnieć MATERIALIZED VIEW LOG dla tablicy macierzystej COMPLETE pełne odświeżanie, wykonując zapytanie zmaterializowanego widoku FORCE domyślny parametr, baza wykonuje odświeżanie FAST jeżeli jest możliwe, a jeśli nie to COMPLETE. 60